starpu_task_util.h 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381
  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 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_WITH_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. #define STARPU_PROLOGUE_CALLBACK (14<<STARPU_MODE_SHIFT)
  98. #define STARPU_PROLOGUE_CALLBACK_ARG (15<<STARPU_MODE_SHIFT)
  99. #define STARPU_PROLOGUE_CALLBACK_POP (16<<STARPU_MODE_SHIFT)
  100. #define STARPU_PROLOGUE_CALLBACK_POP_ARG (17<<STARPU_MODE_SHIFT)
  101. /**
  102. Used when calling starpu_task_insert(), must be followed by an
  103. integer value specifying the worker on which to execute the task
  104. (as specified by starpu_task::execute_on_a_specific_worker)
  105. */
  106. #define STARPU_EXECUTE_ON_WORKER (18<<STARPU_MODE_SHIFT)
  107. #define STARPU_EXECUTE_WHERE (19<<STARPU_MODE_SHIFT)
  108. /**
  109. Used when calling starpu_task_insert(), must be followed by a tag
  110. stored in starpu_task::tag_id. Leave starpu_task::use_tag as 0.
  111. */
  112. #define STARPU_TAG_ONLY (20<<STARPU_MODE_SHIFT)
  113. #define STARPU_POSSIBLY_PARALLEL (21<<STARPU_MODE_SHIFT)
  114. /**
  115. used when calling starpu_task_insert(), must be
  116. followed by an integer value specifying the worker order in which
  117. to execute the tasks (as specified by starpu_task::workerorder)
  118. */
  119. #define STARPU_WORKER_ORDER (22<<STARPU_MODE_SHIFT)
  120. /**
  121. \ingroup API_MPI_Support
  122. Used when calling starpu_mpi_task_insert(), must be followed by a
  123. identifier to a node selection policy. This is needed when several
  124. nodes own data in ::STARPU_W mode.
  125. */
  126. #define STARPU_NODE_SELECTION_POLICY (23<<STARPU_MODE_SHIFT)
  127. /**
  128. Used when calling starpu_task_insert(), must be followed by a
  129. char * stored in starpu_task::name.
  130. */
  131. #define STARPU_NAME (24<<STARPU_MODE_SHIFT)
  132. /**
  133. Used when calling starpu_task_insert(), must be followed by a
  134. memory buffer containing the arguments to be given to the task, and
  135. by the size of the arguments. The memory buffer should be the
  136. result of a previous call to starpu_codelet_pack_args(), and will
  137. be freed (i.e. starpu_task::cl_arg_free will be set to 1)
  138. */
  139. #define STARPU_CL_ARGS (25<<STARPU_MODE_SHIFT)
  140. /**
  141. Used when calling starpu_task_insert(), similarly to
  142. ::STARPU_CL_ARGS, must be followed by a memory buffer containing
  143. the arguments to be given to the task, and by the size of the
  144. arguments. The memory buffer should be the result of a previous
  145. call to starpu_codelet_pack_args(), and will NOT be freed (i.e.
  146. starpu_task::cl_arg_free will be set to 0)
  147. */
  148. #define STARPU_CL_ARGS_NFREE (26<<STARPU_MODE_SHIFT)
  149. /**
  150. Used when calling starpu_task_insert(), must be followed by a
  151. number of tasks as int, and an array containing these tasks. The
  152. function starpu_task_declare_deps_array() will be called with the
  153. given values.
  154. */
  155. #define STARPU_TASK_DEPS_ARRAY (27<<STARPU_MODE_SHIFT)
  156. /**
  157. Used when calling starpu_task_insert(), must be followed by an
  158. integer representing a color
  159. */
  160. #define STARPU_TASK_COLOR (28<<STARPU_MODE_SHIFT)
  161. /**
  162. Used when calling starpu_task_insert(), must be followed by an
  163. array of characters representing the sequential consistency for
  164. each buffer of the task.
  165. */
  166. #define STARPU_HANDLES_SEQUENTIAL_CONSISTENCY (29<<STARPU_MODE_SHIFT)
  167. /**
  168. Used when calling starpu_task_insert(), must be followed by an
  169. integer stating if the task is synchronous or not
  170. */
  171. #define STARPU_TASK_SYNCHRONOUS (30<<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_end_deps_array() will be called with
  176. the given values.
  177. */
  178. #define STARPU_TASK_END_DEPS_ARRAY (31<<STARPU_MODE_SHIFT)
  179. /**
  180. Used when calling starpu_task_insert(), must be followed by an
  181. integer which will be given to starpu_task_end_dep_add()
  182. */
  183. #define STARPU_TASK_END_DEP (32<<STARPU_MODE_SHIFT)
  184. #define STARPU_SHIFTED_MODE_MAX (33<<STARPU_MODE_SHIFT)
  185. /**
  186. Set the given \p task corresponding to \p cl with the following arguments.
  187. The argument list must be zero-terminated. The arguments
  188. following the codelet are the same as the ones for the function
  189. starpu_task_insert().
  190. If some arguments of type ::STARPU_VALUE are given, the parameter
  191. starpu_task::cl_arg_free will be set to 1.
  192. */
  193. int starpu_task_set(struct starpu_task *task, struct starpu_codelet *cl, ...);
  194. /**
  195. Create a task corresponding to \p cl with the following arguments.
  196. The argument list must be zero-terminated. The arguments
  197. following the codelet are the same as the ones for the function
  198. starpu_task_insert().
  199. If some arguments of type ::STARPU_VALUE are given, the parameter
  200. starpu_task::cl_arg_free will be set to 1.
  201. */
  202. struct starpu_task *starpu_task_build(struct starpu_codelet *cl, ...);
  203. /**
  204. Create and submit a task corresponding to \p cl with the following
  205. given arguments. The argument list must be zero-terminated.
  206. The arguments following the codelet can be of the following types:
  207. <ul>
  208. <li> ::STARPU_R, ::STARPU_W, ::STARPU_RW, ::STARPU_SCRATCH,
  209. ::STARPU_REDUX an access mode followed by a data handle;
  210. <li> ::STARPU_DATA_ARRAY followed by an array of data handles and
  211. its number of elements;
  212. <li> ::STARPU_DATA_MODE_ARRAY followed by an array of struct
  213. starpu_data_descr, i.e data handles with their associated access
  214. modes, and its number of elements;
  215. <li> ::STARPU_EXECUTE_ON_WORKER, ::STARPU_WORKER_ORDER followed by
  216. an integer value specifying the worker on which to execute the task
  217. (as specified by starpu_task::execute_on_a_specific_worker)
  218. <li> the specific values ::STARPU_VALUE, ::STARPU_CALLBACK,
  219. ::STARPU_CALLBACK_ARG, ::STARPU_CALLBACK_WITH_ARG,
  220. ::STARPU_PRIORITY, ::STARPU_TAG, ::STARPU_TAG_ONLY, ::STARPU_FLOPS,
  221. ::STARPU_SCHED_CTX, ::STARPU_CL_ARGS, ::STARPU_CL_ARGS_NFREE,
  222. ::STARPU_TASK_DEPS_ARRAY, ::STARPU_TASK_COLOR,
  223. ::STARPU_HANDLES_SEQUENTIAL_CONSISTENCY, ::STARPU_TASK_SYNCHRONOUS,
  224. ::STARPU_TASK_END_DEP followed by the appropriated objects as
  225. defined elsewhere.
  226. </ul>
  227. When using ::STARPU_DATA_ARRAY, the access mode of the data handles
  228. is not defined, it will be taken from the codelet
  229. starpu_codelet::modes or starpu_codelet::dyn_modes field. One
  230. should use ::STARPU_DATA_MODE_ARRAY to define the data handles
  231. along with the access modes.
  232. Parameters to be passed to the codelet implementation are defined
  233. through the type ::STARPU_VALUE. The function
  234. starpu_codelet_unpack_args() must be called within the codelet implementation to retrieve them.
  235. */
  236. int starpu_task_insert(struct starpu_codelet *cl, ...);
  237. /**
  238. Similar to starpu_task_insert(). Kept to avoid breaking old codes.
  239. */
  240. int starpu_insert_task(struct starpu_codelet *cl, ...);
  241. /**
  242. Assuming that there are already \p current_buffer data handles
  243. passed to the task, and if *allocated_buffers is not 0, the
  244. <c>task->dyn_handles</c> array has size \p *allocated_buffers, this
  245. function makes room for \p room other data handles, allocating or
  246. reallocating <c>task->dyn_handles</c> as necessary and updating \p
  247. *allocated_buffers accordingly. One can thus start with
  248. *allocated_buffers equal to 0 and current_buffer equal to 0, then
  249. make room by calling this function, then store handles with
  250. STARPU_TASK_SET_HANDLE(), make room again with this function, store
  251. yet more handles, etc.
  252. */
  253. void starpu_task_insert_data_make_room(struct starpu_codelet *cl, struct starpu_task *task, int *allocated_buffers, int current_buffer, int room);
  254. /**
  255. Store data handle \p handle into task \p task with mode \p
  256. arg_type, updating \p *allocated_buffers and \p *current_buffer
  257. accordingly.
  258. */
  259. 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);
  260. /**
  261. Store \p nb_handles data handles \p handles into task \p task,
  262. updating \p *allocated_buffers and \p *current_buffer accordingly.
  263. */
  264. 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);
  265. /**
  266. Store \p nb_descrs data handles described by \p descrs into task \p
  267. task, updating \p *allocated_buffers and \p *current_buffer
  268. accordingly.
  269. */
  270. 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);
  271. /**
  272. Pack arguments of type ::STARPU_VALUE into a buffer which can be
  273. given to a codelet and later unpacked with the function
  274. starpu_codelet_unpack_args().
  275. Instead of calling starpu_codelet_pack_args(), one can also call
  276. starpu_codelet_pack_arg_init(), then starpu_codelet_pack_arg() for
  277. each data, then starpu_codelet_pack_arg_fini().
  278. */
  279. void starpu_codelet_pack_args(void **arg_buffer, size_t *arg_buffer_size, ...);
  280. struct starpu_codelet_pack_arg_data
  281. {
  282. char *arg_buffer;
  283. size_t arg_buffer_size;
  284. size_t current_offset;
  285. int nargs;
  286. };
  287. /**
  288. Initialize struct starpu_codelet_pack_arg before calling
  289. starpu_codelet_pack_arg() and starpu_codelet_pack_arg_fini(). This
  290. will simply initialize the content of the structure.
  291. */
  292. void starpu_codelet_pack_arg_init(struct starpu_codelet_pack_arg_data *state);
  293. /**
  294. Pack one argument into struct starpu_codelet_pack_arg \p state.
  295. That structure has to be initialized before with
  296. starpu_codelet_pack_arg_init(), and after all
  297. starpu_codelet_pack_arg() calls performed,
  298. starpu_codelet_pack_arg_fini() has to be used to get the \p cl_arg
  299. and \p cl_arg_size to be put in the task.
  300. */
  301. void starpu_codelet_pack_arg(struct starpu_codelet_pack_arg_data *state, const void *ptr, size_t ptr_size);
  302. /**
  303. Finish packing data, after calling starpu_codelet_pack_arg_init()
  304. once and starpu_codelet_pack_arg() several times.
  305. */
  306. void starpu_codelet_pack_arg_fini(struct starpu_codelet_pack_arg_data *state, void **cl_arg, size_t *cl_arg_size);
  307. /**
  308. Retrieve the arguments of type ::STARPU_VALUE associated to a
  309. task automatically created using the function starpu_task_insert(). If
  310. any parameter's value is 0, unpacking will stop there and ignore the remaining
  311. parameters.
  312. */
  313. void starpu_codelet_unpack_args(void *cl_arg, ...);
  314. /**
  315. Similar to starpu_codelet_unpack_args(), but if any parameter is 0,
  316. copy the part of \p cl_arg that has not been read in \p buffer
  317. which can then be used in a later call to one of the unpack
  318. functions.
  319. */
  320. void starpu_codelet_unpack_args_and_copyleft(void *cl_arg, void *buffer, size_t buffer_size, ...);
  321. /** @} */
  322. #ifdef __cplusplus
  323. }
  324. #endif
  325. #endif /* __STARPU_TASK_UTIL_H__ */