sched_ctx.h 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180
  1. /* StarPU --- Runtime system for heterogeneous multicore architectures.
  2. *
  3. * Copyright (C) 2011, 2013 INRIA
  4. *
  5. * StarPU is free software; you can redistribute it and/or modify
  6. * it under the terms of the GNU Lesser General Public License as published by
  7. * the Free Software Foundation; either version 2.1 of the License, or (at
  8. * your option) any later version.
  9. *
  10. * StarPU is distributed in the hope that it will be useful, but
  11. * WITHOUT ANY WARRANTY; without even the implied warranty of
  12. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  13. *
  14. * See the GNU Lesser General Public License in COPYING.LGPL for more details.
  15. */
  16. #ifndef __SCHED_CONTEXT_H__
  17. #define __SCHED_CONTEXT_H__
  18. #include <starpu.h>
  19. #include <starpu_sched_ctx.h>
  20. #include <starpu_sched_ctx_hypervisor.h>
  21. #include <starpu_scheduler.h>
  22. #include <common/config.h>
  23. #include <common/barrier_counter.h>
  24. #include <profiling/profiling.h>
  25. #include <semaphore.h>
  26. #include "sched_ctx_list.h"
  27. #ifdef STARPU_HAVE_HWLOC
  28. #include <hwloc.h>
  29. #endif
  30. #define NO_RESIZE -1
  31. #define REQ_RESIZE 0
  32. #define DO_RESIZE 1
  33. #define STARPU_GLOBAL_SCHED_CTX 0
  34. struct _starpu_sched_ctx
  35. {
  36. /* id of the context used in user mode*/
  37. unsigned id;
  38. /* name of context */
  39. const char *name;
  40. /* policy of the context */
  41. struct starpu_sched_policy *sched_policy;
  42. /* data necessary for the policy */
  43. void *policy_data;
  44. struct starpu_worker_collection *workers;
  45. /* we keep an initial sched which we never delete */
  46. unsigned is_initial_sched;
  47. /* wait for the tasks submitted to the context to be executed */
  48. struct _starpu_barrier_counter tasks_barrier;
  49. /* cond to block push when there are no workers in the ctx */
  50. starpu_pthread_cond_t no_workers_cond;
  51. /* mutex to block push when there are no workers in the ctx */
  52. starpu_pthread_mutex_t no_workers_mutex;
  53. /*ready tasks that couldn't be pushed because the ctx has no workers*/
  54. struct starpu_task_list empty_ctx_tasks;
  55. /* mutext protecting empty_ctx_tasks list */
  56. starpu_pthread_mutex_t empty_ctx_mutex;
  57. /* min CPUs to execute*/
  58. int min_ncpus;
  59. /* max CPUs to execute*/
  60. int max_ncpus;
  61. /* min GPUs to execute*/
  62. int min_ngpus;
  63. /* max GPUs to execute*/
  64. int max_ngpus;
  65. /* needed for overlapping contexts to help the workers
  66. determine which is the next context to pop tasks from */
  67. unsigned pop_counter[STARPU_NMAXWORKERS];
  68. /* in case we delete the context leave resources to the inheritor*/
  69. unsigned inheritor;
  70. /* indicates whether the application finished submitting tasks
  71. to this context*/
  72. unsigned finished_submit;
  73. /* By default we have a binary type of priority: either a task is a priority
  74. * task (level 1) or it is not (level 0). */
  75. int min_priority;
  76. int max_priority;
  77. /* semaphore that block appl thread until threads are ready
  78. to exec the parallel code */
  79. sem_t parallel_code_sem;
  80. /* hwloc tree structure of workers */
  81. #ifdef STARPU_HAVE_HWLOC
  82. hwloc_bitmap_t hwloc_workers_set;
  83. #endif
  84. #ifdef STARPU_USE_SC_HYPERVISOR
  85. /* a structure containing a series of performance counters determining the resize procedure */
  86. struct starpu_sched_ctx_performance_counters *perf_counters;
  87. #endif //STARPU_USE_SC_HYPERVISOR
  88. void (*close_callback)(unsigned sched_ctx_id, void* args);
  89. void *close_args;
  90. };
  91. struct _starpu_machine_config;
  92. /* init sched_ctx_id of all contextes*/
  93. void _starpu_init_all_sched_ctxs(struct _starpu_machine_config *config);
  94. /* allocate all structures belonging to a context */
  95. struct _starpu_sched_ctx* _starpu_create_sched_ctx(struct starpu_sched_policy *policy, int *workerid, int nworkerids, unsigned is_init_sched, const char *sched_name);
  96. /* delete all sched_ctx */
  97. void _starpu_delete_all_sched_ctxs();
  98. /* This function waits until all the tasks that were already submitted to a specific
  99. * context have been executed. */
  100. int _starpu_wait_for_all_tasks_of_sched_ctx(unsigned sched_ctx_id);
  101. /* In order to implement starpu_wait_for_all_tasks_of_ctx, we keep track of the number of
  102. * task currently submitted to the context */
  103. void _starpu_decrement_nsubmitted_tasks_of_sched_ctx(unsigned sched_ctx_id);
  104. void _starpu_increment_nsubmitted_tasks_of_sched_ctx(unsigned sched_ctx_id);
  105. /* Return the corresponding index of the workerid in the ctx table */
  106. int _starpu_get_index_in_ctx_of_workerid(unsigned sched_ctx, unsigned workerid);
  107. /* Get the total number of sched_ctxs created till now */
  108. unsigned _starpu_get_nsched_ctxs();
  109. /* Get the mutex corresponding to the global workerid */
  110. starpu_pthread_mutex_t *_starpu_get_sched_mutex(struct _starpu_sched_ctx *sched_ctx, int worker);
  111. /* Get workers belonging to a certain context, it returns the number of workers
  112. take care: no mutex taken, the list of workers might not be updated */
  113. int starpu_get_workers_of_sched_ctx(unsigned sched_ctx_id, int *pus, enum starpu_worker_archtype arch);
  114. /* Let the worker know it does not belong to the context and that
  115. it should stop poping from it */
  116. void _starpu_worker_gets_out_of_ctx(unsigned sched_ctx_id, struct _starpu_worker *worker);
  117. /* Check if the worker belongs to another sched_ctx */
  118. unsigned _starpu_worker_belongs_to_a_sched_ctx(int workerid, unsigned sched_ctx_id);
  119. /* mutex synchronising several simultaneous modifications of a context */
  120. starpu_pthread_mutex_t* _starpu_sched_ctx_get_changing_ctx_mutex(unsigned sched_ctx_id);
  121. /* indicates wheather this worker should go to sleep or not
  122. (if it is the last one awake in a context he should better keep awake) */
  123. unsigned _starpu_sched_ctx_last_worker_awake(struct _starpu_worker *worker);
  124. /*rebind each thread on its cpu after finishing a parallel code */
  125. void _starpu_sched_ctx_rebind_thread_to_its_cpu(unsigned cpuid);
  126. /* let the appl know that the worker blocked to execute parallel code */
  127. void _starpu_sched_ctx_signal_worker_blocked(int workerid);
  128. #ifdef STARPU_USE_SC_HYPERVISOR
  129. /* Notifies the hypervisor that a tasks was poped from the workers' list */
  130. void _starpu_sched_ctx_call_poped_task_cb(int workerid, struct starpu_task *task, size_t data_size, uint32_t footprint);
  131. #endif //STARPU_USE_SC_HYPERVISOR
  132. #endif // __SCHED_CONTEXT_H__