StarPU Handbook - StarPU Installation
starpu_sched_component.h
Go to the documentation of this file.
1 /* StarPU --- Runtime system for heterogeneous multicore architectures.
2  *
3  * Copyright (C) 2013-2022 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria
4  * Copyright (C) 2013 Simon Archipoff
5  * Copyright (C) 2017 Arthur Chevalier
6  *
7  * StarPU is free software; you can redistribute it and/or modify
8  * it under the terms of the GNU Lesser General Public License as published by
9  * the Free Software Foundation; either version 2.1 of the License, or (at
10  * your option) any later version.
11  *
12  * StarPU is distributed in the hope that it will be useful, but
13  * WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
15  *
16  * See the GNU Lesser General Public License in COPYING.LGPL for more details.
17  */
18 
19 #ifndef __STARPU_SCHED_COMPONENT_H__
20 #define __STARPU_SCHED_COMPONENT_H__
21 
22 #include <starpu.h>
23 
24 #ifdef STARPU_HAVE_HWLOC
25 #include <hwloc.h>
26 #endif
27 
28 #ifdef __cplusplus
29 extern "C" {
30 #endif
31 
41 {
44 };
45 
49 #define STARPU_SCHED_COMPONENT_IS_HOMOGENEOUS(component) ((component)->properties & STARPU_SCHED_COMPONENT_HOMOGENEOUS)
50 
54 #define STARPU_SCHED_COMPONENT_IS_SINGLE_MEMORY_NODE(component) ((component)->properties & STARPU_SCHED_COMPONENT_SINGLE_MEMORY_NODE)
55 
65 {
69  struct starpu_bitmap workers;
78  void *data;
79  char *name;
81  unsigned nchildren;
85  unsigned nparents;
88 
90  void (*add_child)(struct starpu_sched_component *component, struct starpu_sched_component *child);
92  void (*remove_child)(struct starpu_sched_component *component, struct starpu_sched_component *child);
93  void (*add_parent)(struct starpu_sched_component *component, struct starpu_sched_component *parent);
94  void (*remove_parent)(struct starpu_sched_component *component, struct starpu_sched_component *parent);
95 
106  int (*push_task)(struct starpu_sched_component *, struct starpu_task *);
107 
114  struct starpu_task *(*pull_task)(struct starpu_sched_component *from, struct starpu_sched_component *to);
115 
124  int (*can_push)(struct starpu_sched_component *from, struct starpu_sched_component *to);
125 
136  int (*can_pull)(struct starpu_sched_component *component);
137 
141  void (*do_schedule)(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
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 
249 
254 
259 
260 struct starpu_task *starpu_sched_component_pump_to(struct starpu_sched_component *component, struct starpu_sched_component *to, int *success);
261 struct starpu_task *starpu_sched_component_pump_downstream(struct starpu_sched_component *component, int *success);
262 int starpu_sched_component_send_can_push_to_parents(struct starpu_sched_component *component);
266 void starpu_sched_tree_add_workers(unsigned sched_ctx_id, int *workerids, unsigned nworkers);
270 void starpu_sched_tree_remove_workers(unsigned sched_ctx_id, int *workerids, unsigned nworkers);
271 
275 void starpu_sched_tree_do_schedule(unsigned sched_ctx_id);
276 
281 
289 typedef struct starpu_sched_component *(*starpu_sched_component_create_t)(struct starpu_sched_tree *tree, void *data);
290 
302 
313 
314 void starpu_sched_component_add_child(struct starpu_sched_component *component, struct starpu_sched_component *child);
315 
320 
327 int STARPU_WARN_UNUSED_RESULT starpu_sched_component_execute_preds(struct starpu_sched_component *component, struct starpu_task *task, double *length);
328 
333 
334 void starpu_sched_component_prefetch_on_node(struct starpu_sched_component *component, struct starpu_task *task);
335 
346 struct starpu_sched_component *starpu_sched_component_worker_get(unsigned sched_ctx, int workerid);
347 struct starpu_sched_component *starpu_sched_component_worker_new(unsigned sched_ctx, int workerid);
348 
353 
358 
363 
368 
373 
378 void starpu_sched_component_worker_pre_exec_hook(struct starpu_task *task, unsigned sched_ctx_id);
379 
383 void starpu_sched_component_worker_post_exec_hook(struct starpu_task *task, unsigned sched_ctx_id);
384 
397 
402 
407 
412 
418 
423 
432 
437 
439 {
440  unsigned ntasks_threshold;
441  double exp_len_threshold;
442  int ready;
443  int exp;
444 };
445 
452 
457 
466 {
467  unsigned ntasks_threshold;
468  double exp_len_threshold;
469  int ready;
470  int exp;
471 };
472 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;
473 int starpu_sched_component_is_prio(struct starpu_sched_component *component);
474 
486 
491 
496 
508 
513 
521 struct starpu_sched_component *starpu_sched_component_eager_create(struct starpu_sched_tree *tree, void *arg) STARPU_ATTRIBUTE_MALLOC;
522 int starpu_sched_component_is_eager(struct starpu_sched_component *);
523 
531 struct starpu_sched_component *starpu_sched_component_eager_prio_create(struct starpu_sched_tree *tree, void *arg) STARPU_ATTRIBUTE_MALLOC;
532 int starpu_sched_component_is_eager_prio(struct starpu_sched_component *);
533 
541 struct starpu_sched_component *starpu_sched_component_eager_calibration_create(struct starpu_sched_tree *tree, void *arg) STARPU_ATTRIBUTE_MALLOC;
542 int starpu_sched_component_is_eager_calibration(struct starpu_sched_component *);
543 
552 {
553  double alpha;
554  double beta;
555  double _gamma;
556  double idle_power;
557 };
558 
565 
566 int starpu_sched_component_is_mct(struct starpu_sched_component *component);
567 
575 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;
576 int starpu_sched_component_is_heft(struct starpu_sched_component *component);
577 
586 {
588  unsigned batch;
589 };
590 
591 struct starpu_sched_component *starpu_sched_component_heteroprio_create(struct starpu_sched_tree *tree, struct starpu_sched_component_heteroprio_data *params) STARPU_ATTRIBUTE_MALLOC;
592 int starpu_sched_component_is_heteroprio(struct starpu_sched_component *component);
593 
608 
617 {
618  struct starpu_sched_component *calibrator_component;
619  struct starpu_sched_component *no_perfmodel_component;
620  struct starpu_sched_component *perfmodel_component;
621 };
622 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;
623 int starpu_sched_component_is_perfmodel_select(struct starpu_sched_component *component);
624 
632 struct starpu_sched_component *starpu_sched_component_stage_create(struct starpu_sched_tree *tree, void *arg) STARPU_ATTRIBUTE_MALLOC;
633 int starpu_sched_component_is_stage(struct starpu_sched_component *component);
634 
642 struct starpu_sched_component *starpu_sched_component_userchoice_create(struct starpu_sched_tree *tree, void *arg) STARPU_ATTRIBUTE_MALLOC;
643 int starpu_sched_component_is_userchoice(struct starpu_sched_component *component);
644 
655 struct starpu_sched_component_composed_recipe;
656 
661 struct starpu_sched_component_composed_recipe *starpu_sched_component_composed_recipe_create(void) STARPU_ATTRIBUTE_MALLOC;
662 
666 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;
667 
671 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);
672 
676 void starpu_sched_component_composed_recipe_destroy(struct starpu_sched_component_composed_recipe *);
677 
682 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;
683 
684 #ifdef STARPU_HAVE_HWLOC
690 {
695  struct starpu_sched_component_composed_recipe *hwloc_machine_composed_sched_component;
699  struct starpu_sched_component_composed_recipe *hwloc_component_composed_sched_component;
703  struct starpu_sched_component_composed_recipe *hwloc_socket_composed_sched_component;
707  struct starpu_sched_component_composed_recipe *hwloc_cache_composed_sched_component;
708 
713  struct starpu_sched_component_composed_recipe *(*worker_composed_sched_component)(enum starpu_worker_archtype archtype);
721 };
722 
727 #endif /* STARPU_HAVE_HWLOC */
728 
734 #define STARPU_SCHED_SIMPLE_DECIDE_MASK (3 << 0)
735 
739 #define STARPU_SCHED_SIMPLE_DECIDE_WORKERS (1 << 0)
740 
744 #define STARPU_SCHED_SIMPLE_DECIDE_MEMNODES (2 << 0)
745 
749 #define STARPU_SCHED_SIMPLE_DECIDE_ARCHS (3 << 0)
750 
754 #define STARPU_SCHED_SIMPLE_DECIDE_ALWAYS (1 << 3)
755 
760 #define STARPU_SCHED_SIMPLE_PERFMODEL (1 << 4)
761 
765 #define STARPU_SCHED_SIMPLE_IMPL (1 << 5)
766 
772 #define STARPU_SCHED_SIMPLE_FIFO_ABOVE (1 << 6)
773 
777 #define STARPU_SCHED_SIMPLE_FIFO_ABOVE_PRIO (1 << 7)
778 
784 #define STARPU_SCHED_SIMPLE_FIFOS_BELOW (1 << 8)
785 
789 #define STARPU_SCHED_SIMPLE_FIFOS_BELOW_PRIO (1 << 9)
790 
794 #define STARPU_SCHED_SIMPLE_FIFOS_BELOW_READY (1 << 10)
795 
799 #define STARPU_SCHED_SIMPLE_WS_BELOW (1 << 11)
800 
804 #define STARPU_SCHED_SIMPLE_COMBINED_WORKERS (1 << 12)
805 
809 #define STARPU_SCHED_SIMPLE_FIFOS_BELOW_EXP (1 << 13)
810 
816 #define STARPU_SCHED_SIMPLE_PRE_DECISION (1 << 14)
817 
826 void starpu_sched_component_initialize_simple_scheduler(starpu_sched_component_create_t create_decision_component, void *data, unsigned flags, unsigned sched_ctx_id);
827 
840 void starpu_sched_component_initialize_simple_schedulers(unsigned sched_ctx_id, unsigned ndecisions, ...);
841 
844 #define STARPU_COMPONENT_MUTEX_LOCK(m) \
845  do \
846  { \
847  const int _relaxed_state = starpu_worker_get_relax_state(); \
848  if (!_relaxed_state) \
849  starpu_worker_relax_on(); \
850  STARPU_PTHREAD_MUTEX_LOCK((m)); \
851  if (!_relaxed_state) \
852  starpu_worker_relax_off(); \
853  } \
854  while (0)
855 
856 #define STARPU_COMPONENT_MUTEX_TRYLOCK(m) STARPU_PTHREAD_MUTEX_TRYLOCK((m))
857 
858 #define STARPU_COMPONENT_MUTEX_UNLOCK(m) STARPU_PTHREAD_MUTEX_UNLOCK((m))
859 
862 #ifdef __cplusplus
863 }
864 #endif
865 
866 #endif /* __STARPU_SCHED_COMPONENT_H__ */
unsigned sched_ctx
Definition: starpu_task.h:1293
uint32_t * workerids
Definition: starpu_task.h:1216
Definition: starpu_task.h:662
void(* do_schedule)(struct starpu_sched_component *component)
Definition: starpu_sched_component.h:141
struct starpu_bitmap workers
Definition: starpu_sched_component.h:69
void * data
Definition: starpu_sched_component.h:78
void(* notify_change_workers)(struct starpu_sched_component *component)
Definition: starpu_sched_component.h:165
struct starpu_bitmap workers
Definition: starpu_sched_component.h:193
void(* add_child)(struct starpu_sched_component *component, struct starpu_sched_component *child)
Definition: starpu_sched_component.h:90
void(* deinit_data)(struct starpu_sched_component *component)
Definition: starpu_sched_component.h:160
struct starpu_sched_tree * tree
Definition: starpu_sched_component.h:67
int(* can_pull)(struct starpu_sched_component *component)
Definition: starpu_sched_component.h:136
struct starpu_sched_component ** parents
Definition: starpu_sched_component.h:87
struct starpu_sched_component_composed_recipe * hwloc_cache_composed_sched_component
Definition: starpu_sched_component.h:707
struct starpu_sched_component * root
Definition: starpu_sched_component.h:189
int mix_heterogeneous_workers
Definition: starpu_sched_component.h:720
starpu_pthread_mutex_t lock
Definition: starpu_sched_component.h:202
struct starpu_sched_component ** children
Definition: starpu_sched_component.h:83
void(* remove_child)(struct starpu_sched_component *component, struct starpu_sched_component *child)
Definition: starpu_sched_component.h:92
struct starpu_sched_component_composed_recipe * hwloc_socket_composed_sched_component
Definition: starpu_sched_component.h:703
double(* estimated_end)(struct starpu_sched_component *component)
Definition: starpu_sched_component.h:155
unsigned sched_ctx_id
Definition: starpu_sched_component.h:197
double(* estimated_load)(struct starpu_sched_component *component)
Definition: starpu_sched_component.h:150
unsigned nchildren
Definition: starpu_sched_component.h:81
int(* push_task)(struct starpu_sched_component *, struct starpu_task *)
Definition: starpu_sched_component.h:106
struct starpu_bitmap workers_in_ctx
Definition: starpu_sched_component.h:76
unsigned nparents
Definition: starpu_sched_component.h:85
struct starpu_sched_component_composed_recipe * hwloc_machine_composed_sched_component
Definition: starpu_sched_component.h:695
int(* can_push)(struct starpu_sched_component *from, struct starpu_sched_component *to)
Definition: starpu_sched_component.h:124
hwloc_obj_t obj
Definition: starpu_sched_component.h:175
struct starpu_sched_component_composed_recipe * hwloc_component_composed_sched_component
Definition: starpu_sched_component.h:699
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
struct starpu_task * starpu_sched_component_pull_task(struct starpu_sched_component *from, struct starpu_sched_component *to)
double starpu_sched_component_transfer_length(struct starpu_sched_component *component, struct starpu_task *task)
struct starpu_task * starpu_sched_tree_pop_task(unsigned sched_ctx)
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
double starpu_sched_component_estimated_end_average(struct starpu_sched_component *component)
void starpu_sched_component_destroy(struct starpu_sched_component *component)
int starpu_sched_component_worker_get_workerid(struct starpu_sched_component *worker_component)
struct starpu_task * starpu_sched_component_parents_pull_task(struct starpu_sched_component *component, struct starpu_sched_component *to)
struct starpu_sched_component * starpu_sched_component_work_stealing_create(struct starpu_sched_tree *tree, void *arg) STARPU_ATTRIBUTE_MALLOC
void starpu_sched_component_composed_recipe_destroy(struct starpu_sched_component_composed_recipe *)
void starpu_sched_tree_remove_workers(unsigned sched_ctx_id, int *workerids, unsigned nworkers)
struct starpu_sched_tree * starpu_sched_tree_get(unsigned sched_ctx_id)
int starpu_sched_component_can_pull_all(struct starpu_sched_component *component)
int starpu_sched_component_is_simple_worker(struct starpu_sched_component *component)
void starpu_sched_component_initialize_simple_schedulers(unsigned sched_ctx_id, unsigned ndecisions,...)
int starpu_sched_component_can_pull(struct starpu_sched_component *component)
struct starpu_sched_tree * starpu_sched_component_make_scheduler(unsigned sched_ctx_id, struct starpu_sched_component_specs s)
int starpu_sched_tree_work_stealing_push_task(struct starpu_task *task)
void starpu_sched_component_initialize_simple_scheduler(starpu_sched_component_create_t create_decision_component, void *data, unsigned flags, unsigned sched_ctx_id)
int starpu_sched_tree_push_task(struct starpu_task *task)
void starpu_sched_tree_do_schedule(unsigned sched_ctx_id)
void starpu_sched_tree_update_workers(struct starpu_sched_tree *t)
double starpu_sched_component_estimated_end_min(struct starpu_sched_component *component)
double starpu_sched_component_estimated_load(struct starpu_sched_component *component)
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
struct starpu_sched_component * starpu_sched_component_worker_get(unsigned sched_ctx, int workerid)
int starpu_sched_component_is_fifo(struct starpu_sched_component *component)
double starpu_sched_component_estimated_end_min_add(struct starpu_sched_component *component, double exp_len)
int starpu_sched_component_execute_preds(struct starpu_sched_component *component, struct starpu_task *task, double *length)
void starpu_sched_tree_add_workers(unsigned sched_ctx_id, int *workerids, unsigned nworkers)
int starpu_sched_component_can_push(struct starpu_sched_component *component, struct starpu_sched_component *to)
void starpu_sched_tree_deinitialize(unsigned sched_ctx_id)
int starpu_sched_component_is_combined_worker(struct starpu_sched_component *component)
void starpu_sched_component_connect(struct starpu_sched_component *parent, struct starpu_sched_component *child)
int starpu_sched_component_can_execute_task(struct starpu_sched_component *component, struct starpu_task *task)
struct starpu_sched_component * starpu_sched_component_best_implementation_create(struct starpu_sched_tree *tree, void *arg) STARPU_ATTRIBUTE_MALLOC
struct starpu_sched_component_composed_recipe * starpu_sched_component_composed_recipe_create(void) STARPU_ATTRIBUTE_MALLOC
void starpu_sched_component_destroy_rec(struct starpu_sched_component *component)
starpu_sched_component_properties
Definition: starpu_sched_component.h:41
void starpu_sched_tree_destroy(struct starpu_sched_tree *tree)
int starpu_sched_component_is_work_stealing(struct starpu_sched_component *component)
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)
void starpu_sched_component_worker_post_exec_hook(struct starpu_task *task, unsigned sched_ctx_id)
struct starpu_sched_component * starpu_sched_component_random_create(struct starpu_sched_tree *tree, void *arg) STARPU_ATTRIBUTE_MALLOC
struct starpu_sched_component * starpu_sched_component_parallel_worker_create(struct starpu_sched_tree *tree, unsigned nworkers, unsigned *workers)
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_is_random(struct starpu_sched_component *)
struct starpu_sched_component * starpu_sched_component_create(struct starpu_sched_tree *tree, const char *name) STARPU_ATTRIBUTE_MALLOC
int starpu_sched_component_is_worker(struct starpu_sched_component *component)
void starpu_sched_tree_update_workers_in_ctx(struct starpu_sched_tree *t)
int starpu_sched_component_push_task(struct starpu_sched_component *from, struct starpu_sched_component *to, struct starpu_task *task)
struct starpu_sched_tree * starpu_sched_tree_create(unsigned sched_ctx_id) STARPU_ATTRIBUTE_MALLOC
void starpu_sched_component_worker_pre_exec_hook(struct starpu_task *task, unsigned sched_ctx_id)
@ STARPU_SCHED_COMPONENT_HOMOGENEOUS
Definition: starpu_sched_component.h:42
@ STARPU_SCHED_COMPONENT_SINGLE_MEMORY_NODE
Definition: starpu_sched_component.h:43
Definition: starpu_sched_component.h:65
Definition: starpu_sched_component.h:439
Definition: starpu_sched_component.h:586
Definition: starpu_sched_component.h:552
Definition: starpu_sched_component.h:617
Definition: starpu_sched_component.h:466
Definition: starpu_sched_component.h:690
Definition: starpu_sched_component.h:185
#define STARPU_ATTRIBUTE_MALLOC
Definition: starpu_util.h:129
starpu_worker_archtype
Definition: starpu_worker.h:66
Definition: starpu_bitmap.h:79