data_request.h 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136
  1. /* StarPU --- Runtime system for heterogeneous multicore architectures.
  2. *
  3. * Copyright (C) 2009, 2010, 2013 Université de Bordeaux 1
  4. * Copyright (C) 2010, 2011, 2013 Centre National de la Recherche Scientifique
  5. *
  6. * StarPU is free software; you can redistribute it and/or modify
  7. * it under the terms of the GNU Lesser General Public License as published by
  8. * the Free Software Foundation; either version 2.1 of the License, or (at
  9. * your option) any later version.
  10. *
  11. * StarPU is distributed in the hope that it will be useful, but
  12. * WITHOUT ANY WARRANTY; without even the implied warranty of
  13. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  14. *
  15. * See the GNU Lesser General Public License in COPYING.LGPL for more details.
  16. */
  17. #ifndef __DATA_REQUEST_H__
  18. #define __DATA_REQUEST_H__
  19. #include <semaphore.h>
  20. #include <datawizard/coherency.h>
  21. #include <datawizard/copy_driver.h>
  22. #include <common/list.h>
  23. #include <common/starpu_spinlock.h>
  24. struct _starpu_data_replicate;
  25. struct _starpu_callback_list
  26. {
  27. void (*callback_func)(void *);
  28. void *callback_arg;
  29. struct _starpu_callback_list *next;
  30. };
  31. /* This represents a data request, i.e. we want some data to get transferred
  32. * from a source to a destination. */
  33. LIST_TYPE(_starpu_data_request,
  34. struct _starpu_spinlock lock;
  35. unsigned refcnt;
  36. starpu_data_handle_t handle;
  37. struct _starpu_data_replicate *src_replicate;
  38. struct _starpu_data_replicate *dst_replicate;
  39. /* Which memory node will actually perform the transfer.
  40. * This is important in the CUDA/OpenCL case, where only the worker for
  41. * the node can make the CUDA/OpenCL calls.
  42. */
  43. unsigned handling_node;
  44. /*
  45. * What the destination node wants to do with the data: write to it,
  46. * read it, or read and write to it. Only in the two latter cases we
  47. * need an actual transfer, the first only needs an allocation.
  48. *
  49. * With mapped buffers, an additional case is mode = 0, which means
  50. * unmapping the buffer.
  51. */
  52. enum starpu_data_access_mode mode;
  53. /* Elements needed to make the transfer asynchronous */
  54. struct _starpu_async_channel async_channel;
  55. /* Whether the transfer is completed. */
  56. unsigned completed;
  57. /* Whether this is just a prefetch request */
  58. unsigned prefetch;
  59. /* The value returned by the transfer function */
  60. int retval;
  61. /* The request will not actually be submitted until there remains
  62. * dependencies. */
  63. unsigned ndeps;
  64. /* in case we have a chain of request (eg. for nvidia multi-GPU), this
  65. * is the list of requests which are waiting for this one. */
  66. struct _starpu_data_request *next_req[STARPU_MAXNODES];
  67. /* The number of requests in next_req */
  68. unsigned next_req_count;
  69. struct _starpu_callback_list *callbacks;
  70. unsigned com_id;
  71. )
  72. /* Everyone that wants to access some piece of data will post a request.
  73. * Not only StarPU internals, but also the application may put such requests */
  74. LIST_TYPE(_starpu_data_requester,
  75. /* what kind of access is requested ? */
  76. enum starpu_data_access_mode mode;
  77. /* applications may also directly manipulate data */
  78. unsigned is_requested_by_codelet;
  79. /* in case this is a codelet that will do the access */
  80. struct _starpu_job *j;
  81. unsigned buffer_index;
  82. /* if this is more complicated ... (eg. application request)
  83. * NB: this callback is not called with the lock taken !
  84. */
  85. void (*ready_data_callback)(void *argcb);
  86. void *argcb;
  87. )
  88. void _starpu_init_data_request_lists(void);
  89. void _starpu_deinit_data_request_lists(void);
  90. void _starpu_post_data_request(struct _starpu_data_request *r, unsigned handling_node);
  91. void _starpu_handle_node_data_requests(unsigned src_node, unsigned may_alloc);
  92. void _starpu_handle_node_prefetch_requests(unsigned src_node, unsigned may_alloc);
  93. void _starpu_handle_pending_node_data_requests(unsigned src_node);
  94. void _starpu_handle_all_pending_node_data_requests(unsigned src_node);
  95. int _starpu_check_that_no_data_request_exists(unsigned node);
  96. struct _starpu_data_request *_starpu_create_data_request(starpu_data_handle_t handle,
  97. struct _starpu_data_replicate *src_replicate,
  98. struct _starpu_data_replicate *dst_replicate,
  99. unsigned handling_node,
  100. enum starpu_data_access_mode mode,
  101. unsigned ndeps,
  102. unsigned is_prefetch);
  103. int _starpu_wait_data_request_completion(struct _starpu_data_request *r, unsigned may_alloc);
  104. void _starpu_data_request_append_callback(struct _starpu_data_request *r,
  105. void (*callback_func)(void *),
  106. void *callback_arg);
  107. void _starpu_update_prefetch_status(struct _starpu_data_request *r);
  108. #endif // __DATA_REQUEST_H__