starpu_task_util.h 17 KB

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