starpu_task_util.h 18 KB

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