StarPU Handbook
starpu_sched_component.h
Go to the documentation of this file.
1 /* StarPU --- Runtime system for heterogeneous multicore architectures.
2  *
3  * Copyright (C) 2017 Arthur Chevalier
4  * Copyright (C) 2013,2014,2017 Inria
5  * Copyright (C) 2014,2015,2017,2019 CNRS
6  * Copyright (C) 2014-2019 Université de Bordeaux
7  * Copyright (C) 2013 Simon Archipoff
8  *
9  * StarPU is free software; you can redistribute it and/or modify
10  * it under the terms of the GNU Lesser General Public License as published by
11  * the Free Software Foundation; either version 2.1 of the License, or (at
12  * your option) any later version.
13  *
14  * StarPU is distributed in the hope that it will be useful, but
15  * WITHOUT ANY WARRANTY; without even the implied warranty of
16  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
17  *
18  * See the GNU Lesser General Public License in COPYING.LGPL for more details.
19  */
20 
21 #ifndef __STARPU_SCHED_COMPONENT_H__
22 #define __STARPU_SCHED_COMPONENT_H__
23 
24 #include <starpu.h>
25 
26 #ifdef STARPU_HAVE_HWLOC
27 #include <hwloc.h>
28 #endif
29 
30 #ifdef __cplusplus
31 extern "C"
32 {
33 #endif
34 
44 {
49 };
50 
54 #define STARPU_SCHED_COMPONENT_IS_HOMOGENEOUS(component) ((component)->properties & STARPU_SCHED_COMPONENT_HOMOGENEOUS)
55 
59 #define STARPU_SCHED_COMPONENT_IS_SINGLE_MEMORY_NODE(component) ((component)->properties & STARPU_SCHED_COMPONENT_SINGLE_MEMORY_NODE)
60 
70 {
74  struct starpu_bitmap *workers;
81  struct starpu_bitmap *workers_in_ctx;
83  void *data;
84  char *name;
86  unsigned nchildren;
90  unsigned nparents;
93 
95  void (*add_child)(struct starpu_sched_component *component, struct starpu_sched_component *child);
97  void (*remove_child)(struct starpu_sched_component *component, struct starpu_sched_component *child);
98  void (*add_parent)(struct starpu_sched_component *component, struct starpu_sched_component *parent);
99  void (*remove_parent)(struct starpu_sched_component *component, struct starpu_sched_component *parent);
100 
111  int (*push_task)(struct starpu_sched_component *, struct starpu_task *);
112 
119  struct starpu_task *(*pull_task)(struct starpu_sched_component *from, struct starpu_sched_component *to);
120 
129  int (*can_push)(struct starpu_sched_component *from, struct starpu_sched_component *to);
130 
141  int (*can_pull)(struct starpu_sched_component *component);
142 
143  int (*notify)(struct starpu_sched_component* component, int message_ID, void* arg);
144 
150  double (*estimated_load)(struct starpu_sched_component *component);
155  double (*estimated_end)(struct starpu_sched_component *component);
156 
160  void (*deinit_data)(struct starpu_sched_component *component);
161 
165  void (*notify_change_workers)(struct starpu_sched_component *component);
166  int properties;
167 
168 #ifdef STARPU_HAVE_HWLOC
169 
175  hwloc_obj_t obj;
176 #else
177  void *obj;
178 #endif
179 };
180 
185 {
193  struct starpu_bitmap *workers;
197  unsigned sched_ctx_id;
202  starpu_pthread_mutex_t lock;
203 };
204 
205 void starpu_initialize_prio_center_policy(unsigned sched_ctx_id);
206 
220 struct starpu_sched_tree *starpu_sched_tree_get(unsigned sched_ctx_id);
232 int starpu_sched_tree_push_task(struct starpu_task *task);
237 
242 
247 
248 struct starpu_task* starpu_sched_component_pump_to(struct starpu_sched_component *component, struct starpu_sched_component *to, int* success);
249 struct starpu_task* starpu_sched_component_pump_downstream(struct starpu_sched_component *component, int* success);
250 int starpu_sched_component_send_can_push_to_parents(struct starpu_sched_component * component);
254 void starpu_sched_tree_add_workers(unsigned sched_ctx_id, int *workerids, unsigned nworkers);
258 void starpu_sched_tree_remove_workers(unsigned sched_ctx_id, int *workerids, unsigned nworkers);
259 
264 
272 typedef struct starpu_sched_component * (*starpu_sched_component_create_t)(struct starpu_sched_tree *tree, void *data);
273 
285 
296 
297 void starpu_sched_component_add_child(struct starpu_sched_component* component, struct starpu_sched_component * child);
298 
303 
310 int STARPU_WARN_UNUSED_RESULT starpu_sched_component_execute_preds(struct starpu_sched_component *component, struct starpu_task *task, double *length);
311 
315 double starpu_sched_component_transfer_length(struct starpu_sched_component *component, struct starpu_task *task);
316 
317 void starpu_sched_component_prefetch_on_node(struct starpu_sched_component *component, struct starpu_task *task);
318 
329 struct starpu_sched_component *starpu_sched_component_worker_get(unsigned sched_ctx, int workerid);
330 struct starpu_sched_component *starpu_sched_component_worker_new(unsigned sched_ctx, int workerid);
331 
335 struct starpu_sched_component *starpu_sched_component_parallel_worker_create(struct starpu_sched_tree *tree, unsigned nworkers, unsigned *workers);
336 
341 
346 
351 
356 
361 void starpu_sched_component_worker_pre_exec_hook(struct starpu_task *task, unsigned sched_ctx_id);
362 
366 void starpu_sched_component_worker_post_exec_hook(struct starpu_task *task, unsigned sched_ctx_id);
367 
379 
384 
389 
395 
400 
408 double starpu_sched_component_estimated_end_min_add(struct starpu_sched_component * component, double exp_len);
409 
414 
416 {
417  unsigned ntasks_threshold;
418  double exp_len_threshold;
419 };
420 
427 
432 
441 {
442  unsigned ntasks_threshold;
443  double exp_len_threshold;
444 };
445 struct starpu_sched_component *starpu_sched_component_prio_create(struct starpu_sched_tree *tree, struct starpu_sched_component_prio_data *prio_data) STARPU_ATTRIBUTE_MALLOC;
446 int starpu_sched_component_is_prio(struct starpu_sched_component *component);
447 
459 
464 
469 
481 
486 
494 struct starpu_sched_component *starpu_sched_component_eager_create(struct starpu_sched_tree *tree, void *arg) STARPU_ATTRIBUTE_MALLOC;
495 int starpu_sched_component_is_eager(struct starpu_sched_component *);
496 
502 struct starpu_sched_component *starpu_sched_component_eager_calibration_create(struct starpu_sched_tree *tree, void *arg) STARPU_ATTRIBUTE_MALLOC;
503 int starpu_sched_component_is_eager_calibration(struct starpu_sched_component *);
504 
513 {
514  double alpha;
515  double beta;
516  double _gamma;
517  double idle_power;
518 };
519 
526 
527 int starpu_sched_component_is_mct(struct starpu_sched_component *component);
528 
536 struct starpu_sched_component *starpu_sched_component_heft_create(struct starpu_sched_tree *tree, struct starpu_sched_component_mct_data *mct_data) STARPU_ATTRIBUTE_MALLOC;
537 int starpu_sched_component_is_heft(struct starpu_sched_component *component);
538 
553 
562 {
563  struct starpu_sched_component *calibrator_component;
564  struct starpu_sched_component *no_perfmodel_component;
565  struct starpu_sched_component *perfmodel_component;
566 };
567 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) STARPU_ATTRIBUTE_MALLOC;
568 int starpu_sched_component_is_perfmodel_select(struct starpu_sched_component *component);
569 
580 struct starpu_sched_component_composed_recipe;
581 
585 struct starpu_sched_component_composed_recipe *starpu_sched_component_composed_recipe_create(void) STARPU_ATTRIBUTE_MALLOC;
586 
590 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) STARPU_ATTRIBUTE_MALLOC;
591 
595 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);
596 
600 void starpu_sched_component_composed_recipe_destroy(struct starpu_sched_component_composed_recipe *);
601 
606 struct starpu_sched_component *starpu_sched_component_composed_component_create(struct starpu_sched_tree *tree, struct starpu_sched_component_composed_recipe *recipe) STARPU_ATTRIBUTE_MALLOC;
607 
608 #ifdef STARPU_HAVE_HWLOC
609 
614 {
619  struct starpu_sched_component_composed_recipe *hwloc_machine_composed_sched_component;
623  struct starpu_sched_component_composed_recipe *hwloc_component_composed_sched_component;
627  struct starpu_sched_component_composed_recipe *hwloc_socket_composed_sched_component;
631  struct starpu_sched_component_composed_recipe *hwloc_cache_composed_sched_component;
632 
637  struct starpu_sched_component_composed_recipe *(*worker_composed_sched_component)(enum starpu_worker_archtype archtype);
645 };
646 
647 
652 #endif /* STARPU_HAVE_HWLOC */
653 
659 #define STARPU_SCHED_SIMPLE_DECIDE_MASK (3<<0)
660 
664 #define STARPU_SCHED_SIMPLE_DECIDE_WORKERS (1<<0)
665 
669 #define STARPU_SCHED_SIMPLE_DECIDE_MEMNODES (2<<0)
670 
674 #define STARPU_SCHED_SIMPLE_DECIDE_ARCHS (3<<0)
675 
680 #define STARPU_SCHED_SIMPLE_PERFMODEL (1<<4)
681 
685 #define STARPU_SCHED_SIMPLE_IMPL (1<<5)
686 
692 #define STARPU_SCHED_SIMPLE_FIFO_ABOVE (1<<6)
693 
697 #define STARPU_SCHED_SIMPLE_FIFO_ABOVE_PRIO (1<<7)
698 
704 #define STARPU_SCHED_SIMPLE_FIFOS_BELOW (1<<8)
705 
709 #define STARPU_SCHED_SIMPLE_FIFOS_BELOW_PRIO (1<<9)
710 
714 #define STARPU_SCHED_SIMPLE_WS_BELOW (1<<10)
715 
719 #define STARPU_SCHED_SIMPLE_COMBINED_WORKERS (1<<11)
720 
728 void starpu_sched_component_initialize_simple_scheduler(starpu_sched_component_create_t create_decision_component, void *data, unsigned flags, unsigned sched_ctx_id);
729 
732 #define STARPU_COMPONENT_MUTEX_LOCK(m) \
733 do \
734 { \
735  const int _relaxed_state = starpu_worker_get_relax_state(); \
736  if (!_relaxed_state) \
737  starpu_worker_relax_on(); \
738  STARPU_PTHREAD_MUTEX_LOCK((m)); \
739  if (!_relaxed_state) \
740  starpu_worker_relax_off(); \
741 } \
742 while(0)
743 
744 #define STARPU_COMPONENT_MUTEX_TRYLOCK(m) STARPU_PTHREAD_MUTEX_TRYLOCK((m))
745 
746 #define STARPU_COMPONENT_MUTEX_UNLOCK(m) STARPU_PTHREAD_MUTEX_UNLOCK((m))
747 
750 #ifdef __cplusplus
751 }
752 #endif
753 
754 #endif /* __STARPU_SCHED_COMPONENT_H__ */
struct starpu_sched_component * starpu_sched_component_composed_component_create(struct starpu_sched_tree *tree, struct starpu_sched_component_composed_recipe *recipe) STARPU_ATTRIBUTE_MALLOC
void * data
Definition: starpu_sched_component.h:83
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)
uint32_t * workerids
Definition: starpu_task.h:964
unsigned nparents
Definition: starpu_sched_component.h:90
void(* add_child)(struct starpu_sched_component *component, struct starpu_sched_component *child)
Definition: starpu_sched_component.h:95
void starpu_sched_tree_remove_workers(unsigned sched_ctx_id, int *workerids, unsigned nworkers)
int starpu_sched_tree_push_task(struct starpu_task *task)
struct starpu_sched_tree * tree
Definition: starpu_sched_component.h:72
int starpu_sched_component_is_simple_worker(struct starpu_sched_component *component)
#define STARPU_ATTRIBUTE_MALLOC
Definition: starpu_util.h:114
void starpu_sched_tree_update_workers(struct starpu_sched_tree *t)
struct starpu_bitmap * workers_in_ctx
Definition: starpu_sched_component.h:81
void starpu_sched_component_destroy_rec(struct starpu_sched_component *component)
void starpu_sched_component_initialize_simple_scheduler(starpu_sched_component_create_t create_decision_component, void *data, unsigned flags, unsigned sched_ctx_id)
void starpu_sched_tree_destroy(struct starpu_sched_tree *tree)
int(* push_task)(struct starpu_sched_component *, struct starpu_task *)
Definition: starpu_sched_component.h:111
struct starpu_sched_component * starpu_sched_component_fifo_create(struct starpu_sched_tree *tree, struct starpu_sched_component_fifo_data *fifo_data) STARPU_ATTRIBUTE_MALLOC
struct starpu_sched_component_composed_recipe * starpu_sched_component_composed_recipe_create(void) STARPU_ATTRIBUTE_MALLOC
unsigned nchildren
Definition: starpu_sched_component.h:86
int starpu_sched_component_can_pull_all(struct starpu_sched_component *component)
struct starpu_sched_component * starpu_sched_component_best_implementation_create(struct starpu_sched_tree *tree, void *arg) STARPU_ATTRIBUTE_MALLOC
Definition: starpu_sched_component.h:46
starpu_worker_archtype
Definition: starpu_worker.h:61
Definition: starpu_sched_component.h:440
struct starpu_sched_component * starpu_sched_component_work_stealing_create(struct starpu_sched_tree *tree, void *arg) STARPU_ATTRIBUTE_MALLOC
double starpu_sched_component_estimated_end_min(struct starpu_sched_component *component)
Definition: starpu_sched_component.h:512
int starpu_sched_component_can_pull(struct starpu_sched_component *component)
double starpu_sched_component_estimated_end_average(struct starpu_sched_component *component)
unsigned sched_ctx
Definition: starpu_task.h:1038
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) STARPU_ATTRIBUTE_MALLOC
void starpu_sched_component_destroy(struct starpu_sched_component *component)
struct starpu_sched_component_composed_recipe * hwloc_socket_composed_sched_component
Definition: starpu_sched_component.h:627
double(* estimated_load)(struct starpu_sched_component *component)
Definition: starpu_sched_component.h:150
void(* deinit_data)(struct starpu_sched_component *component)
Definition: starpu_sched_component.h:160
struct starpu_sched_component ** parents
Definition: starpu_sched_component.h:92
Definition: starpu_sched_component.h:184
Definition: starpu_sched_component.h:48
int starpu_sched_component_is_fifo(struct starpu_sched_component *component)
Definition: starpu_task.h:548
struct starpu_sched_component_composed_recipe * hwloc_component_composed_sched_component
Definition: starpu_sched_component.h:623
struct starpu_sched_component ** children
Definition: starpu_sched_component.h:88
struct starpu_sched_component * starpu_sched_component_random_create(struct starpu_sched_tree *tree, void *arg) STARPU_ATTRIBUTE_MALLOC
void starpu_sched_tree_update_workers_in_ctx(struct starpu_sched_tree *t)
void starpu_sched_component_composed_recipe_destroy(struct starpu_sched_component_composed_recipe *)
void(* remove_child)(struct starpu_sched_component *component, struct starpu_sched_component *child)
Definition: starpu_sched_component.h:97
struct starpu_sched_tree * starpu_sched_component_make_scheduler(unsigned sched_ctx_id, struct starpu_sched_component_specs s)
Definition: starpu_sched_component.h:415
hwloc_obj_t obj
Definition: starpu_sched_component.h:175
struct starpu_task * starpu_sched_component_pull_task(struct starpu_sched_component *from, struct starpu_sched_component *to)
struct starpu_sched_component_composed_recipe * hwloc_cache_composed_sched_component
Definition: starpu_sched_component.h:631
Definition: starpu_sched_component.h:613
int STARPU_WARN_UNUSED_RESULT starpu_sched_component_execute_preds(struct starpu_sched_component *component, struct starpu_task *task, double *length)
void starpu_sched_component_worker_pre_exec_hook(struct starpu_task *task, unsigned sched_ctx_id)
int(* can_pull)(struct starpu_sched_component *component)
Definition: starpu_sched_component.h:141
struct starpu_sched_component * starpu_sched_component_create(struct starpu_sched_tree *tree, const char *name) STARPU_ATTRIBUTE_MALLOC
void starpu_sched_component_connect(struct starpu_sched_component *parent, struct starpu_sched_component *child)
int starpu_sched_component_push_task(struct starpu_sched_component *from, struct starpu_sched_component *to, struct starpu_task *task)
struct starpu_sched_component * starpu_sched_component_mct_create(struct starpu_sched_tree *tree, struct starpu_sched_component_mct_data *mct_data) STARPU_ATTRIBUTE_MALLOC
int starpu_sched_component_can_push(struct starpu_sched_component *component, struct starpu_sched_component *to)
double starpu_sched_component_transfer_length(struct starpu_sched_component *component, struct starpu_task *task)
starpu_sched_component_properties
Definition: starpu_sched_component.h:43
void starpu_sched_component_worker_post_exec_hook(struct starpu_task *task, unsigned sched_ctx_id)
struct starpu_task * starpu_sched_tree_pop_task(unsigned sched_ctx)
int starpu_sched_component_is_work_stealing(struct starpu_sched_component *component)
int mix_heterogeneous_workers
Definition: starpu_sched_component.h:644
struct starpu_bitmap * workers
Definition: starpu_sched_component.h:74
struct starpu_sched_component * starpu_sched_component_parallel_worker_create(struct starpu_sched_tree *tree, unsigned nworkers, unsigned *workers)
struct starpu_sched_component_composed_recipe * hwloc_machine_composed_sched_component
Definition: starpu_sched_component.h:619
struct starpu_sched_component * starpu_sched_component_worker_get(unsigned sched_ctx, int workerid)
int starpu_sched_component_worker_get_workerid(struct starpu_sched_component *worker_component)
double starpu_sched_component_estimated_load(struct starpu_sched_component *component)
Definition: starpu_sched_component.h:561
double(* estimated_end)(struct starpu_sched_component *component)
Definition: starpu_sched_component.h:155
int starpu_sched_tree_work_stealing_push_task(struct starpu_task *task)
starpu_pthread_mutex_t lock
Definition: starpu_sched_component.h:202
void starpu_sched_tree_add_workers(unsigned sched_ctx_id, int *workerids, unsigned nworkers)
unsigned sched_ctx_id
Definition: starpu_sched_component.h:197
struct starpu_bitmap * workers
Definition: starpu_sched_component.h:193
int starpu_sched_component_is_worker(struct starpu_sched_component *component)
void(* notify_change_workers)(struct starpu_sched_component *component)
Definition: starpu_sched_component.h:165
int(* can_push)(struct starpu_sched_component *from, struct starpu_sched_component *to)
Definition: starpu_sched_component.h:129
Definition: starpu_sched_component.h:69
int starpu_sched_component_is_random(struct starpu_sched_component *)
double starpu_sched_component_estimated_end_min_add(struct starpu_sched_component *component, double exp_len)
struct starpu_sched_tree * starpu_sched_tree_create(unsigned sched_ctx_id) STARPU_ATTRIBUTE_MALLOC
struct starpu_sched_component * root
Definition: starpu_sched_component.h:189
int starpu_sched_component_is_combined_worker(struct starpu_sched_component *component)
int starpu_sched_component_can_execute_task(struct starpu_sched_component *component, struct starpu_task *task)