modularized_scheduler.doxy 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407
  1. /*
  2. * This file is part of the StarPU Handbook.
  3. * Copyright (C) 2013 Simon Archipoff
  4. * Copyright (C) 2009--2011 Universit@'e de Bordeaux
  5. * Copyright (C) 2014 Centre National de la Recherche Scientifique
  6. * Copyright (C) 2013, 2014 INRIA
  7. * See the file version.doxy for copying conditions.
  8. */
  9. /*! \defgroup API_Modularized_Scheduler Modularized Scheduler Interface
  10. \enum starpu_sched_component_properties
  11. \ingroup API_Modularized_Scheduler
  12. flags for starpu_sched_component::properties
  13. \var starpu_sched_component_properties::STARPU_SCHED_COMPONENT_HOMOGENEOUS
  14. \ingroup API_Modularized_Scheduler
  15. indicate that all workers have the same starpu_worker_archtype
  16. \var starpu_sched_component_properties::STARPU_SCHED_COMPONENT_SINGLE_MEMORY_NODE
  17. \ingroup API_Modularized_Scheduler
  18. indicate that all workers have the same memory component
  19. \def STARPU_SCHED_COMPONENT_IS_HOMOGENEOUS
  20. \ingroup API_Modularized_Scheduler
  21. indicate if component is homogeneous
  22. \def STARPU_SCHED_COMPONENT_IS_SINGLE_MEMORY_NODE
  23. \ingroup API_Modularized_Scheduler
  24. indicate if all workers have the same memory component
  25. \struct starpu_sched_component
  26. \ingroup API_Modularized_Scheduler
  27. This structure represent a scheduler module. A scheduler is a
  28. tree-like structure of them, some parts of scheduler can be shared by
  29. several contexes to perform some local optimisations, so, for all
  30. components, a list of parent is defined indexed by sched_ctx_id. They
  31. embed there specialised method in a pseudo object-style, so calls are
  32. like component->push_task(component,task)
  33. \var struct starpu_sched_tree *starpu_sched_component::tree
  34. The tree containing the component
  35. \var struct starpu_bitmap *starpu_sched_component::workers
  36. this member contain the set of underlying workers
  37. \var starpu_sched_component::workers_in_ctx
  38. this member contain the subset of starpu_sched_component::workers that is currently available in the context
  39. The push method should take this member into account.
  40. this member is set with :
  41. component->workers UNION tree->workers UNION
  42. component->child[i]->workers_in_ctx iff exist x such as component->children[i]->parents[x] == component
  43. \var starpu_sched_component::data
  44. private data
  45. \var starpu_sched_component::nchildren
  46. the number of compoments's children
  47. \var starpu_sched_component::children
  48. the vector of component's children
  49. \var starpu_sched_component::nparents
  50. the numbers of component's parents
  51. \var struct starpu_sched_component **starpu_sched_component::parents
  52. the vector of component's parents
  53. \var void(*starpu_sched_component::add_child)(struct starpu_sched_component *component, struct starpu_sched_component *child)
  54. add a child to component
  55. \var void(*starpu_sched_component::remove_child)(struct starpu_sched_component *component, struct starpu_sched_component *child)
  56. remove a child from component
  57. \var void(*starpu_sched_component::add_parent)(struct starpu_sched_component *component, struct starpu_sched_component *parent)
  58. todo
  59. \var void(*starpu_sched_component::remove_parent)(struct starpu_sched_component *component, struct starpu_sched_component *parent)
  60. todo
  61. \var int (*starpu_sched_component::push_task)(struct starpu_sched_component *, struct starpu_task *)
  62. push a task in the scheduler module. this function is called to
  63. push a task on component subtree, this can either perform a
  64. recursive call on a child or store the task in the component,
  65. then it will be returned by a further pull_task call.
  66. the caller must ensure that component is able to execute task.
  67. \var struct starpu_task * (*starpu_sched_component::pull_task)(struct starpu_sched_component *)
  68. pop a task from the scheduler module. this function is called by workers to get a task from their
  69. parents. this function should first return a locally stored task
  70. or perform a recursive call on the parents.
  71. the task returned by this function is executable by the caller
  72. \var int (*starpu_sched_component::can_push)(struct starpu_sched_component *component)
  73. This function is called by a component which implements a queue,
  74. allowing it to signify to its parents that an empty slot is
  75. available in its queue. The basic implementation of this function
  76. is a recursive call to its parents, the user have to specify a
  77. personally-made function to catch those calls.
  78. \var void (*starpu_sched_component::can_pull)(struct starpu_sched_component *component)
  79. This function allow a component to wake up a worker. It is
  80. currently called by component which implements a queue, to
  81. signify to its children that a task have been pushed in its local
  82. queue, and is available to been popped by a worker, for example.
  83. The basic implementation of this function is a recursive call to
  84. its children, until at least one worker have been woken up.
  85. \var double (*starpu_sched_component::estimated_load)(struct starpu_sched_component *component)
  86. is an heuristic to compute load of scheduler module. Basically the number of tasks divided by the sum
  87. of relatives speedup of workers available in context.
  88. estimated_load(component) = sum(estimated_load(component_children)) + nb_local_tasks / average(relative_speedup(underlying_worker))
  89. \var starpu_sched_component::estimated_end
  90. return the time when a worker will enter in starvation. This function is relevant only if the task->predicted
  91. member has been set.
  92. \var void (*starpu_sched_component::deinit_data)(struct starpu_sched_component *component)
  93. called by starpu_sched_component_destroy. Should free data allocated during creation
  94. \var void (*starpu_sched_component::notify_change_workers)(struct starpu_sched_component *component)
  95. this function is called for each component when workers are added or removed from a context
  96. \var int starpu_sched_component::properties
  97. todo
  98. \var hwloc_obj_t starpu_sched_component::obj
  99. the hwloc object associated to scheduler module. points to the
  100. part of topology that is binded to this component, eg: a numa
  101. node for a ws component that would balance load between
  102. underlying sockets
  103. \struct starpu_sched_tree
  104. \ingroup API_Modularized_Scheduler
  105. The actual scheduler
  106. \var struct starpu_sched_component *starpu_sched_tree::root
  107. this is the entry module of the scheduler
  108. \var struct starpu_bitmap *starpu_sched_tree::workers
  109. this is the set of workers available in this context, this value is used to mask workers in modules
  110. \var unsigned starpu_sched_tree::sched_ctx_id
  111. the context id of the scheduler
  112. \var starpu_pthread_mutex_t starpu_sched_tree::lock
  113. this lock is used to protect the scheduler, it is taken in
  114. read mode pushing a task and in write mode for adding or
  115. removing workers
  116. \var struct starpu_sched_component *starpu_sched_tree::worker_components[STARPU_NMAXWORKERS]
  117. worker components
  118. @name Scheduling Tree API
  119. \ingroup API_Modularized_Scheduler
  120. \fn struct starpu_sched_tree *starpu_sched_tree_create(unsigned sched_ctx_id)
  121. \ingroup API_Modularized_Scheduler
  122. create a empty initialized starpu_sched_tree
  123. \fn void starpu_sched_tree_destroy(struct starpu_sched_tree *tree)
  124. \ingroup API_Modularized_Scheduler
  125. destroy tree and free all non shared component in it.
  126. \fn void starpu_sched_tree_update_workers(struct starpu_sched_tree *t)
  127. \ingroup API_Modularized_Scheduler
  128. recursively set all starpu_sched_component::workers, do not take into account shared parts (except workers).
  129. \fn void starpu_sched_tree_update_workers_in_ctx(struct starpu_sched_tree *t)
  130. \ingroup API_Modularized_Scheduler
  131. recursively set all starpu_sched_component::workers_in_ctx, do not take into account shared parts (except workers)
  132. \fn int starpu_sched_tree_push_task(struct starpu_task *task)
  133. \ingroup API_Modularized_Scheduler
  134. compatibility with starpu_sched_policy interface
  135. \fn struct starpu_task *starpu_sched_tree_pop_task()
  136. \ingroup API_Modularized_Scheduler
  137. compatibility with starpu_sched_policy interface
  138. \fn void starpu_sched_tree_add_workers(unsigned sched_ctx_id, int *workerids, unsigned nworkers)
  139. \ingroup API_Modularized_Scheduler
  140. compatibility with starpu_sched_policy interface
  141. \fn void starpu_sched_tree_remove_workers(unsigned sched_ctx_id, int *workerids, unsigned nworkers)
  142. \ingroup API_Modularized_Scheduler
  143. compatibility with starpu_sched_policy interface
  144. @name Generic Scheduling Component API
  145. \ingroup API_Modularized_Scheduler
  146. \fn struct starpu_sched_component *starpu_sched_component_create(struct starpu_sched_tree *tree)
  147. \ingroup API_Modularized_Scheduler
  148. allocate and initialize component field with defaults values :
  149. .pop_task make recursive call on father
  150. .estimated_load compute relative speedup and tasks in sub tree
  151. .estimated_end return the average of recursive call on children
  152. .add_child is starpu_sched_component_add_child
  153. .remove_child is starpu_sched_component_remove_child
  154. .notify_change_workers does nothing
  155. .deinit_data does nothing
  156. \fn void starpu_sched_component_destroy(struct starpu_sched_component *component)
  157. \ingroup API_Modularized_Scheduler
  158. free data allocated by starpu_sched_component_create and call component->deinit_data(component)
  159. set to null the member starpu_sched_component::fathers[sched_ctx_id] of all child if its equal to \p component
  160. \fn void starpu_sched_component_destroy_rec(struct starpu_sched_component *component)
  161. \ingroup API_Modularized_Scheduler
  162. recursively destroy non shared parts of a \p component 's tree
  163. \fn int starpu_sched_component_can_execute_task(struct starpu_sched_component *component, struct starpu_task *task)
  164. \ingroup API_Modularized_Scheduler
  165. return true iff \p component can execute \p task, this function take into account the workers available in the scheduling context
  166. \fn int starpu_sched_component_execute_preds(struct starpu_sched_component *component, struct starpu_task *task, double *length)
  167. \ingroup API_Modularized_Scheduler
  168. return a non null value if \p component can execute \p task.
  169. write the execution prediction length for the best implementation of the best worker available and write this at \p length address.
  170. this result is more relevant if starpu_sched_component::is_homogeneous is non null.
  171. if a worker need to be calibrated for an implementation, nan is set to \p length.
  172. \fn double starpu_sched_component_transfer_length(struct starpu_sched_component *component, struct starpu_task *task)
  173. \ingroup API_Modularized_Scheduler
  174. return the average time to transfer \p task data to underlying \p component workers.
  175. @name Worker Component API
  176. \ingroup API_Modularized_Scheduler
  177. \fn struct starpu_sched_component *starpu_sched_component_worker_get(unsigned sched_ctx, int workerid)
  178. \ingroup API_Modularized_Scheduler
  179. return the struct starpu_sched_component corresponding to \p workerid. Undefined if \p workerid is not a valid workerid
  180. \fn int starpu_sched_component_worker_get_workerid(struct starpu_sched_component *worker_component)
  181. \ingroup API_Modularized_Scheduler
  182. return the workerid of \p worker_component, undefined if starpu_sched_component_is_worker(worker_component) == 0
  183. \fn int starpu_sched_component_is_worker(struct starpu_sched_component *component)
  184. \ingroup API_Modularized_Scheduler
  185. return true iff \p component is a worker component
  186. \fn int starpu_sched_component_is_simple_worker(struct starpu_sched_component *component)
  187. \ingroup API_Modularized_Scheduler
  188. return true iff \p component is a simple worker component
  189. \fn int starpu_sched_component_is_combined_worker(struct starpu_sched_component *component)
  190. \ingroup API_Modularized_Scheduler
  191. return true iff \p component is a combined worker component
  192. \fn void starpu_sched_component_worker_pre_exec_hook(struct starpu_task *task)
  193. \ingroup API_Modularized_Scheduler
  194. compatibility with starpu_sched_policy interface
  195. update predictions for workers
  196. \fn void starpu_sched_component_worker_post_exec_hook(struct starpu_task *task)
  197. \ingroup API_Modularized_Scheduler
  198. compatibility with starpu_sched_policy interface
  199. @name Flow-control Fifo Component API
  200. \ingroup API_Modularized_Scheduler
  201. \fn struct starpu_sched_component *starpu_sched_component_fifo_create(struct starpu_sched_tree *tree, struct starpu_sched_component_fifo_data *fifo_data)
  202. \ingroup API_Modularized_Scheduler
  203. Return a struct starpu_sched_component with a fifo. A stable sort is performed according to tasks priorities.
  204. A push_task call on this component does not perform recursive calls, underlying components will have to call pop_task to get it.
  205. starpu_sched_component::estimated_end function compute the estimated length by dividing the sequential length by the number of underlying workers. Do not take into account tasks that are currently executed.
  206. \fn int starpu_sched_component_is_fifo(struct starpu_sched_component *component)
  207. \ingroup API_Modularized_Scheduler
  208. return true iff \p component is a fifo component
  209. @name Flow-control Prio Component API
  210. \ingroup API_Modularized_Scheduler
  211. \fn struct starpu_sched_component *starpu_sched_component_prio_create(struct starpu_sched_tree *tree, struct starpu_sched_component_prio_data *prio_data)
  212. \ingroup API_Modularized_Scheduler
  213. todo
  214. \fn int starpu_sched_component_is_prio(struct starpu_sched_component *component)
  215. \ingroup API_Modularized_Scheduler
  216. todo
  217. @name Resource-mapping Work-Stealing Component API
  218. \ingroup API_Modularized_Scheduler
  219. \fn struct starpu_sched_component *starpu_sched_component_work_stealing_create(struct starpu_sched_tree *tree, void *arg)
  220. \ingroup API_Modularized_Scheduler
  221. return a component that perform a work stealing scheduling. Tasks are pushed in a round robin way. estimated_end return the average of expected length of fifos, starting at the average of the expected_end of his children. When a worker have to steal a task, it steal a task in a round robin way, and get the last pushed task of the higher priority.
  222. \fn int starpu_sched_tree_work_stealing_push_task(struct starpu_task *task)
  223. \ingroup API_Modularized_Scheduler
  224. undefined if there is no work stealing component in the scheduler. If any, \p task is pushed in a default way if the caller is the application, and in the caller's fifo if its a worker.
  225. \fn int starpu_sched_component_is_work_stealing(struct starpu_sched_component *component)
  226. \ingroup API_Modularized_Scheduler
  227. return true iff \p component is a work stealing component
  228. @name Resource-mapping Random Component API
  229. \ingroup API_Modularized_Scheduler
  230. \fn struct starpu_sched_component *starpu_sched_component_random_create(struct starpu_sched_tree *tree, void *arg)
  231. \ingroup API_Modularized_Scheduler
  232. create a component that perform a random scheduling
  233. \fn int starpu_sched_component_is_random(struct starpu_sched_component *)
  234. \ingroup API_Modularized_Scheduler
  235. return true iff \p component is a random component
  236. @name Resource-mapping Eager Component API
  237. \ingroup API_Modularized_Scheduler
  238. \fn struct starpu_sched_component *starpu_sched_component_eager_create(struct starpu_sched_tree *tree, void *arg STARPU_ATTRIBUTE_UNUSED);
  239. \ingroup API_Modularized_Scheduler
  240. todo
  241. \fn int starpu_sched_component_is_eager(struct starpu_sched_component *)
  242. \ingroup API_Modularized_Scheduler
  243. todo
  244. @name Resource-mapping Eager-Calibration Component API
  245. \ingroup API_Modularized_Scheduler
  246. \fn struct starpu_sched_component *starpu_sched_component_eager_calibration_create(struct starpu_sched_tree *tree, void *arg STARPU_ATTRIBUTE_UNUSED)
  247. \ingroup API_Modularized_Scheduler
  248. todo
  249. \fn int starpu_sched_component_is_eager_calibration(struct starpu_sched_component *)
  250. \ingroup API_Modularized_Scheduler
  251. todo
  252. @name Resource-mapping MCT Component API
  253. \ingroup API_Modularized_Scheduler
  254. \fn struct starpu_sched_component *starpu_sched_component_mct_create(struct starpu_sched_tree *tree, struct starpu_sched_component_mct_data *mct_data)
  255. \ingroup API_Modularized_Scheduler
  256. create a component with mct_data paremeters. the mct component doesnt
  257. do anything but pushing tasks on no_perf_model_component and
  258. calibrating_component
  259. \fn int starpu_sched_component_is_mct(struct starpu_sched_component *component);
  260. \ingroup API_Modularized_Scheduler
  261. todo
  262. @name Resource-mapping Heft Component API
  263. \ingroup API_Modularized_Scheduler
  264. \fn struct starpu_sched_component *starpu_sched_component_heft_create(struct starpu_sched_tree *tree, struct starpu_sched_component_mct_data *mct_data)
  265. \ingroup API_Modularized_Scheduler
  266. this component perform a heft scheduling
  267. \fn int starpu_sched_component_is_heft(struct starpu_sched_component *component)
  268. \ingroup API_Modularized_Scheduler
  269. return true iff \p component is a heft component
  270. @name Special-purpose Best_Implementation Component API
  271. \ingroup API_Modularized_Scheduler
  272. \fn struct starpu_sched_component *starpu_sched_component_best_implementation_create(struct starpu_sched_tree *tree, void *arg)
  273. \ingroup API_Modularized_Scheduler
  274. Select the implementation that offer the shortest computation length for the first worker that can execute the task.
  275. Or an implementation that need to be calibrated.
  276. Also set starpu_task::predicted and starpu_task::predicted_transfer for memory component of the first suitable workerid.
  277. If starpu_sched_component::push method is called and starpu_sched_component::nchild > 1 the result is undefined.
  278. @name Special-purpose Perfmodel_Select Component API
  279. \ingroup API_Modularized_Scheduler
  280. \fn struct starpu_sched_component *starpu_sched_component_perfmodel_select_create(struct starpu_sched_tree *tree, struct starpu_sched_component_perfmodel_select_data *perfmodel_select_data)
  281. \ingroup API_Modularized_Scheduler
  282. todo
  283. \fn int starpu_sched_component_is_perfmodel_select(struct starpu_sched_component *component)
  284. \ingroup API_Modularized_Scheduler
  285. todo
  286. @name Recipe Component API
  287. \ingroup API_Modularized_Scheduler
  288. \struct starpu_sched_component_composed_recipe
  289. \ingroup API_Modularized_Scheduler
  290. parameters for starpu_sched_component_composed_component_create
  291. \fn struct starpu_sched_component_composed_recipe *starpu_sched_component_composed_recipe_create(void)
  292. \ingroup API_Modularized_Scheduler
  293. return an empty recipe for a composed component, it should not be used without modification
  294. \fn struct starpu_sched_component_composed_recipe *starpu_sched_component_composed_recipe_create_singleton(struct starpu_sched_component *(*create_component)(struct starpu_sched_tree *tree, void *arg), void *arg)
  295. \ingroup API_Modularized_Scheduler
  296. return a recipe to build a composed component with a \p create_component
  297. \fn void starpu_sched_component_composed_recipe_add(struct starpu_sched_component_composed_recipe *recipe, struct starpu_sched_component *(*create_component)(struct starpu_sched_tree *tree, void *arg), void *arg)
  298. \ingroup API_Modularized_Scheduler
  299. add \p create_component under all previous components in recipe
  300. \fn void starpu_sched_component_composed_recipe_destroy(struct starpu_sched_component_composed_recipe *)
  301. \ingroup API_Modularized_Scheduler
  302. destroy composed_sched_component, this should be done after starpu_sched_component_composed_component_create was called
  303. \fn struct starpu_sched_component *starpu_sched_component_composed_component_create(struct starpu_sched_tree *tree, struct starpu_sched_component_composed_recipe *recipe)
  304. \ingroup API_Modularized_Scheduler
  305. create a component that behave as all component of recipe where linked. Except that you cant use starpu_sched_component_is_foo function
  306. if recipe contain a single create_foo arg_foo pair, create_foo(arg_foo) is returned instead of a composed component
  307. \struct starpu_sched_specs
  308. \ingroup API_Modularized_Scheduler
  309. Define how build a scheduler according to topology. Each level (except for hwloc_machine_composed_sched_component) can be NULL, then
  310. the level is just skipped. Bugs everywhere, do not rely on.
  311. \var starpu_sched_specs::hwloc_machine_composed_sched_component
  312. the composed component to put on the top of the scheduler
  313. this member must not be NULL
  314. \var starpu_sched_specs::hwloc_component_composed_sched_component
  315. the composed component to put for each memory component
  316. \var starpu_sched_specs::hwloc_socket_composed_sched_component
  317. the composed component to put for each socket
  318. \var starpu_sched_specs::hwloc_cache_composed_sched_component
  319. the composed component to put for each cache
  320. \var starpu_sched_specs::worker_composed_sched_component
  321. a function that return a starpu_sched_component_composed_recipe to put on top of a worker of type \p archtype.
  322. NULL is a valid return value, then no component will be added on top
  323. \var starpu_sched_specs::mix_heterogeneous_workers
  324. this flag is a dirty hack because of the poor expressivity of this interface. As example, if you want to build
  325. a heft component with a fifo component per numa component, and you also have GPUs, if this flag is set, GPUs will share those fifos.
  326. If this flag is not set, a new fifo will be built for each of them (if they have the same starpu_perf_arch and the same
  327. numa component it will be shared
  328. \fn struct starpu_sched_tree *starpu_sched_component_make_scheduler(unsigned sched_ctx_id, struct starpu_sched_specs s)
  329. \ingroup API_Modularized_Scheduler
  330. this function build a scheduler for \p sched_ctx_id according to \p s and the hwloc topology of the machine.
  331. */