starpu_data.h 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620
  1. /* StarPU --- Runtime system for heterogeneous multicore architectures.
  2. *
  3. * Copyright (C) 2009-2021 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria
  4. *
  5. * StarPU is free software; you can redistribute it and/or modify
  6. * it under the terms of the GNU Lesser General Public License as published by
  7. * the Free Software Foundation; either version 2.1 of the License, or (at
  8. * your option) any later version.
  9. *
  10. * StarPU is distributed in the hope that it will be useful, but
  11. * WITHOUT ANY WARRANTY; without even the implied warranty of
  12. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  13. *
  14. * See the GNU Lesser General Public License in COPYING.LGPL for more details.
  15. */
  16. #ifndef __STARPU_DATA_H__
  17. #define __STARPU_DATA_H__
  18. #include <starpu.h>
  19. #ifdef __cplusplus
  20. extern "C"
  21. {
  22. #endif
  23. /**
  24. @defgroup API_Data_Management Data Management
  25. @brief Data management facilities provided by StarPU. We show how
  26. to use existing data interfaces in \ref API_Data_Interfaces, but
  27. developers can design their own data interfaces if required.
  28. @{
  29. */
  30. struct _starpu_data_state;
  31. /**
  32. StarPU uses ::starpu_data_handle_t as an opaque handle to manage a
  33. piece of data. Once a piece of data has been registered to StarPU,
  34. it is associated to a ::starpu_data_handle_t which keeps track of
  35. the state of the piece of data over the entire machine, so that we
  36. can maintain data consistency and locate data replicates for
  37. instance.
  38. */
  39. typedef struct _starpu_data_state* starpu_data_handle_t;
  40. /**
  41. Describe a StarPU data access mode
  42. Note: when adding a flag here, update
  43. _starpu_detect_implicit_data_deps_with_handle
  44. Note: other STARPU_* values in include/starpu_task_util.h
  45. */
  46. enum starpu_data_access_mode
  47. {
  48. STARPU_NONE=0, /**< todo */
  49. STARPU_R=(1<<0), /**< read-only mode */
  50. STARPU_W=(1<<1), /**< write-only mode */
  51. STARPU_RW=(STARPU_R|STARPU_W), /**< read-write mode. Equivalent to ::STARPU_R|::STARPU_W */
  52. STARPU_SCRATCH=(1<<2), /**< A temporary buffer is allocated
  53. for the task, but StarPU does not
  54. enforce data consistency---i.e. each
  55. device has its own buffer,
  56. independently from each other (even
  57. for CPUs), and no data transfer is
  58. ever performed. This is useful for
  59. temporary variables to avoid
  60. allocating/freeing buffers inside
  61. each task. Currently, no behavior is
  62. defined concerning the relation with
  63. the ::STARPU_R and ::STARPU_W modes
  64. and the value provided at
  65. registration --- i.e., the value of
  66. the scratch buffer is undefined at
  67. entry of the codelet function. It
  68. is being considered for future
  69. extensions at least to define the
  70. initial value. For now, data to be
  71. used in ::STARPU_SCRATCH mode should
  72. be registered with node -1 and a
  73. <c>NULL</c> pointer, since the value
  74. of the provided buffer is simply
  75. ignored for now.
  76. */
  77. STARPU_REDUX=(1<<3), /**< todo */
  78. STARPU_COMMUTE=(1<<4), /**< ::STARPU_COMMUTE can be passed
  79. along ::STARPU_W or ::STARPU_RW to
  80. express that StarPU can let tasks
  81. commute, which is useful e.g. when
  82. bringing a contribution into some
  83. data, which can be done in any order
  84. (but still require sequential
  85. consistency against reads or
  86. non-commutative writes).
  87. */
  88. STARPU_SSEND=(1<<5), /**< used in starpu_mpi_insert_task() to
  89. specify the data has to be sent using
  90. a synchronous and non-blocking mode
  91. (see starpu_mpi_issend())
  92. */
  93. STARPU_LOCALITY=(1<<6), /**< used to tell the scheduler which
  94. data is the most important for the
  95. task, and should thus be used to
  96. try to group tasks on the same core
  97. or cache, etc. For now only the ws
  98. and lws schedulers take this flag
  99. into account, and only when rebuild
  100. with \c USE_LOCALITY flag defined in
  101. the
  102. src/sched_policies/work_stealing_policy.c
  103. source code.
  104. */
  105. STARPU_MPI_REDUX=(1<<7), /**< Inter-node reduction only. Codelets
  106. contributing to these reductions should
  107. be registered with ::STARPU_RW | ::STARPU_COMMUTE
  108. access modes.
  109. When inserting these tasks through the
  110. MPI layer however, the access mode needs
  111. to be ::STARPU_MPI_REDUX. */
  112. STARPU_ACCESS_MODE_MAX=(1<<8) /**< The purpose of ::STARPU_ACCESS_MODE_MAX is to
  113. be the maximum of this enum. */
  114. };
  115. struct starpu_data_interface_ops;
  116. /**
  117. Set the name of the data, to be shown in various profiling tools.
  118. */
  119. void starpu_data_set_name(starpu_data_handle_t handle, const char *name);
  120. /**
  121. Set the coordinates of the data, to be shown in various profiling
  122. tools. \p dimensions is the size of the \p dims array. This can be
  123. for instance the tile coordinates within a big matrix.
  124. */
  125. void starpu_data_set_coordinates_array(starpu_data_handle_t handle, unsigned dimensions, int dims[]);
  126. /**
  127. Set the coordinates of the data, to be shown in various profiling
  128. tools. \p dimensions is the number of subsequent \c int parameters.
  129. This can be for instance the tile coordinates within a big matrix.
  130. */
  131. void starpu_data_set_coordinates(starpu_data_handle_t handle, unsigned dimensions, ...);
  132. /**
  133. Get the coordinates of the data, as set by a previous call to
  134. starpu_data_set_coordinates_array() or starpu_data_set_coordinates()
  135. \p dimensions is the size of the \p dims array.
  136. This returns the actual number of returned coordinates.
  137. */
  138. unsigned starpu_data_get_coordinates_array(starpu_data_handle_t handle, unsigned dimensions, int dims[]);
  139. /**
  140. Unregister a data \p handle from StarPU. If the data was
  141. automatically allocated by StarPU because the home node was -1, all
  142. automatically allocated buffers are freed. Otherwise, a valid copy
  143. of the data is put back into the home node in the buffer that was
  144. initially registered. Using a data handle that has been
  145. unregistered from StarPU results in an undefined behaviour. In case
  146. we do not need to update the value of the data in the home node, we
  147. can use the function starpu_data_unregister_no_coherency() instead.
  148. */
  149. void starpu_data_unregister(starpu_data_handle_t handle);
  150. /**
  151. Similar to starpu_data_unregister(), except that StarPU does not
  152. put back a valid copy into the home node, in the buffer that was
  153. initially registered.
  154. */
  155. void starpu_data_unregister_no_coherency(starpu_data_handle_t handle);
  156. /**
  157. Destroy the data \p handle once it is no longer needed by any
  158. submitted task. No coherency is provided.
  159. This is not safe to call starpu_data_unregister_submit() on a handle that
  160. comes from the registration of a non-NULL application home buffer, since the
  161. moment when the unregistration will happen is unknown to the
  162. application. Only calling starpu_shutdown() allows to be sure that the data
  163. was really unregistered.
  164. */
  165. void starpu_data_unregister_submit(starpu_data_handle_t handle);
  166. /**
  167. Destroy all replicates of the data \p handle immediately. After
  168. data invalidation, the first access to \p handle must be performed
  169. in ::STARPU_W mode. Accessing an invalidated data in ::STARPU_R
  170. mode results in undefined behaviour.
  171. */
  172. void starpu_data_invalidate(starpu_data_handle_t handle);
  173. /**
  174. Submit invalidation of the data \p handle after completion of
  175. previously submitted tasks.
  176. */
  177. void starpu_data_invalidate_submit(starpu_data_handle_t handle);
  178. /**
  179. Specify that the data \p handle can be discarded without impacting
  180. the application.
  181. */
  182. void starpu_data_advise_as_important(starpu_data_handle_t handle, unsigned is_important);
  183. /**
  184. @name Access registered data from the application
  185. @{
  186. */
  187. /**
  188. This macro can be used to acquire data, but not require it to be
  189. available on a given node, only enforce R/W dependencies. This can
  190. for instance be used to wait for tasks which produce the data, but
  191. without requesting a fetch to the main memory.
  192. */
  193. #define STARPU_ACQUIRE_NO_NODE -1
  194. /**
  195. Similar to ::STARPU_ACQUIRE_NO_NODE, but will lock the data on all
  196. nodes, preventing them from being evicted for instance. This is
  197. mostly useful inside StarPU only.
  198. */
  199. #define STARPU_ACQUIRE_NO_NODE_LOCK_ALL -2
  200. /**
  201. The application must call this function prior to accessing
  202. registered data from main memory outside tasks. StarPU ensures that
  203. the application will get an up-to-date copy of \p handle in main
  204. memory located where the data was originally registered, and that
  205. all concurrent accesses (e.g. from tasks) will be consistent with
  206. the access mode specified with \p mode. starpu_data_release() must
  207. be called once the application no longer needs to access the piece
  208. of data. Note that implicit data dependencies are also enforced by
  209. starpu_data_acquire(), i.e. starpu_data_acquire() will wait for all
  210. tasks scheduled to work on the data, unless they have been disabled
  211. explictly by calling
  212. starpu_data_set_default_sequential_consistency_flag() or
  213. starpu_data_set_sequential_consistency_flag().
  214. starpu_data_acquire() is a blocking call, so that it cannot be
  215. called from tasks or from their callbacks (in that case,
  216. starpu_data_acquire() returns <c>-EDEADLK</c>). Upon successful
  217. completion, this function returns 0.
  218. */
  219. int starpu_data_acquire(starpu_data_handle_t handle, enum starpu_data_access_mode mode);
  220. /**
  221. Similar to starpu_data_acquire(), except that the data will be
  222. available on the given memory node instead of main memory.
  223. ::STARPU_ACQUIRE_NO_NODE and ::STARPU_ACQUIRE_NO_NODE_LOCK_ALL can
  224. be used instead of an explicit node number.
  225. */
  226. int starpu_data_acquire_on_node(starpu_data_handle_t handle, int node, enum starpu_data_access_mode mode);
  227. /**
  228. Asynchronous equivalent of starpu_data_acquire(). When the data
  229. specified in \p handle is available in the access \p mode, the \p
  230. callback function is executed. The application may access
  231. the requested data during the execution of \p callback. The \p callback
  232. function must call starpu_data_release() once the application no longer
  233. needs to access the piece of data. Note that implicit data
  234. dependencies are also enforced by starpu_data_acquire_cb() in case they
  235. are not disabled. Contrary to starpu_data_acquire(), this function is
  236. non-blocking and may be called from task callbacks. Upon successful
  237. completion, this function returns 0.
  238. */
  239. int starpu_data_acquire_cb(starpu_data_handle_t handle, enum starpu_data_access_mode mode, void (*callback)(void *), void *arg);
  240. /**
  241. Similar to starpu_data_acquire_cb(), except that the
  242. data will be available on the given memory node instead of main
  243. memory.
  244. ::STARPU_ACQUIRE_NO_NODE and ::STARPU_ACQUIRE_NO_NODE_LOCK_ALL can be
  245. used instead of an explicit node number.
  246. */
  247. int starpu_data_acquire_on_node_cb(starpu_data_handle_t handle, int node, enum starpu_data_access_mode mode, void (*callback)(void *), void *arg);
  248. /**
  249. Similar to starpu_data_acquire_cb() with the possibility of
  250. enabling or disabling data dependencies.
  251. When the data specified in \p handle is available in the access
  252. \p mode, the \p callback function is executed. The application may access
  253. the requested data during the execution of this \p callback. The \p callback
  254. function must call starpu_data_release() once the application no longer
  255. needs to access the piece of data. Note that implicit data
  256. dependencies are also enforced by starpu_data_acquire_cb_sequential_consistency() in case they
  257. are not disabled specifically for the given \p handle or by the parameter \p sequential_consistency.
  258. Similarly to starpu_data_acquire_cb(), this function is
  259. non-blocking and may be called from task callbacks. Upon successful
  260. completion, this function returns 0.
  261. */
  262. 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);
  263. /**
  264. Similar to starpu_data_acquire_cb_sequential_consistency(), except that the
  265. data will be available on the given memory node instead of main
  266. memory.
  267. ::STARPU_ACQUIRE_NO_NODE and ::STARPU_ACQUIRE_NO_NODE_LOCK_ALL can be used instead of an
  268. explicit node number.
  269. */
  270. int starpu_data_acquire_on_node_cb_sequential_consistency(starpu_data_handle_t handle, int node, enum starpu_data_access_mode mode, void (*callback)(void *), void *arg, int sequential_consistency);
  271. int starpu_data_acquire_on_node_cb_sequential_consistency_quick(starpu_data_handle_t handle, int node, enum starpu_data_access_mode mode, void (*callback)(void *), void *arg, int sequential_consistency, int quick);
  272. /**
  273. Similar to starpu_data_acquire_on_node_cb_sequential_consistency(),
  274. except that the \e pre_sync_jobid and \e post_sync_jobid parameters can be used
  275. to retrieve the jobid of the synchronization tasks. \e pre_sync_jobid happens
  276. just before the acquisition, and \e post_sync_jobid happens just after the
  277. release.
  278. callback_acquired is called when the data is acquired in terms of semantic,
  279. but the data is not fetched yet. It is given a pointer to the node, which it
  280. can modify if it wishes so.
  281. This is a very internal interface, subject to changes, do not use this.
  282. */
  283. int starpu_data_acquire_on_node_cb_sequential_consistency_sync_jobids(starpu_data_handle_t handle, int node, enum starpu_data_access_mode mode, void (*callback_acquired)(void *arg, int *node, enum starpu_data_access_mode mode), void (*callback)(void *arg), void *arg, int sequential_consistency, int quick, long *pre_sync_jobid, long *post_sync_jobid, int prio);
  284. /**
  285. The application can call this function instead of starpu_data_acquire() so as to
  286. acquire the data like starpu_data_acquire(), but only if all
  287. previously-submitted tasks have completed, in which case starpu_data_acquire_try()
  288. returns 0. StarPU will have ensured that the application will get an up-to-date
  289. copy of \p handle in main memory located where the data was originally
  290. registered. starpu_data_release() must be called once the application no longer
  291. needs to access the piece of data.
  292. */
  293. int starpu_data_acquire_try(starpu_data_handle_t handle, enum starpu_data_access_mode mode);
  294. /**
  295. Similar to starpu_data_acquire_try(), except that the
  296. data will be available on the given memory node instead of main
  297. memory.
  298. ::STARPU_ACQUIRE_NO_NODE and ::STARPU_ACQUIRE_NO_NODE_LOCK_ALL can be used instead of an
  299. explicit node number.
  300. */
  301. int starpu_data_acquire_on_node_try(starpu_data_handle_t handle, int node, enum starpu_data_access_mode mode);
  302. #ifdef __GCC__
  303. /**
  304. STARPU_DATA_ACQUIRE_CB() is the same as starpu_data_acquire_cb(),
  305. except that the code to be executed in a callback is directly provided
  306. as a macro parameter, and the data \p handle is automatically released
  307. after it. This permits to easily execute code which depends on the
  308. value of some registered data. This is non-blocking too and may be
  309. called from task callbacks.
  310. */
  311. # define STARPU_DATA_ACQUIRE_CB(handle, mode, code) do \
  312. { \ \
  313. void callback(void *arg) \
  314. { \
  315. code; \
  316. starpu_data_release(handle); \
  317. } \
  318. starpu_data_acquire_cb(handle, mode, callback, NULL); \
  319. } \
  320. while(0)
  321. #endif
  322. /**
  323. Release the piece of data acquired by the
  324. application either by starpu_data_acquire() or by
  325. starpu_data_acquire_cb().
  326. */
  327. void starpu_data_release(starpu_data_handle_t handle);
  328. /**
  329. Similar to starpu_data_release(), except that the data
  330. was made available on the given memory \p node instead of main memory.
  331. The \p node parameter must be exactly the same as the corresponding \c
  332. starpu_data_acquire_on_node* call.
  333. */
  334. void starpu_data_release_on_node(starpu_data_handle_t handle, int node);
  335. /**
  336. Partly release the piece of data acquired by the application either by
  337. starpu_data_acquire() or by starpu_data_acquire_cb(), switching the
  338. acquisition down to \p down_to_mode. For now, only releasing from STARPU_RW
  339. or STARPU_W acquisition down to STARPU_R is supported, or down to the same
  340. acquisition. STARPU_NONE can also be passed as \p down_to_mode, in which
  341. case this is equivalent to calling starpu_data_release().
  342. */
  343. void starpu_data_release_to(starpu_data_handle_t handle, enum starpu_data_access_mode down_to_mode);
  344. /**
  345. Similar to starpu_data_release_to(), except that the data
  346. was made available on the given memory \p node instead of main memory.
  347. The \p node parameter must be exactly the same as the corresponding \c
  348. starpu_data_acquire_on_node* call.
  349. */
  350. void starpu_data_release_to_on_node(starpu_data_handle_t handle, enum starpu_data_access_mode down_to_mode, int node);
  351. /** @} */
  352. /**
  353. This is an arbiter, which implements an advanced but centralized
  354. management of concurrent data accesses, see \ref
  355. ConcurrentDataAccess for the details.
  356. */
  357. typedef struct starpu_arbiter *starpu_arbiter_t;
  358. /**
  359. Create a data access arbiter, see \ref ConcurrentDataAccess for the
  360. details
  361. */
  362. starpu_arbiter_t starpu_arbiter_create(void) STARPU_ATTRIBUTE_MALLOC;
  363. /**
  364. Make access to \p handle managed by \p arbiter
  365. */
  366. void starpu_data_assign_arbiter(starpu_data_handle_t handle, starpu_arbiter_t arbiter);
  367. /**
  368. Destroy the \p arbiter . This must only be called after all data
  369. assigned to it have been unregistered.
  370. */
  371. void starpu_arbiter_destroy(starpu_arbiter_t arbiter);
  372. /**
  373. Explicitly ask StarPU to allocate room for a piece of data on
  374. the specified memory \p node.
  375. */
  376. int starpu_data_request_allocation(starpu_data_handle_t handle, unsigned node);
  377. /**
  378. Prefetch levels
  379. Data requests are ordered by priorities, but also by prefetching level,
  380. between data that a task wants now, and data that we will probably want
  381. "soon".
  382. */
  383. enum starpu_is_prefetch
  384. {
  385. /** A task really needs it now! */
  386. STARPU_FETCH = 0,
  387. /** A task will need it soon */
  388. STARPU_TASK_PREFETCH = 1,
  389. /** It is a good idea to have it asap */
  390. STARPU_PREFETCH = 2,
  391. /** Get this here when you have time to */
  392. STARPU_IDLEFETCH = 3,
  393. STARPU_NFETCH
  394. };
  395. /**
  396. Issue a fetch request for the data \p handle to \p node, i.e.
  397. requests that the data be replicated to the given node as soon as possible, so that it is
  398. available there for tasks. If \p async is 0, the call will
  399. block until the transfer is achieved, else the call will return immediately,
  400. after having just queued the request. In the latter case, the request will
  401. asynchronously wait for the completion of any task writing on the
  402. data.
  403. */
  404. int starpu_data_fetch_on_node(starpu_data_handle_t handle, unsigned node, unsigned async);
  405. /**
  406. Issue a prefetch request for the data \p handle to \p node, i.e.
  407. requests that the data be replicated to \p node when there is room for it, so that it is
  408. available there for tasks. If \p async is 0, the call will
  409. block until the transfer is achieved, else the call will return immediately,
  410. after having just queued the request. In the latter case, the request will
  411. asynchronously wait for the completion of any task writing on the
  412. data.
  413. */
  414. int starpu_data_prefetch_on_node(starpu_data_handle_t handle, unsigned node, unsigned async);
  415. int starpu_data_prefetch_on_node_prio(starpu_data_handle_t handle, unsigned node, unsigned async, int prio);
  416. /**
  417. Issue an idle prefetch request for the data \p handle to \p node, i.e.
  418. requests that the data be replicated to \p node, so that it is
  419. available there for tasks, but only when the bus is really idle. If \p async is 0, the call will
  420. block until the transfer is achieved, else the call will return immediately,
  421. after having just queued the request. In the latter case, the request will
  422. asynchronously wait for the completion of any task writing on the data.
  423. */
  424. int starpu_data_idle_prefetch_on_node(starpu_data_handle_t handle, unsigned node, unsigned async);
  425. int starpu_data_idle_prefetch_on_node_prio(starpu_data_handle_t handle, unsigned node, unsigned async, int prio);
  426. /**
  427. Check whether a valid copy of \p handle is currently available on
  428. memory node \p node (or a transfer request for getting so is ongoing).
  429. */
  430. unsigned starpu_data_is_on_node(starpu_data_handle_t handle, unsigned node);
  431. /**
  432. Advise StarPU that \p handle will not be used in the close future, and is
  433. thus a good candidate for eviction from GPUs. StarPU will thus write its value
  434. back to its home node when the bus is idle, and select this data in priority
  435. for eviction when memory gets low.
  436. */
  437. void starpu_data_wont_use(starpu_data_handle_t handle);
  438. /**
  439. Set the write-through mask of the data \p handle (and
  440. its children), i.e. a bitmask of nodes where the data should be always
  441. replicated after modification. It also prevents the data from being
  442. evicted from these nodes when memory gets scarse. When the data is
  443. modified, it is automatically transfered into those memory nodes. For
  444. instance a <c>1<<0</c> write-through mask means that the CUDA workers
  445. will commit their changes in main memory (node 0).
  446. */
  447. void starpu_data_set_wt_mask(starpu_data_handle_t handle, uint32_t wt_mask);
  448. /**
  449. @name Implicit Data Dependencies
  450. In this section, we describe how StarPU makes it possible to
  451. insert implicit task dependencies in order to enforce sequential data
  452. consistency. When this data consistency is enabled on a specific data
  453. handle, any data access will appear as sequentially consistent from
  454. the application. For instance, if the application submits two tasks
  455. that access the same piece of data in read-only mode, and then a third
  456. task that access it in write mode, dependencies will be added between
  457. the two first tasks and the third one. Implicit data dependencies are
  458. also inserted in the case of data accesses from the application.
  459. @{
  460. */
  461. /**
  462. Set the data consistency mode associated to a data handle. The
  463. consistency mode set using this function has the priority over the
  464. default mode which can be set with
  465. starpu_data_set_default_sequential_consistency_flag().
  466. */
  467. void starpu_data_set_sequential_consistency_flag(starpu_data_handle_t handle, unsigned flag);
  468. /**
  469. Get the data consistency mode associated to the data handle \p handle
  470. */
  471. unsigned starpu_data_get_sequential_consistency_flag(starpu_data_handle_t handle);
  472. /**
  473. Return the default sequential consistency flag
  474. */
  475. unsigned starpu_data_get_default_sequential_consistency_flag(void);
  476. /**
  477. Set the default sequential consistency flag. If a non-zero
  478. value is passed, a sequential data consistency will be enforced for
  479. all handles registered after this function call, otherwise it is
  480. disabled. By default, StarPU enables sequential data consistency. It
  481. is also possible to select the data consistency mode of a specific
  482. data handle with the function
  483. starpu_data_set_sequential_consistency_flag().
  484. */
  485. void starpu_data_set_default_sequential_consistency_flag(unsigned flag);
  486. /** @} */
  487. /**
  488. Set whether this data should be elligible to be evicted to disk
  489. storage (1) or not (0). The default is 1.
  490. */
  491. void starpu_data_set_ooc_flag(starpu_data_handle_t handle, unsigned flag);
  492. /**
  493. Get whether this data was set to be elligible to be evicted to disk
  494. storage (1) or not (0).
  495. */
  496. unsigned starpu_data_get_ooc_flag(starpu_data_handle_t handle);
  497. /**
  498. Query the status of \p handle on the specified \p memory_node.
  499. \p is_allocated tells whether memory was allocated there for the data.
  500. \p is_valid tells whether the actual value is available there.
  501. \p is_loading tells whether the actual value is getting loaded there.
  502. \p is_requested tells whether the actual value is requested to be loaded
  503. there by some fetch/prefetch/idlefetch request.
  504. */
  505. void starpu_data_query_status2(starpu_data_handle_t handle, int memory_node, int *is_allocated, int *is_valid, int *is_loading, int *is_requested);
  506. /**
  507. Same as starpu_data_query_status2(), but without the is_loading parameter.
  508. */
  509. void starpu_data_query_status(starpu_data_handle_t handle, int memory_node, int *is_allocated, int *is_valid, int *is_requested);
  510. struct starpu_codelet;
  511. /**
  512. Set the codelets to be used for \p handle when it is accessed in the
  513. mode ::STARPU_REDUX. Per-worker buffers will be initialized with
  514. the codelet \p init_cl (which has to take one handle with STARPU_W), and
  515. reduction between per-worker buffers will be done with the codelet \p
  516. redux_cl (which has to take a first accumulation handle with
  517. STARPU_RW|STARPU_COMMUTE, and a second contribution handle with STARPU_R).
  518. */
  519. void starpu_data_set_reduction_methods(starpu_data_handle_t handle, struct starpu_codelet *redux_cl, struct starpu_codelet *init_cl);
  520. struct starpu_data_interface_ops* starpu_data_get_interface_ops(starpu_data_handle_t handle);
  521. unsigned starpu_data_test_if_allocated_on_node(starpu_data_handle_t handle, unsigned memory_node);
  522. void starpu_memchunk_tidy(unsigned memory_node);
  523. /**
  524. Set the field \c user_data for the \p handle to \p user_data . It can
  525. then be retrieved with starpu_data_get_user_data(). \p user_data can be any
  526. application-defined value, for instance a pointer to an object-oriented
  527. container for the data.
  528. */
  529. void starpu_data_set_user_data(starpu_data_handle_t handle, void* user_data);
  530. /**
  531. Retrieve the field \c user_data previously set for the \p handle.
  532. */
  533. void *starpu_data_get_user_data(starpu_data_handle_t handle);
  534. /**
  535. Check whether data \p handle can be evicted now from node \p node
  536. */
  537. int starpu_data_can_evict(starpu_data_handle_t handle, unsigned node, enum starpu_is_prefetch is_prefetch);
  538. /** @} */
  539. #ifdef __cplusplus
  540. }
  541. #endif
  542. #endif /* __STARPU_DATA_H__ */