scheduling_policy.doxy 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238
  1. /*
  2. * This file is part of the StarPU Handbook.
  3. * Copyright (C) 2009--2011 Universit@'e de Bordeaux
  4. * Copyright (C) 2010, 2011, 2012, 2013, 2014 CNRS
  5. * Copyright (C) 2011, 2012 INRIA
  6. * See the file version.doxy for copying conditions.
  7. */
  8. /*! \defgroup API_Scheduling_Policy Scheduling Policy
  9. \brief TODO. While StarPU comes with a variety of scheduling policies
  10. (see \ref TaskSchedulingPolicy), it may sometimes be desirable to
  11. implement custom policies to address specific problems. The API
  12. described below allows users to write their own scheduling policy.
  13. \struct starpu_sched_policy
  14. \ingroup API_Scheduling_Policy
  15. This structure contains all the methods that implement a
  16. scheduling policy. An application may specify which scheduling
  17. strategy in the field starpu_conf::sched_policy passed to the function
  18. starpu_init().
  19. For each task going through the scheduler, the following methods get called in the given order:
  20. <ul>
  21. <li>starpu_sched_policy::submit_hook when the task is submitted</li>
  22. <li>starpu_sched_policy::push_task when the task becomes ready. The scheduler is here <b>given</b> the task</li>
  23. <li>starpu_sched_policy::pop_task when a worker is idle. The scheduler here <b>gives</b> back the task to the core</li>
  24. <li>starpu_sched_policy::pre_exec_hook right before the worker actually starts the task computation (after transferring any missing data).</li>
  25. <li>starpu_sched_policy::post_exec_hook right after the worker actually completed the task computation.</li>
  26. </ul>
  27. For each task not going through the scheduler (because starpu_task::execute_on_a_specific_worker was set), these get called:
  28. <ul>
  29. <li>starpu_sched_policy::submit_hook when the task is submitted</li>
  30. <li>starpu_sched_policy::push_task_notify when the task becomes ready. This is just a notification, the scheduler does not have to do anything about the task.</li>
  31. <li>starpu_sched_policy::pre_exec_hook right before the worker actually starts the task computation (after transferring any missing data).</li>
  32. <li>starpu_sched_policy::post_exec_hook right after the worker actually completed the task computation.</li>
  33. </ul>
  34. \var void (*starpu_sched_policy::init_sched)(unsigned sched_ctx_id)
  35. Initialize the scheduling policy, called before any other method.
  36. \var void (*starpu_sched_policy::deinit_sched)(unsigned sched_ctx_id)
  37. Cleanup the scheduling policy, called before any other method.
  38. \var int (*starpu_sched_policy::push_task)(struct starpu_task *)
  39. Insert a task into the scheduler, called when the task becomes ready for
  40. execution.
  41. \var void (*starpu_sched_policy::push_task_notify)(struct starpu_task *, int workerid, int perf_workerid, unsigned sched_ctx_id)
  42. Notify the scheduler that a task was pushed on a given worker.
  43. This method is called when a task that was explicitly
  44. assigned to a worker becomes ready and is about to be executed
  45. by the worker. This method therefore permits to keep the state
  46. of the scheduler coherent even when StarPU bypasses the
  47. scheduling strategy.
  48. \var struct starpu_task *(*starpu_sched_policy::pop_task)(unsigned sched_ctx_id)
  49. Get a task from the scheduler. The mutex associated to the
  50. worker is already taken when this method is called. If this
  51. method is defined as NULL, the worker will only execute tasks
  52. from its local queue. In this case, the push_task method
  53. should use the starpu_push_local_task method to assign tasks
  54. to the different workers.
  55. \var struct starpu_task *(*starpu_sched_policy::pop_every_task)(unsigned sched_ctx_id)
  56. Remove all available tasks from the scheduler (tasks are
  57. chained by the means of the field starpu_task::prev and
  58. starpu_task::next). The mutex associated to the worker is
  59. already taken when this method is called. This is currently
  60. not used and can be discarded.
  61. \var void (*starpu_sched_policy::submit_hook)(struct starpu_task *)
  62. Optional field. This method is called when a task is submitted.
  63. \var void (*starpu_sched_policy::pre_exec_hook)(struct starpu_task *)
  64. Optional field. This method is called every time a task is starting.
  65. \var void (*starpu_sched_policy::post_exec_hook)(struct starpu_task *)
  66. Optional field. This method is called every time a task has been executed.
  67. \var void (*starpu_sched_policy::do_schedule)(unsigned sched_ctx_id)
  68. Optional field. This method is called when it is a good time to start
  69. scheduling tasks. This is notably called when the application calls
  70. starpu_task_wait_for_all or starpu_do_schedule explicitly.
  71. \var void (*starpu_sched_policy::add_workers)(unsigned sched_ctx_id, int *workerids, unsigned nworkers)
  72. Initialize scheduling structures corresponding to each worker used by the policy.
  73. \var void (*starpu_sched_policy::remove_workers)(unsigned sched_ctx_id, int *workerids, unsigned nworkers)
  74. Deinitialize scheduling structures corresponding to each worker used by the policy.
  75. \var const char *starpu_sched_policy::policy_name
  76. Optional field. Name of the policy.
  77. \var const char *starpu_sched_policy::policy_description
  78. Optional field. Human readable description of the policy.
  79. \fn struct starpu_sched_policy **starpu_sched_get_predefined_policies()
  80. \ingroup API_Scheduling_Policy
  81. Return an NULL-terminated array of all the predefined scheduling
  82. policies.
  83. \fn void starpu_worker_get_sched_condition(int workerid, starpu_pthread_mutex_t **sched_mutex, starpu_pthread_cond_t **sched_cond)
  84. \ingroup API_Scheduling_Policy
  85. When there is no available task for a worker, StarPU blocks this
  86. worker on a condition variable. This function specifies which
  87. condition variable (and the associated mutex) should be used to block
  88. (and to wake up) a worker. Note that multiple workers may use the same
  89. condition variable. For instance, in the case of a scheduling strategy
  90. with a single task queue, the same condition variable would be used to
  91. block and wake up all workers.
  92. \fn int starpu_sched_set_min_priority(int min_prio)
  93. \ingroup API_Scheduling_Policy
  94. TODO: check if this is correct
  95. Defines the minimum task priority level supported by the scheduling
  96. policy. The default minimum priority level is the same as the default
  97. priority level which is 0 by convention. The application may access
  98. that value by calling the function starpu_sched_get_min_priority().
  99. This function should only be called from the initialization method of
  100. the scheduling policy, and should not be used directly from the
  101. application.
  102. \fn int starpu_sched_set_max_priority(int max_prio)
  103. \ingroup API_Scheduling_Policy
  104. TODO: check if this is correct
  105. Defines the maximum priority level supported by the scheduling policy.
  106. The default maximum priority level is 1. The application may access
  107. that value by calling the function starpu_sched_get_max_priority().
  108. This function should only be called from the initialization method of
  109. the scheduling policy, and should not be used directly from the
  110. application.
  111. \fn int starpu_sched_get_min_priority(void)
  112. \ingroup API_Scheduling_Policy
  113. TODO: check if this is correct
  114. Returns the current minimum priority level supported by the scheduling
  115. policy
  116. \fn int starpu_sched_get_max_priority(void)
  117. \ingroup API_Scheduling_Policy
  118. TODO: check if this is correct
  119. Returns the current maximum priority level supported by the scheduling
  120. policy
  121. \fn int starpu_push_local_task(int workerid, struct starpu_task *task, int back)
  122. \ingroup API_Scheduling_Policy
  123. The scheduling policy may put tasks directly into a worker’s local
  124. queue so that it is not always necessary to create its own queue when
  125. the local queue is sufficient. If \p back is not 0, \p task is put
  126. at the back of the queue where the worker will pop tasks first.
  127. Setting \p back to 0 therefore ensures a FIFO ordering.
  128. \fn int starpu_push_task_end(struct starpu_task *task)
  129. \ingroup API_Scheduling_Policy
  130. This function must be called by a scheduler to notify that the given
  131. task has just been pushed.
  132. \fn int starpu_worker_can_execute_task(unsigned workerid, struct starpu_task *task, unsigned nimpl)
  133. \ingroup API_Scheduling_Policy
  134. Check if the worker specified by workerid can execute the codelet.
  135. Schedulers need to call it before assigning a task to a worker,
  136. otherwise the task may fail to execute.
  137. \fn int starpu_worker_can_execute_task_impl(unsigned workerid, struct starpu_task *task, unsigned *impl_mask)
  138. \ingroup API_Scheduling_Policy
  139. Check if the worker specified by workerid can execute the codelet and returns
  140. which implementation numbers can be used.
  141. Schedulers need to call it before assigning a task to a worker,
  142. otherwise the task may fail to execute.
  143. This should be preferred rather than calling starpu_worker_can_execute_task for
  144. each and every implementation. It can also be used with impl_mask == NULL to
  145. check for at least one implementation without determining which.
  146. \fn int starpu_worker_can_execute_task_first_impl(unsigned workerid, struct starpu_task *task, unsigned *nimpl)
  147. \ingroup API_Scheduling_Policy
  148. Check if the worker specified by workerid can execute the codelet and returns
  149. the first implementation which can be used.
  150. Schedulers need to call it before assigning a task to a worker,
  151. otherwise the task may fail to execute.
  152. This should be preferred rather than calling starpu_worker_can_execute_task for
  153. each and every implementation. It can also be used with impl_mask == NULL to
  154. check for at least one implementation without determining which.
  155. \fn uint32_t starpu_task_footprint(struct starpu_perfmodel *model, struct starpu_task *task, struct starpu_perfmodel_arch *arch, unsigned nimpl)
  156. \ingroup API_Scheduling_Policy
  157. Returns the footprint for a given task, taking into account user-provided
  158. perfmodel footprint or size_base functions.
  159. \fn uint32_t starpu_task_data_footprint(struct starpu_task *task)
  160. \ingroup API_Scheduling_Policy
  161. Returns the raw footprint for the data of a given task (without taking into account user-provided functions).
  162. \fn double starpu_task_expected_length(struct starpu_task *task, struct starpu_perfmodel_arch *arch, unsigned nimpl)
  163. \ingroup API_Scheduling_Policy
  164. Returns expected task duration in micro-seconds.
  165. \fn double starpu_worker_get_relative_speedup(struct starpu_perfmodel_arch *perf_arch)
  166. \ingroup API_Scheduling_Policy
  167. Returns an estimated speedup factor relative to CPU speed
  168. \fn double starpu_task_expected_data_transfer_time(unsigned memory_node, struct starpu_task *task)
  169. \ingroup API_Scheduling_Policy
  170. Returns expected data transfer time in micro-seconds.
  171. \fn double starpu_data_expected_transfer_time(starpu_data_handle_t handle, unsigned memory_node, enum starpu_data_access_mode mode)
  172. \ingroup API_Scheduling_Policy
  173. Predict the transfer time (in micro-seconds) to move \p handle to a memory node
  174. \fn double starpu_task_expected_power(struct starpu_task *task, struct starpu_perfmodel_arch *arch, unsigned nimpl)
  175. \ingroup API_Scheduling_Policy
  176. Returns expected power consumption in J
  177. \fn double starpu_task_expected_conversion_time(struct starpu_task *task, struct starpu_perfmodel_arch *arch, unsigned nimpl)
  178. \ingroup API_Scheduling_Policy
  179. Returns expected conversion time in ms (multiformat interface only)
  180. \fn int starpu_get_prefetch_flag(void)
  181. \ingroup API_Scheduling_Policy
  182. Whether \ref STARPU_PREFETCH was set
  183. \fn int starpu_prefetch_task_input_on_node(struct starpu_task *task, unsigned node)
  184. \ingroup API_Scheduling_Policy
  185. Prefetch data for a given task on a given node
  186. \fn int starpu_idle_prefetch_task_input_on_node(struct starpu_task *task, unsigned node)
  187. \ingroup API_Scheduling_Policy
  188. Prefetch data for a given task on a given node when the bus is idle
  189. \fn void starpu_sched_ctx_worker_shares_tasks_lists(int workerid, int sched_ctx_id)
  190. \ingroup API_Scheduling_Policy
  191. The scheduling policies indicates if the worker may pop tasks from the list of other workers
  192. or if there is a central list with task for all the workers
  193. \fn void _starpu_graph_compute_depths(void)
  194. \ingroup API_Scheduling_policy
  195. This make StarPU compute for each task the depth, i.e. the length of the
  196. longest path to a task without outgoing dependencies.
  197. \fn void _starpu_graph_foreach(void (*func)(void *data, struct _starpu_job *job), void *data)
  198. \ingroup API_Scheduling_policy
  199. This calls \e func for each node of the task graph, passing also \e data as it
  200. is.
  201. */