data_management.doxy 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285
  1. /*
  2. * This file is part of the StarPU Handbook.
  3. * Copyright (C) 2009--2011 Universit@'e de Bordeaux 1
  4. * Copyright (C) 2010, 2011, 2012, 2013, 2014 Centre National de la Recherche Scientifique
  5. * Copyright (C) 2011, 2012 Institut National de Recherche en Informatique et Automatique
  6. * See the file version.doxy for copying conditions.
  7. */
  8. /*! \defgroup API_Data_Management Data Management
  9. \brief This section describes the data management facilities provided
  10. by StarPU. We show how to use existing data interfaces in \ref
  11. API_Data_Interfaces, but developers can design their own data interfaces if
  12. required.
  13. \typedef starpu_data_handle_t
  14. \ingroup API_Data_Management
  15. StarPU uses ::starpu_data_handle_t as an opaque handle to
  16. manage a piece of data. Once a piece of data has been registered to
  17. StarPU, it is associated to a ::starpu_data_handle_t which keeps track
  18. of the state of the piece of data over the entire machine, so that we
  19. can maintain data consistency and locate data replicates for instance.
  20. \enum starpu_data_access_mode
  21. \ingroup API_Data_Management
  22. This datatype describes a data access mode.
  23. \var starpu_data_access_mode::STARPU_NONE
  24. \ingroup API_Data_Management
  25. TODO
  26. \var starpu_data_access_mode::STARPU_R
  27. \ingroup API_Data_Management
  28. read-only mode.
  29. \var starpu_data_access_mode::STARPU_W
  30. \ingroup API_Data_Management
  31. write-only mode.
  32. \var starpu_data_access_mode::STARPU_RW
  33. \ingroup API_Data_Management
  34. read-write mode. This is equivalent to ::STARPU_R|::STARPU_W
  35. \var starpu_data_access_mode::STARPU_SCRATCH
  36. \ingroup API_Data_Management
  37. A temporary buffer is allocated for the task, but StarPU does not
  38. enforce data consistency---i.e. each device has its own buffer,
  39. independently from each other (even for CPUs), and no data transfer is
  40. ever performed. This is useful for temporary variables to avoid
  41. allocating/freeing buffers inside each task. Currently, no behavior is
  42. defined concerning the relation with the ::STARPU_R and ::STARPU_W modes
  43. and the value provided at registration --- i.e., the value of the
  44. scratch buffer is undefined at entry of the codelet function. It is
  45. being considered for future extensions at least to define the initial
  46. value. For now, data to be used in ::STARPU_SCRATCH mode should be
  47. registered with node <c>-1</c> and a <c>NULL</c> pointer, since the
  48. value of the provided buffer is simply ignored for now.
  49. \var starpu_data_access_mode::STARPU_REDUX
  50. \ingroup API_Data_Management
  51. todo
  52. \var starpu_data_access_mode::STARPU_COMMUTE
  53. \ingroup API_Data_Management
  54. In addition to that, ::STARPU_COMMUTE can be passed along ::STARPU_W
  55. or ::STARPU_RW to express that StarPU can let tasks commute, which is
  56. useful e.g. when bringing a contribution into some data, which can be
  57. done in any order (but still require sequential consistency against
  58. reads or non-commutative writes).
  59. @name Basic Data Management API
  60. \ingroup API_Data_Management
  61. Data management is done at a high-level in StarPU: rather than
  62. accessing a mere list of contiguous buffers, the tasks may manipulate
  63. data that are described by a high-level construct which we call data
  64. interface.
  65. An example of data interface is the "vector" interface which describes
  66. a contiguous data array on a spefic memory node. This interface is a
  67. simple structure containing the number of elements in the array, the
  68. size of the elements, and the address of the array in the appropriate
  69. address space (this address may be invalid if there is no valid copy
  70. of the array in the memory node). More informations on the data
  71. interfaces provided by StarPU are given in \ref API_Data_Interfaces.
  72. When a piece of data managed by StarPU is used by a task, the task
  73. implementation is given a pointer to an interface describing a valid
  74. copy of the data that is accessible from the current processing unit.
  75. Every worker is associated to a memory node which is a logical
  76. abstraction of the address space from which the processing unit gets
  77. its data. For instance, the memory node associated to the different
  78. CPU workers represents main memory (RAM), the memory node associated
  79. to a GPU is DRAM embedded on the device. Every memory node is
  80. identified by a logical index which is accessible from the
  81. function starpu_worker_get_memory_node(). When registering a piece of
  82. data to StarPU, the specified memory node indicates where the piece of
  83. data initially resides (we also call this memory node the home node of
  84. a piece of data).
  85. \fn void starpu_data_register(starpu_data_handle_t *handleptr, unsigned home_node, void *data_interface, struct starpu_data_interface_ops *ops)
  86. \ingroup API_Data_Management
  87. Register a piece of data into the handle located at the
  88. \p handleptr address. The \p data_interface buffer contains the initial
  89. description of the data in the \p home_node. The \p ops argument is a
  90. pointer to a structure describing the different methods used to
  91. manipulate this type of interface. See starpu_data_interface_ops for
  92. more details on this structure.
  93. If \p home_node is -1, StarPU will automatically allocate the memory when
  94. it is used for the first time in write-only mode. Once such data
  95. handle has been automatically allocated, it is possible to access it
  96. using any access mode.
  97. Note that StarPU supplies a set of predefined types of interface (e.g.
  98. vector or matrix) which can be registered by the means of helper
  99. functions (e.g. starpu_vector_data_register() or
  100. starpu_matrix_data_register()).
  101. \fn void starpu_data_register_same(starpu_data_handle_t *handledst, starpu_data_handle_t handlesrc)
  102. \ingroup API_Data_Management
  103. Register a new piece of data into the handle \p handledst with the
  104. same interface as the handle \p handlesrc.
  105. \fn void starpu_data_unregister(starpu_data_handle_t handle)
  106. \ingroup API_Data_Management
  107. This function unregisters a data handle from StarPU. If the
  108. data was automatically allocated by StarPU because the home node was
  109. -1, all automatically allocated buffers are freed. Otherwise, a valid
  110. copy of the data is put back into the home node in the buffer that was
  111. initially registered. Using a data handle that has been unregistered
  112. from StarPU results in an undefined behaviour. In case we do not need
  113. to update the value of the data in the home node, we can use
  114. the function starpu_data_unregister_no_coherency() instead.
  115. \fn void starpu_data_unregister_no_coherency(starpu_data_handle_t handle)
  116. \ingroup API_Data_Management
  117. This is the same as starpu_data_unregister(), except that
  118. StarPU does not put back a valid copy into the home node, in the
  119. buffer that was initially registered.
  120. \fn void starpu_data_unregister_submit(starpu_data_handle_t handle)
  121. \ingroup API_Data_Management
  122. Destroy the data handle once it is not needed anymore by any
  123. submitted task. No coherency is assumed.
  124. \fn void starpu_data_invalidate(starpu_data_handle_t handle)
  125. \ingroup API_Data_Management
  126. Destroy all replicates of the data handle immediately. After
  127. data invalidation, the first access to the handle must be performed in
  128. write-only mode. Accessing an invalidated data in read-mode results in
  129. undefined behaviour.
  130. \fn void starpu_data_invalidate_submit(starpu_data_handle_t handle)
  131. \ingroup API_Data_Management
  132. Submits invalidation of the data handle after completion of
  133. previously submitted tasks.
  134. \fn void starpu_data_set_wt_mask(starpu_data_handle_t handle, uint32_t wt_mask)
  135. \ingroup API_Data_Management
  136. This function sets the write-through mask of a given data (and
  137. its children), i.e. a bitmask of nodes where the data should be always
  138. replicated after modification. It also prevents the data from being
  139. evicted from these nodes when memory gets scarse. When the data is
  140. modified, it is automatically transfered into those memory node. For
  141. instance a <c>1<<0</c> write-through mask means that the CUDA workers
  142. will commit their changes in main memory (node 0).
  143. \fn int starpu_data_prefetch_on_node(starpu_data_handle_t handle, unsigned node, unsigned async)
  144. \ingroup API_Data_Management
  145. Issue a prefetch request for a given data to a given node, i.e.
  146. requests that the data be replicated to the given node, so that it is
  147. available there for tasks. If the \p async parameter is 0, the call will
  148. block until the transfer is achieved, else the call will return as
  149. soon as the request is scheduled (which may however have to wait for a
  150. task completion).
  151. \fn starpu_data_handle_t starpu_data_lookup(const void *ptr)
  152. \ingroup API_Data_Management
  153. Return the handle corresponding to the data pointed to by the \p ptr host pointer.
  154. \fn int starpu_data_request_allocation(starpu_data_handle_t handle, unsigned node)
  155. \ingroup API_Data_Management
  156. Explicitly ask StarPU to allocate room for a piece of data on
  157. the specified memory node.
  158. \fn void starpu_data_query_status(starpu_data_handle_t handle, int memory_node, int *is_allocated, int *is_valid, int *is_requested)
  159. \ingroup API_Data_Management
  160. Query the status of \p handle on the specified \p memory_node.
  161. \fn void starpu_data_advise_as_important(starpu_data_handle_t handle, unsigned is_important)
  162. \ingroup API_Data_Management
  163. This function allows to specify that a piece of data can be
  164. discarded without impacting the application.
  165. \fn void starpu_data_set_reduction_methods(starpu_data_handle_t handle, struct starpu_codelet *redux_cl, struct starpu_codelet *init_cl)
  166. \ingroup API_Data_Management
  167. This sets the codelets to be used for \p handle when it is
  168. accessed in the mode ::STARPU_REDUX. Per-worker buffers will be initialized with
  169. the codelet \p init_cl, and reduction between per-worker buffers will be
  170. done with the codelet \p redux_cl.
  171. \fn struct starpu_data_interface_ops* starpu_data_get_interface_ops(starpu_data_handle_t handle)
  172. \ingroup API_Data_Management
  173. todo
  174. @name Access registered data from the application
  175. \ingroup API_Data_Management
  176. \fn int starpu_data_acquire(starpu_data_handle_t handle, enum starpu_data_access_mode mode)
  177. \ingroup API_Data_Management
  178. The application must call this function prior to accessing
  179. registered data from main memory outside tasks. StarPU ensures that
  180. the application will get an up-to-date copy of the data in main memory
  181. located where the data was originally registered, and that all
  182. concurrent accesses (e.g. from tasks) will be consistent with the
  183. access mode specified in the mode argument. starpu_data_release() must
  184. be called once the application does not need to access the piece of
  185. data anymore. Note that implicit data dependencies are also enforced
  186. by starpu_data_acquire(), i.e. starpu_data_acquire() will wait for all
  187. tasks scheduled to work on the data, unless they have been disabled
  188. explictly by calling starpu_data_set_default_sequential_consistency_flag() or
  189. starpu_data_set_sequential_consistency_flag(). starpu_data_acquire() is a
  190. blocking call, so that it cannot be called from tasks or from their
  191. callbacks (in that case, starpu_data_acquire() returns <c>-EDEADLK</c>). Upon
  192. successful completion, this function returns 0.
  193. \fn int starpu_data_acquire_cb(starpu_data_handle_t handle, enum starpu_data_access_mode mode, void (*callback)(void *), void *arg)
  194. \ingroup API_Data_Management
  195. Asynchronous equivalent of starpu_data_acquire(). When the data
  196. specified in \p handle is available in the appropriate access
  197. mode, the \p callback function is executed. The application may access
  198. the requested data during the execution of this \p callback. The \p callback
  199. function must call starpu_data_release() once the application does not
  200. need to access the piece of data anymore. Note that implicit data
  201. dependencies are also enforced by starpu_data_acquire_cb() in case they
  202. are not disabled. Contrary to starpu_data_acquire(), this function is
  203. non-blocking and may be called from task callbacks. Upon successful
  204. completion, this function returns 0.
  205. \fn int starpu_data_acquire_cb_sequential_consistency(starpu_data_handle_t handle, enum starpu_data_access_mode mode, void (*callback)(void *), void *arg, int sequential_consistency)
  206. \ingroup API_Data_Management
  207. Equivalent of starpu_data_acquire_cb() with the possibility of enabling or disabling data dependencies.
  208. When the data specified in \p handle is available in the appropriate access
  209. mode, the \p callback function is executed. The application may access
  210. the requested data during the execution of this \p callback. The \p callback
  211. function must call starpu_data_release() once the application does not
  212. need to access the piece of data anymore. Note that implicit data
  213. dependencies are also enforced by starpu_data_acquire_cb_sequential_consistency() in case they
  214. are not disabled specifically for the given \p handle or by the parameter \p sequential_consistency.
  215. Similarly to starpu_data_acquire_cb(), this function is
  216. non-blocking and may be called from task callbacks. Upon successful
  217. completion, this function returns 0.
  218. \fn int starpu_data_acquire_on_node(starpu_data_handle_t handle, unsigned node, enum starpu_data_access_mode mode)
  219. \ingroup API_Data_Management
  220. This is the same as starpu_data_acquire(), except that the data
  221. will be available on the given memory node instead of main memory.
  222. \fn int starpu_data_acquire_on_node_cb(starpu_data_handle_t handle, unsigned node, enum starpu_data_access_mode mode, void (*callback)(void *), void *arg)
  223. \ingroup API_Data_Management
  224. This is the same as starpu_data_acquire_cb(), except that the
  225. data will be available on the given memory node instead of main
  226. memory.
  227. \fn int starpu_data_acquire_on_node_cb_sequential_consistency(starpu_data_handle_t handle, unsigned node, enum starpu_data_access_mode mode, void (*callback)(void *), void *arg, int sequential_consistency)
  228. \ingroup API_Data_Management
  229. This is the same as starpu_data_acquire_cb_sequential_consistency(), except that the
  230. data will be available on the given memory node instead of main
  231. memory.
  232. \def STARPU_DATA_ACQUIRE_CB(handle, mode, code)
  233. \ingroup API_Data_Management
  234. STARPU_DATA_ACQUIRE_CB() is the same as starpu_data_acquire_cb(),
  235. except that the code to be executed in a callback is directly provided
  236. as a macro parameter, and the data \p handle is automatically released
  237. after it. This permits to easily execute code which depends on the
  238. value of some registered data. This is non-blocking too and may be
  239. called from task callbacks.
  240. \fn void starpu_data_release(starpu_data_handle_t handle)
  241. \ingroup API_Data_Management
  242. This function releases the piece of data acquired by the
  243. application either by starpu_data_acquire() or by
  244. starpu_data_acquire_cb().
  245. \fn void starpu_data_release_on_node(starpu_data_handle_t handle, unsigned node)
  246. \ingroup API_Data_Management
  247. This is the same as starpu_data_release(), except that the data
  248. will be available on the given memory \p node instead of main memory.
  249. */