scheduling_contexts.doxy 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346
  1. /* StarPU --- Runtime system for heterogeneous multicore architectures.
  2. *
  3. * Copyright (C) 2011-2013,2016-2017 Inria
  4. * Copyright (C) 2010-2017 CNRS
  5. * Copyright (C) 2009-2011,2014,2016 Université de Bordeaux
  6. * Copyright (C) 2016 Uppsala University
  7. *
  8. * StarPU is free software; you can redistribute it and/or modify
  9. * it under the terms of the GNU Lesser General Public License as published by
  10. * the Free Software Foundation; either version 2.1 of the License, or (at
  11. * your option) any later version.
  12. *
  13. * StarPU is distributed in the hope that it will be useful, but
  14. * WITHOUT ANY WARRANTY; without even the implied warranty of
  15. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  16. *
  17. * See the GNU Lesser General Public License in COPYING.LGPL for more details.
  18. */
  19. /*! \defgroup API_Scheduling_Contexts Scheduling Contexts
  20. \brief StarPU permits on one hand grouping workers in combined workers
  21. in order to execute a parallel task and on the other hand grouping
  22. tasks in bundles that will be executed by a single specified worker.
  23. In contrast when we group workers in scheduling contexts we submit
  24. starpu tasks to them and we schedule them with the policy assigned to
  25. the context. Scheduling contexts can be created, deleted and modified
  26. dynamically.
  27. \struct starpu_sched_ctx_performance_counters
  28. Performance counters used by the starpu to indicate the
  29. hypervisor how the application and the resources are executing.
  30. \ingroup API_Scheduling_Contexts
  31. \var void (*starpu_sched_ctx_performance_counters::notify_idle_cycle)(unsigned sched_ctx_id, int worker, double idle_time)
  32. Inform the hypervisor for how long a worker has been idle in the specified context
  33. \var void (*starpu_sched_ctx_performance_counters::notify_pushed_task)(unsigned sched_ctx_id, int worker)
  34. Notify the hypervisor that a task has been scheduled on the queue of the worker corresponding to the specified context
  35. \var void (*starpu_sched_ctx_performance_counters::notify_poped_task)(unsigned sched_ctx_id, int worker)
  36. Inform the hypervisor that a task executing a specified number of instructions has been poped from the worker
  37. \var void (*starpu_sched_ctx_performance_counters::notify_post_exec_task)(struct starpu_task *task, size_t data_size, uint32_t footprint, int hypervisor_tag, double flops)
  38. Notify the hypervisor that a task has just been executed
  39. \var void (*starpu_sched_ctx_performance_counters::notify_submitted_job)(struct starpu_task *task, uint32_t footprint, size_t data_size)
  40. Notify the hypervisor that a task has just been submitted
  41. \var void (*starpu_sched_ctx_performance_counters::notify_delete_context)(unsigned sched_ctx)
  42. Notify the hypervisor that the context was deleted
  43. @name Scheduling Contexts Basic API
  44. \ingroup API_Scheduling_Contexts
  45. \def STARPU_NMAX_SCHED_CTXS
  46. \ingroup API_Scheduling_Policy
  47. Define the maximum number of scheduling contexts managed by StarPU. The default value can be
  48. modified at configure by using the option \ref enable-max-sched-ctxs "--enable-max-sched-ctxs".
  49. \fn unsigned starpu_sched_ctx_create(int *workerids_ctx, int nworkers_ctx, const char *sched_ctx_name, ...)
  50. \ingroup API_Scheduling_Contexts
  51. Create a scheduling context with the given parameters
  52. (see below) and assigns the workers in \p workerids_ctx to execute the
  53. tasks submitted to it. The return value represents the identifier of
  54. the context that has just been created. It will be further used to
  55. indicate the context the tasks will be submitted to. The return value
  56. should be at most \ref STARPU_NMAX_SCHED_CTXS.
  57. The arguments following the name of the scheduling context can be of
  58. the following types:
  59. <ul>
  60. <li> ::STARPU_SCHED_CTX_POLICY_NAME, followed by the name of a
  61. predefined scheduling policy. Use an empty string to create the
  62. context with the default scheduling policy.
  63. </li>
  64. <li> ::STARPU_SCHED_CTX_POLICY_STRUCT, followed by a pointer to a
  65. custom scheduling policy (struct starpu_sched_policy *)
  66. </li>
  67. <li> ::STARPU_SCHED_CTX_POLICY_MIN_PRIO, followed by a integer
  68. representing the minimum priority value to be defined for the
  69. scheduling policy.
  70. </li>
  71. <li> ::STARPU_SCHED_CTX_POLICY_MAX_PRIO, followed by a integer
  72. representing the maximum priority value to be defined for the
  73. scheduling policy.
  74. </li>
  75. <li> ::STARPU_SCHED_CTX_POLICY_INIT, followed by a function pointer
  76. (ie. void init_sched(void)) allowing to initialize the scheduling policy.
  77. </li>
  78. <li> ::STARPU_SCHED_CTX_USER_DATA, followed by a pointer
  79. to a custom user data structure, to be retrieved by \ref starpu_sched_ctx_get_user_data().
  80. </li>
  81. </ul>
  82. \def STARPU_SCHED_CTX_POLICY_NAME
  83. \ingroup API_Scheduling_Contexts
  84. Used when calling starpu_sched_ctx_create() to specify a
  85. name for a scheduling policy
  86. \def STARPU_SCHED_CTX_POLICY_STRUCT
  87. \ingroup API_Scheduling_Contexts
  88. Used when calling starpu_sched_ctx_create() to specify a
  89. pointer to a scheduling policy
  90. \def STARPU_SCHED_CTX_POLICY_MIN_PRIO
  91. \ingroup API_Scheduling_Contexts
  92. Used when calling starpu_sched_ctx_create() to specify a
  93. minimum scheduler priority value.
  94. \def STARPU_SCHED_CTX_POLICY_MAX_PRIO
  95. \ingroup API_Scheduling_Contexts
  96. Used when calling starpu_sched_ctx_create() to specify a
  97. maximum scheduler priority value.
  98. \def STARPU_SCHED_CTX_AWAKE_WORKERS
  99. \ingroup API_Scheduling_Contexts
  100. Used when calling starpu_sched_ctx_create() to specify a
  101. pointer to a scheduling policy
  102. \def STARPU_SCHED_CTX_POLICY_INIT
  103. \ingroup API_Scheduling_Contexts
  104. Used when calling starpu_sched_ctx_create() to specify a
  105. function pointer allowing to initialize the scheduling policy.
  106. \def STARPU_SCHED_CTX_USER_DATA
  107. \ingroup API_Scheduling_Contexts
  108. Used when calling starpu_sched_ctx_create() to specify a
  109. pointer to some user data related to the context being created.
  110. \def STARPU_SCHED_CTX_SUB_CTXS
  111. \ingroup API_Scheduling_Contexts
  112. Used when calling starpu_sched_ctx_create() to specify
  113. a list of sub contextes of the current context.
  114. \def STARPU_SCHED_CTX_CUDA_NSMS
  115. \ingroup API_Scheduling_Contexts
  116. Used when calling starpu_sched_ctx_create() in order
  117. to create a context on the NVIDIA GPU to specify the number of SMs
  118. the context should have
  119. \fn unsigned starpu_sched_ctx_create_inside_interval(const char *policy_name, const char *sched_ctx_name, int min_ncpus, int max_ncpus, int min_ngpus, int max_ngpus, unsigned allow_overlap)
  120. \ingroup API_Scheduling_Contexts
  121. Create a context indicating an approximate interval of resources
  122. \fn void starpu_sched_ctx_register_close_callback(unsigned sched_ctx_id, void (*close_callback)(unsigned sched_ctx_id, void* args), void *args)
  123. \ingroup API_Scheduling_Contexts
  124. Execute the callback whenever the last task of the context finished executing, it is called with the parameters \p sched_ctx and any other parameter needed
  125. by the application (packed in \p args)
  126. \fn void starpu_sched_ctx_add_workers(int *workerids_ctx, unsigned nworkers_ctx, unsigned sched_ctx_id)
  127. \ingroup API_Scheduling_Contexts
  128. Add dynamically the workers in \p workerids_ctx to the
  129. context \p sched_ctx_id. The last argument cannot be greater than
  130. \ref STARPU_NMAX_SCHED_CTXS.
  131. \fn void starpu_sched_ctx_remove_workers(int *workerids_ctx, unsigned nworkers_ctx, unsigned sched_ctx_id)
  132. \ingroup API_Scheduling_Contexts
  133. Remove the workers in \p workerids_ctx from the context
  134. \p sched_ctx_id. The last argument cannot be greater than
  135. STARPU_NMAX_SCHED_CTXS.
  136. \fn void starpu_sched_ctx_display_workers(unsigned sched_ctx_id, FILE *f)
  137. \ingroup API_Scheduling_Contexts
  138. Print on the file \p f the worker names belonging to the context \p sched_ctx_id
  139. \fn void starpu_sched_ctx_delete(unsigned sched_ctx_id)
  140. \ingroup API_Scheduling_Contexts
  141. Delete scheduling context \p sched_ctx_id and transfer remaining
  142. workers to the inheritor scheduling context.
  143. \fn void starpu_sched_ctx_set_inheritor(unsigned sched_ctx_id, unsigned inheritor)
  144. \ingroup API_Scheduling_Contexts
  145. Indicate which context whill inherit the resources of this context
  146. when he will be deleted.
  147. \fn void starpu_sched_ctx_set_context(unsigned *sched_ctx_id)
  148. \ingroup API_Scheduling_Contexts
  149. Set the scheduling context the subsequent tasks will be submitted to
  150. \fn unsigned starpu_sched_ctx_get_context(void)
  151. \ingroup API_Scheduling_Contexts
  152. Return the scheduling context the tasks are currently submitted to,
  153. or ::STARPU_NMAX_SCHED_CTXS if no default context has been defined
  154. by calling the function starpu_sched_ctx_set_context().
  155. \fn void starpu_sched_ctx_stop_task_submission(void)
  156. \ingroup API_Scheduling_Contexts
  157. Stop submitting tasks from the empty context list until the next time
  158. the context has time to check the empty context list
  159. \fn void starpu_sched_ctx_finished_submit(unsigned sched_ctx_id)
  160. \ingroup API_Scheduling_Contexts
  161. Indicate starpu that the application finished submitting to this
  162. context in order to move the workers to the inheritor as soon as
  163. possible.
  164. \fn unsigned starpu_sched_ctx_get_workers_list(unsigned sched_ctx_id, int **workerids)
  165. \ingroup API_Scheduling_Contexts
  166. Return the list of workers in the array \p workerids, the returned value is the
  167. number of workers. The user should free the \p workerids table after finishing
  168. using it (it is allocated inside the function with the proper size)
  169. \fn unsigned starpu_sched_ctx_get_workers_list_raw(unsigned sched_ctx_id, int **workerids)
  170. \ingroup API_Scheduling_Contexts
  171. Return the list of workers in the array \p workerids, the returned value is the
  172. number of workers. This list is provided in raw order, i.e. not sorted by tree or list order,
  173. and the user should not free the \p workerids table.
  174. This function is thus much less costly than starpu_sched_ctx_get_workers_list.
  175. \fn unsigned starpu_sched_ctx_get_nworkers(unsigned sched_ctx_id)
  176. \ingroup API_Scheduling_Contexts
  177. Return the number of workers managed by the specified contexts
  178. (Usually needed to verify if it manages any workers or if it should be
  179. blocked)
  180. \fn unsigned starpu_sched_ctx_get_nshared_workers(unsigned sched_ctx_id, unsigned sched_ctx_id2)
  181. \ingroup API_Scheduling_Contexts
  182. Return the number of workers shared by two contexts.
  183. \fn unsigned starpu_sched_ctx_contains_worker(int workerid, unsigned sched_ctx_id)
  184. \ingroup API_Scheduling_Contexts
  185. Return 1 if the worker belongs to the context and 0 otherwise
  186. \fn unsigned starpu_sched_ctx_worker_get_id(unsigned sched_ctx_id)
  187. \ingroup API_Scheduling_Contexts
  188. Return the workerid if the worker belongs to the context and -1 otherwise.
  189. If the thread calling this function is not a worker the function returns -1
  190. as it calls the function starpu_worker_get_id().
  191. \fn unsigned starpu_sched_ctx_overlapping_ctxs_on_worker(int workerid)
  192. \ingroup API_Scheduling_Contexts
  193. Check if a worker is shared between several contexts
  194. @name Scheduling Context Priorities
  195. \ingroup API_Scheduling_Contexts
  196. \def STARPU_MIN_PRIO
  197. \ingroup API_Scheduling_Contexts
  198. Provided for legacy reasons.
  199. \def STARPU_MAX_PRIO
  200. \ingroup API_Scheduling_Contexts
  201. Provided for legacy reasons.
  202. \def STARPU_DEFAULT_PRIO
  203. \ingroup API_Scheduling_Contexts
  204. By convention, the default priority level should be 0 so that we can
  205. statically allocate tasks with a default priority.
  206. \fn int starpu_sched_ctx_set_min_priority(unsigned sched_ctx_id, int min_prio)
  207. \ingroup API_Scheduling_Contexts
  208. Define the minimum task priority level supported by the scheduling
  209. policy of the given scheduler context. The default minimum priority
  210. level is the same as the default priority level which is 0 by
  211. convention. The application may access that value by calling the function
  212. starpu_sched_ctx_get_min_priority(). This function should only
  213. be called from the initialization method of the scheduling policy, and
  214. should not be used directly from the application.
  215. \fn int starpu_sched_ctx_set_max_priority(unsigned sched_ctx_id, int max_prio)
  216. \ingroup API_Scheduling_Contexts
  217. Define the maximum priority level supported by the scheduling policy
  218. of the given scheduler context. The default maximum priority level is
  219. 1. The application may access that value by calling the
  220. starpu_sched_ctx_get_max_priority function. This function should only
  221. be called from the initialization method of the scheduling policy, and
  222. should not be used directly from the application.
  223. \fn int starpu_sched_ctx_get_min_priority(unsigned sched_ctx_id)
  224. \ingroup API_Scheduling_Contexts
  225. Return the current minimum priority level supported by the scheduling
  226. policy of the given scheduler context.
  227. \fn int starpu_sched_ctx_get_max_priority(unsigned sched_ctx_id)
  228. \ingroup API_Scheduling_Contexts
  229. Return the current maximum priority level supported by the scheduling
  230. policy of the given scheduler context.
  231. \fn int starpu_sched_ctx_min_priority_is_set(unsigned sched_ctx_id)
  232. \ingroup API_Scheduling_Contexts
  233. todo
  234. \fn int starpu_sched_ctx_max_priority_is_set(unsigned sched_ctx_id)
  235. \ingroup API_Scheduling_Contexts
  236. todo
  237. \fn void *starpu_sched_ctx_get_user_data(unsigned sched_ctx_id)
  238. \ingroup API_Scheduling_Contexts
  239. Return the user data pointer associated to the scheduling context.
  240. @name Scheduling Context Worker Collection
  241. \ingroup API_Scheduling_Contexts
  242. \fn struct starpu_worker_collection *starpu_sched_ctx_create_worker_collection(unsigned sched_ctx_id, enum starpu_worker_collection_type type)
  243. \ingroup API_Scheduling_Contexts
  244. Create a worker collection of the type indicated by the last parameter
  245. for the context specified through the first parameter.
  246. \fn void starpu_sched_ctx_delete_worker_collection(unsigned sched_ctx_id)
  247. \ingroup API_Scheduling_Contexts
  248. Delete the worker collection of the specified scheduling context
  249. \fn struct starpu_worker_collection *starpu_sched_ctx_get_worker_collection(unsigned sched_ctx_id)
  250. \ingroup API_Scheduling_Contexts
  251. Return the worker collection managed by the indicated context
  252. @name Scheduling Context Link with Hypervisor
  253. \ingroup API_Scheduling_Contexts
  254. \fn void starpu_sched_ctx_set_perf_counters(unsigned sched_ctx_id, void *perf_counters)
  255. \ingroup API_Scheduling_Contexts
  256. Indicate to starpu the pointer to the performance counter
  257. \fn void starpu_sched_ctx_call_pushed_task_cb(int workerid, unsigned sched_ctx_id)
  258. \ingroup API_Scheduling_Contexts
  259. Callback that lets the scheduling policy tell the hypervisor that a
  260. task was pushed on a worker
  261. \fn void starpu_sched_ctx_notify_hypervisor_exists(void)
  262. \ingroup API_Scheduling_Contexts
  263. Allow the hypervisor to let starpu know he's initialised
  264. \fn unsigned starpu_sched_ctx_check_if_hypervisor_exists(void)
  265. \ingroup API_Scheduling_Contexts
  266. Ask starpu if he is informed if the hypervisor is initialised
  267. \fn void starpu_sched_ctx_set_policy_data(unsigned sched_ctx_id, void *policy_data)
  268. \ingroup API_Scheduling_Contexts
  269. Allocate the scheduling policy data (private information of the scheduler like queues, variables,
  270. additional condition variables) the context
  271. \fn void *starpu_sched_ctx_get_policy_data(unsigned sched_ctx_id)
  272. \ingroup API_Scheduling_Contexts
  273. Return the scheduling policy data (private information of the scheduler) of the contexts previously
  274. assigned to.
  275. \fn void *starpu_sched_ctx_exec_parallel_code(void* (*func)(void*), void *param, unsigned sched_ctx_id)
  276. \ingroup API_Scheduling_Contexts
  277. Execute any parallel code on the workers of the sched_ctx (workers are blocked)
  278. \fn int starpu_sched_ctx_get_nready_tasks(unsigned sched_ctx_id)
  279. \ingroup API_Scheduling_Contexts
  280. todo
  281. \fn double starpu_sched_ctx_get_nready_flops(unsigned sched_ctx_id)
  282. \ingroup API_Scheduling_Contexts
  283. todo
  284. */