starpu_task_util.h 17 KB

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