starpu_task_util.h 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493
  1. /* StarPU --- Runtime system for heterogeneous multicore architectures.
  2. *
  3. * Copyright (C) 2012-2014 Inria
  4. * Copyright (C) 2010-2019 CNRS
  5. * Copyright (C) 2010-2015,2018-2019 Université de Bordeaux
  6. *
  7. * StarPU is free software; you can redistribute it and/or modify
  8. * it under the terms of the GNU Lesser General Public License as published by
  9. * the Free Software Foundation; either version 2.1 of the License, or (at
  10. * your option) any later version.
  11. *
  12. * StarPU is distributed in the hope that it will be useful, but
  13. * WITHOUT ANY WARRANTY; without even the implied warranty of
  14. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  15. *
  16. * See the GNU Lesser General Public License in COPYING.LGPL for more details.
  17. */
  18. #ifndef __STARPU_TASK_UTIL_H__
  19. #define __STARPU_TASK_UTIL_H__
  20. #include <stdio.h>
  21. #include <stdlib.h>
  22. #include <string.h>
  23. #include <assert.h>
  24. #include <starpu.h>
  25. #ifdef __cplusplus
  26. extern "C"
  27. {
  28. #endif
  29. /**
  30. @defgroup API_Insert_Task Task Insert Utility
  31. @{
  32. */
  33. /* NOTE: when adding a value here, please make sure to update both
  34. * src/util/starpu_task_insert_utils.c (in two places) and
  35. * mpi/src/starpu_mpi_task_insert.c and mpi/src/starpu_mpi_task_insert_fortran.c */
  36. #define STARPU_MODE_SHIFT 17
  37. /**
  38. Used when calling starpu_task_insert(), must be followed by a
  39. pointer to a constant value and the size of the constant
  40. */
  41. #define STARPU_VALUE (1<<STARPU_MODE_SHIFT)
  42. /**
  43. Used when calling starpu_task_insert(), must be followed by a
  44. pointer to a callback function
  45. */
  46. #define STARPU_CALLBACK (2<<STARPU_MODE_SHIFT)
  47. /**
  48. Used when calling starpu_task_insert(), must be followed by two
  49. pointers: one to a callback function, and the other to be given as
  50. an argument to the callback function; this is equivalent to using
  51. both ::STARPU_CALLBACK and ::STARPU_CALLBACK_ARG.
  52. */
  53. #define STARPU_CALLBACK_WITH_ARG (3<<STARPU_MODE_SHIFT)
  54. /**
  55. Used when calling starpu_task_insert(), must be followed by a
  56. pointer to be given as an argument to the callback function
  57. */
  58. #define STARPU_CALLBACK_ARG (4<<STARPU_MODE_SHIFT)
  59. /**
  60. Used when calling starpu_task_insert(), must
  61. be followed by a integer defining a priority level
  62. */
  63. #define STARPU_PRIORITY (5<<STARPU_MODE_SHIFT)
  64. /**
  65. \ingroup API_MPI_Support
  66. Used when calling starpu_mpi_task_insert(), must be followed by a
  67. integer value which specified the node on which to execute the
  68. codelet.
  69. */
  70. #define STARPU_EXECUTE_ON_NODE (6<<STARPU_MODE_SHIFT)
  71. /**
  72. \ingroup API_MPI_Support
  73. Used when calling starpu_mpi_task_insert(), must be followed by a
  74. data handle to specify that the node owning the given data will
  75. execute the codelet.
  76. */
  77. #define STARPU_EXECUTE_ON_DATA (7<<STARPU_MODE_SHIFT)
  78. /**
  79. Used when calling starpu_task_in_sert(), must be followed by an array of
  80. handles and the number of elements in the array (as int). This is equivalent
  81. to passing the handles as separate parameters with STARPU_R/W/RW.
  82. */
  83. #define STARPU_DATA_ARRAY (8<<STARPU_MODE_SHIFT)
  84. /**
  85. Used when calling starpu_task_in_sert(), must be followed by an array of
  86. struct starpu_data_descr and the number of elements in the array (as int).
  87. This is equivalent to passing the handles with the corresponding modes.
  88. */
  89. #define STARPU_DATA_MODE_ARRAY (9<<STARPU_MODE_SHIFT)
  90. /**
  91. Used when calling starpu_task_insert(), must be followed by a tag.
  92. */
  93. #define STARPU_TAG (10<<STARPU_MODE_SHIFT)
  94. #define STARPU_HYPERVISOR_TAG (11<<STARPU_MODE_SHIFT)
  95. /**
  96. Used when calling starpu_task_insert(), must be followed by an
  97. amount of floating point operations, as a double. Users <b>MUST</b>
  98. explicitly cast into double, otherwise parameter passing will not
  99. work.
  100. */
  101. #define STARPU_FLOPS (12<<STARPU_MODE_SHIFT)
  102. /**
  103. Used when calling starpu_task_insert(), must be followed by the id
  104. of the scheduling context to which to submit the task to.
  105. */
  106. #define STARPU_SCHED_CTX (13<<STARPU_MODE_SHIFT)
  107. /**
  108. Used when calling starpu_task_insert(), must be followed by a
  109. pointer to a prologue callback function
  110. */
  111. #define STARPU_PROLOGUE_CALLBACK (14<<STARPU_MODE_SHIFT)
  112. /**
  113. Used when calling starpu_task_insert(), must be followed by a
  114. pointer to be given as an argument to the prologue callback
  115. function
  116. */
  117. #define STARPU_PROLOGUE_CALLBACK_ARG (15<<STARPU_MODE_SHIFT)
  118. /**
  119. Used when calling starpu_task_insert(), must be followed by a
  120. pointer to a prologue callback pop function
  121. */
  122. #define STARPU_PROLOGUE_CALLBACK_POP (16<<STARPU_MODE_SHIFT)
  123. /**
  124. Used when calling starpu_task_insert(), must be followed by a
  125. pointer to be given as an argument to the prologue callback pop
  126. function
  127. */
  128. #define STARPU_PROLOGUE_CALLBACK_POP_ARG (17<<STARPU_MODE_SHIFT)
  129. /**
  130. Used when calling starpu_task_insert(), must be followed by an
  131. integer value specifying the worker on which to execute the task
  132. (as specified by starpu_task::execute_on_a_specific_worker)
  133. */
  134. #define STARPU_EXECUTE_ON_WORKER (18<<STARPU_MODE_SHIFT)
  135. /**
  136. Used when calling starpu_task_insert(), must be followed by an
  137. unsigned long long value specifying the mask of worker on which to execute
  138. the task (as specified by starpu_task::where)
  139. */
  140. #define STARPU_EXECUTE_WHERE (19<<STARPU_MODE_SHIFT)
  141. /**
  142. Used when calling starpu_task_insert(), must be followed by a tag
  143. stored in starpu_task::tag_id. Leave starpu_task::use_tag as 0.
  144. */
  145. #define STARPU_TAG_ONLY (20<<STARPU_MODE_SHIFT)
  146. /**
  147. Used when calling starpu_task_insert(), must be followed by an unsigned
  148. stored in starpu_task::possibly_parallel.
  149. */
  150. #define STARPU_POSSIBLY_PARALLEL (21<<STARPU_MODE_SHIFT)
  151. /**
  152. used when calling starpu_task_insert(), must be
  153. followed by an integer value specifying the worker order in which
  154. to execute the tasks (as specified by starpu_task::workerorder)
  155. */
  156. #define STARPU_WORKER_ORDER (22<<STARPU_MODE_SHIFT)
  157. /**
  158. \ingroup API_MPI_Support
  159. Used when calling starpu_mpi_task_insert(), must be followed by a
  160. identifier to a node selection policy. This is needed when several
  161. nodes own data in ::STARPU_W mode.
  162. */
  163. #define STARPU_NODE_SELECTION_POLICY (23<<STARPU_MODE_SHIFT)
  164. /**
  165. Used when calling starpu_task_insert(), must be followed by a
  166. char * stored in starpu_task::name.
  167. */
  168. #define STARPU_NAME (24<<STARPU_MODE_SHIFT)
  169. /**
  170. Used when calling starpu_task_insert(), must be followed by a
  171. memory buffer containing the arguments to be given to the task, and
  172. by the size of the arguments. The memory buffer should be the
  173. result of a previous call to starpu_codelet_pack_args(), and will
  174. be freed (i.e. starpu_task::cl_arg_free will be set to 1)
  175. */
  176. #define STARPU_CL_ARGS (25<<STARPU_MODE_SHIFT)
  177. /**
  178. Used when calling starpu_task_insert(), similarly to
  179. ::STARPU_CL_ARGS, must be followed by a memory buffer containing
  180. the arguments to be given to the task, and by the size of the
  181. arguments. The memory buffer should be the result of a previous
  182. call to starpu_codelet_pack_args(), and will NOT be freed (i.e.
  183. starpu_task::cl_arg_free will be set to 0)
  184. */
  185. #define STARPU_CL_ARGS_NFREE (26<<STARPU_MODE_SHIFT)
  186. /**
  187. Used when calling starpu_task_insert(), must be followed by a
  188. number of tasks as int, and an array containing these tasks. The
  189. function starpu_task_declare_deps_array() will be called with the
  190. given values.
  191. */
  192. #define STARPU_TASK_DEPS_ARRAY (27<<STARPU_MODE_SHIFT)
  193. /**
  194. Used when calling starpu_task_insert(), must be followed by an
  195. integer representing a color
  196. */
  197. #define STARPU_TASK_COLOR (28<<STARPU_MODE_SHIFT)
  198. /**
  199. Used when calling starpu_task_insert(), must be followed by an
  200. array of characters representing the sequential consistency for
  201. each buffer of the task.
  202. */
  203. #define STARPU_HANDLES_SEQUENTIAL_CONSISTENCY (29<<STARPU_MODE_SHIFT)
  204. /**
  205. Used when calling starpu_task_insert(), must be followed by an
  206. integer stating if the task is synchronous or not
  207. */
  208. #define STARPU_TASK_SYNCHRONOUS (30<<STARPU_MODE_SHIFT)
  209. /**
  210. Used when calling starpu_task_insert(), must be followed by a
  211. number of tasks as int, and an array containing these tasks. The
  212. function starpu_task_declare_end_deps_array() will be called with
  213. the given values.
  214. */
  215. #define STARPU_TASK_END_DEPS_ARRAY (31<<STARPU_MODE_SHIFT)
  216. /**
  217. Used when calling starpu_task_insert(), must be followed by an
  218. integer which will be given to starpu_task_end_dep_add()
  219. */
  220. #define STARPU_TASK_END_DEP (32<<STARPU_MODE_SHIFT)
  221. /**
  222. Used when calling starpu_task_insert(), must be followed by an
  223. unsigned being a number of workers, and an array of bits which size
  224. is the number of workers, the array indicates the set of workers
  225. which are allowed to execute the task.
  226. */
  227. #define STARPU_TASK_WORKERIDS (33<<STARPU_MODE_SHIFT)
  228. /**
  229. Used when calling starpu_task_insert(), must be followed by an
  230. unsigned which sets the sequential consistency for the data
  231. parameters of the task.
  232. */
  233. #define STARPU_SEQUENTIAL_CONSISTENCY (34<<STARPU_MODE_SHIFT)
  234. /**
  235. Used when calling starpu_task_insert() and alike, must be followed
  236. by a pointer to a struct starpu_profiling_task_info
  237. */
  238. #define STARPU_TASK_PROFILING_INFO (35<<STARPU_MODE_SHIFT)
  239. /**
  240. Used when calling starpu_task_insert() and alike, must be followed
  241. by an unsigned specifying not to allocate a submitorder id for the task
  242. */
  243. #define STARPU_TASK_NO_SUBMITORDER (36<<STARPU_MODE_SHIFT)
  244. /**
  245. Used when calling starpu_task_insert(), similarly to
  246. ::STARPU_CALLBACK_ARG, must be followed by a pointer to be given as
  247. an argument to the callback function, the argument will not be
  248. freed, i.e starpu_task::callback_arg_free will be set to 0
  249. */
  250. #define STARPU_CALLBACK_ARG_NFREE (37<<STARPU_MODE_SHIFT)
  251. /**
  252. Used when calling starpu_task_insert(), similarly to
  253. ::STARPU_CALLBACK_WITH_ARG, must be followed by two pointers: one
  254. to a callback function, and the other to be given as an argument to
  255. the callback function; this is equivalent to using both
  256. ::STARPU_CALLBACK and ::STARPU_CALLBACK_ARG_NFREE.
  257. */
  258. #define STARPU_CALLBACK_WITH_ARG_NFREE (38<<STARPU_MODE_SHIFT)
  259. /**
  260. Used when calling starpu_task_insert(), similarly to
  261. ::STARPU_PROLOGUE_CALLBACK_ARG, must be followed by a
  262. pointer to be given as an argument to the prologue callback
  263. function, the argument will not be
  264. freed, i.e starpu_task::prologue_callback_arg_free will be set to 0
  265. */
  266. #define STARPU_PROLOGUE_CALLBACK_ARG_NFREE (39<<STARPU_MODE_SHIFT)
  267. /**
  268. Used when calling starpu_task_insert(), similarly to
  269. ::STARPU_PROLOGUE_CALLBACK_POP_ARG, must be followed by a pointer
  270. to be given as an argument to the prologue callback pop function,
  271. the argument will not be freed, i.e
  272. starpu_task::prologue_callback_pop_arg_free will be set to 0
  273. */
  274. #define STARPU_PROLOGUE_CALLBACK_POP_ARG_NFREE (40<<STARPU_MODE_SHIFT)
  275. /**
  276. Used when calling starpu_task_insert() and alike, must be followed
  277. by a void* specifying the value to be set in the sched_data field of the
  278. task.
  279. */
  280. #define STARPU_TASK_SCHED_DATA (41<<STARPU_MODE_SHIFT)
  281. #define STARPU_SHIFTED_MODE_MAX (42<<STARPU_MODE_SHIFT)
  282. /**
  283. Set the given \p task corresponding to \p cl with the following arguments.
  284. The argument list must be zero-terminated. The arguments
  285. following the codelet are the same as the ones for the function
  286. starpu_task_insert().
  287. If some arguments of type ::STARPU_VALUE are given, the parameter
  288. starpu_task::cl_arg_free will be set to 1.
  289. */
  290. int starpu_task_set(struct starpu_task *task, struct starpu_codelet *cl, ...);
  291. /**
  292. Create a task corresponding to \p cl with the following arguments.
  293. The argument list must be zero-terminated. The arguments
  294. following the codelet are the same as the ones for the function
  295. starpu_task_insert().
  296. If some arguments of type ::STARPU_VALUE are given, the parameter
  297. starpu_task::cl_arg_free will be set to 1.
  298. */
  299. struct starpu_task *starpu_task_build(struct starpu_codelet *cl, ...);
  300. /**
  301. Create and submit a task corresponding to \p cl with the following
  302. given arguments. The argument list must be zero-terminated.
  303. The arguments following the codelet can be of the following types:
  304. <ul>
  305. <li> ::STARPU_R, ::STARPU_W, ::STARPU_RW, ::STARPU_SCRATCH,
  306. ::STARPU_REDUX an access mode followed by a data handle;
  307. <li> ::STARPU_DATA_ARRAY followed by an array of data handles and
  308. its number of elements;
  309. <li> ::STARPU_DATA_MODE_ARRAY followed by an array of struct
  310. starpu_data_descr, i.e data handles with their associated access
  311. modes, and its number of elements;
  312. <li> ::STARPU_EXECUTE_ON_WORKER, ::STARPU_WORKER_ORDER followed by
  313. an integer value specifying the worker on which to execute the task
  314. (as specified by starpu_task::execute_on_a_specific_worker)
  315. <li> the specific values ::STARPU_VALUE, ::STARPU_CALLBACK,
  316. ::STARPU_CALLBACK_ARG, ::STARPU_CALLBACK_WITH_ARG,
  317. ::STARPU_PRIORITY, ::STARPU_TAG, ::STARPU_TAG_ONLY, ::STARPU_FLOPS,
  318. ::STARPU_SCHED_CTX, ::STARPU_CL_ARGS, ::STARPU_CL_ARGS_NFREE,
  319. ::STARPU_TASK_DEPS_ARRAY, ::STARPU_TASK_COLOR,
  320. ::STARPU_HANDLES_SEQUENTIAL_CONSISTENCY, ::STARPU_TASK_SYNCHRONOUS,
  321. ::STARPU_TASK_END_DEP followed by the appropriated objects as
  322. defined elsewhere.
  323. </ul>
  324. When using ::STARPU_DATA_ARRAY, the access mode of the data handles
  325. is not defined, it will be taken from the codelet
  326. starpu_codelet::modes or starpu_codelet::dyn_modes field. One
  327. should use ::STARPU_DATA_MODE_ARRAY to define the data handles
  328. along with the access modes.
  329. Parameters to be passed to the codelet implementation are defined
  330. through the type ::STARPU_VALUE. The function
  331. starpu_codelet_unpack_args() must be called within the codelet implementation to retrieve them.
  332. */
  333. int starpu_task_insert(struct starpu_codelet *cl, ...);
  334. /**
  335. Similar to starpu_task_insert(). Kept to avoid breaking old codes.
  336. */
  337. int starpu_insert_task(struct starpu_codelet *cl, ...);
  338. /**
  339. Assuming that there are already \p current_buffer data handles
  340. passed to the task, and if *allocated_buffers is not 0, the
  341. <c>task->dyn_handles</c> array has size \p *allocated_buffers, this
  342. function makes room for \p room other data handles, allocating or
  343. reallocating <c>task->dyn_handles</c> as necessary and updating \p
  344. *allocated_buffers accordingly. One can thus start with
  345. *allocated_buffers equal to 0 and current_buffer equal to 0, then
  346. make room by calling this function, then store handles with
  347. STARPU_TASK_SET_HANDLE(), make room again with this function, store
  348. yet more handles, etc.
  349. */
  350. void starpu_task_insert_data_make_room(struct starpu_codelet *cl, struct starpu_task *task, int *allocated_buffers, int current_buffer, int room);
  351. /**
  352. Store data handle \p handle into task \p task with mode \p
  353. arg_type, updating \p *allocated_buffers and \p *current_buffer
  354. accordingly.
  355. */
  356. void starpu_task_insert_data_process_arg(struct starpu_codelet *cl, struct starpu_task *task, int *allocated_buffers, int *current_buffer, int arg_type, starpu_data_handle_t handle);
  357. /**
  358. Store \p nb_handles data handles \p handles into task \p task,
  359. updating \p *allocated_buffers and \p *current_buffer accordingly.
  360. */
  361. void starpu_task_insert_data_process_array_arg(struct starpu_codelet *cl, struct starpu_task *task, int *allocated_buffers, int *current_buffer, int nb_handles, starpu_data_handle_t *handles);
  362. /**
  363. Store \p nb_descrs data handles described by \p descrs into task \p
  364. task, updating \p *allocated_buffers and \p *current_buffer
  365. accordingly.
  366. */
  367. void starpu_task_insert_data_process_mode_array_arg(struct starpu_codelet *cl, struct starpu_task *task, int *allocated_buffers, int *current_buffer, int nb_descrs, struct starpu_data_descr *descrs);
  368. /**
  369. Pack arguments of type ::STARPU_VALUE into a buffer which can be
  370. given to a codelet and later unpacked with the function
  371. starpu_codelet_unpack_args().
  372. Instead of calling starpu_codelet_pack_args(), one can also call
  373. starpu_codelet_pack_arg_init(), then starpu_codelet_pack_arg() for
  374. each data, then starpu_codelet_pack_arg_fini().
  375. */
  376. void starpu_codelet_pack_args(void **arg_buffer, size_t *arg_buffer_size, ...);
  377. struct starpu_codelet_pack_arg_data
  378. {
  379. char *arg_buffer;
  380. size_t arg_buffer_size;
  381. size_t current_offset;
  382. int nargs;
  383. };
  384. /**
  385. Initialize struct starpu_codelet_pack_arg before calling
  386. starpu_codelet_pack_arg() and starpu_codelet_pack_arg_fini(). This
  387. will simply initialize the content of the structure.
  388. */
  389. void starpu_codelet_pack_arg_init(struct starpu_codelet_pack_arg_data *state);
  390. /**
  391. Pack one argument into struct starpu_codelet_pack_arg \p state.
  392. That structure has to be initialized before with
  393. starpu_codelet_pack_arg_init(), and after all
  394. starpu_codelet_pack_arg() calls performed,
  395. starpu_codelet_pack_arg_fini() has to be used to get the \p cl_arg
  396. and \p cl_arg_size to be put in the task.
  397. */
  398. void starpu_codelet_pack_arg(struct starpu_codelet_pack_arg_data *state, const void *ptr, size_t ptr_size);
  399. /**
  400. Finish packing data, after calling starpu_codelet_pack_arg_init()
  401. once and starpu_codelet_pack_arg() several times.
  402. */
  403. void starpu_codelet_pack_arg_fini(struct starpu_codelet_pack_arg_data *state, void **cl_arg, size_t *cl_arg_size);
  404. /**
  405. Retrieve the arguments of type ::STARPU_VALUE associated to a
  406. task automatically created using the function starpu_task_insert(). If
  407. any parameter's value is 0, unpacking will stop there and ignore the remaining
  408. parameters.
  409. */
  410. void starpu_codelet_unpack_args(void *cl_arg, ...);
  411. /**
  412. Similar to starpu_codelet_unpack_args(), but if any parameter is 0,
  413. copy the part of \p cl_arg that has not been read in \p buffer
  414. which can then be used in a later call to one of the unpack
  415. functions.
  416. */
  417. void starpu_codelet_unpack_args_and_copyleft(void *cl_arg, void *buffer, size_t buffer_size, ...);
  418. /** @} */
  419. #ifdef __cplusplus
  420. }
  421. #endif
  422. #endif /* __STARPU_TASK_UTIL_H__ */