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) 2013-2021 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
29extern "C"
30{
31#endif
32
42{
47};
48
52#define STARPU_SCHED_COMPONENT_IS_HOMOGENEOUS(component) ((component)->properties & STARPU_SCHED_COMPONENT_HOMOGENEOUS)
53
57#define STARPU_SCHED_COMPONENT_IS_SINGLE_MEMORY_NODE(component) ((component)->properties & STARPU_SCHED_COMPONENT_SINGLE_MEMORY_NODE)
58
68{
72 struct starpu_bitmap *workers;
79 struct starpu_bitmap *workers_in_ctx;
81 void *data;
82 char *name;
84 unsigned nchildren;
88 unsigned nparents;
91
93 void (*add_child)(struct starpu_sched_component *component, struct starpu_sched_component *child);
95 void (*remove_child)(struct starpu_sched_component *component, struct starpu_sched_component *child);
96 void (*add_parent)(struct starpu_sched_component *component, struct starpu_sched_component *parent);
97 void (*remove_parent)(struct starpu_sched_component *component, struct starpu_sched_component *parent);
98
109 int (*push_task)(struct starpu_sched_component *, struct starpu_task *);
110
117 struct starpu_task *(*pull_task)(struct starpu_sched_component *from, struct starpu_sched_component *to);
118
128
139 int (*can_pull)(struct starpu_sched_component *component);
140
141 int (*notify)(struct starpu_sched_component* component, int message_ID, void* arg);
142
148 double (*estimated_load)(struct starpu_sched_component *component);
153 double (*estimated_end)(struct starpu_sched_component *component);
154
158 void (*deinit_data)(struct starpu_sched_component *component);
159
164 int properties;
165
166#ifdef STARPU_HAVE_HWLOC
173 hwloc_obj_t obj;
174#else
175 void *obj;
176#endif
177};
178
183{
191 struct starpu_bitmap *workers;
195 unsigned sched_ctx_id;
200 starpu_pthread_mutex_t lock;
201};
202
203void starpu_initialize_prio_center_policy(unsigned sched_ctx_id);
204
222struct starpu_sched_tree *starpu_sched_tree_get(unsigned sched_ctx_id);
239
244
249
250struct starpu_task* starpu_sched_component_pump_to(struct starpu_sched_component *component, struct starpu_sched_component *to, int* success);
251struct starpu_task* starpu_sched_component_pump_downstream(struct starpu_sched_component *component, int* success);
252int starpu_sched_component_send_can_push_to_parents(struct starpu_sched_component * component);
256void starpu_sched_tree_add_workers(unsigned sched_ctx_id, int *workerids, unsigned nworkers);
260void starpu_sched_tree_remove_workers(unsigned sched_ctx_id, int *workerids, unsigned nworkers);
261
266
274typedef struct starpu_sched_component * (*starpu_sched_component_create_t)(struct starpu_sched_tree *tree, void *data);
275
287
298
299void starpu_sched_component_add_child(struct starpu_sched_component* component, struct starpu_sched_component * child);
300
305
312int STARPU_WARN_UNUSED_RESULT starpu_sched_component_execute_preds(struct starpu_sched_component *component, struct starpu_task *task, double *length);
313
318
319void starpu_sched_component_prefetch_on_node(struct starpu_sched_component *component, struct starpu_task *task);
320
331struct starpu_sched_component *starpu_sched_component_worker_get(unsigned sched_ctx, int workerid);
332struct starpu_sched_component *starpu_sched_component_worker_new(unsigned sched_ctx, int workerid);
333
338
343
348
353
358
363void starpu_sched_component_worker_pre_exec_hook(struct starpu_task *task, unsigned sched_ctx_id);
364
368void starpu_sched_component_worker_post_exec_hook(struct starpu_task *task, unsigned sched_ctx_id);
369
381
386
391
396
402
407
416
421
423{
424 unsigned ntasks_threshold;
425 double exp_len_threshold;
426 int ready;
427};
428
435
440
449{
450 unsigned ntasks_threshold;
451 double exp_len_threshold;
452 int ready;
453};
454struct starpu_sched_component *starpu_sched_component_prio_create(struct starpu_sched_tree *tree, struct starpu_sched_component_prio_data *prio_data) STARPU_ATTRIBUTE_MALLOC;
455int starpu_sched_component_is_prio(struct starpu_sched_component *component);
456
468
473
478
490
495
503struct starpu_sched_component *starpu_sched_component_eager_create(struct starpu_sched_tree *tree, void *arg) STARPU_ATTRIBUTE_MALLOC;
504int starpu_sched_component_is_eager(struct starpu_sched_component *);
505
513struct starpu_sched_component *starpu_sched_component_eager_prio_create(struct starpu_sched_tree *tree, void *arg) STARPU_ATTRIBUTE_MALLOC;
514int starpu_sched_component_is_eager_prio(struct starpu_sched_component *);
515
523struct starpu_sched_component *starpu_sched_component_eager_calibration_create(struct starpu_sched_tree *tree, void *arg) STARPU_ATTRIBUTE_MALLOC;
524int starpu_sched_component_is_eager_calibration(struct starpu_sched_component *);
525
534{
535 double alpha;
536 double beta;
537 double _gamma;
538 double idle_power;
539};
540
547
548int starpu_sched_component_is_mct(struct starpu_sched_component *component);
549
557struct starpu_sched_component *starpu_sched_component_heft_create(struct starpu_sched_tree *tree, struct starpu_sched_component_mct_data *mct_data) STARPU_ATTRIBUTE_MALLOC;
558int starpu_sched_component_is_heft(struct starpu_sched_component *component);
559
568{
570 unsigned batch;
571};
572
573struct starpu_sched_component * starpu_sched_component_heteroprio_create(struct starpu_sched_tree *tree, struct starpu_sched_component_heteroprio_data * params) STARPU_ATTRIBUTE_MALLOC;
574int starpu_sched_component_is_heteroprio(struct starpu_sched_component *component);
575
590
599{
600 struct starpu_sched_component *calibrator_component;
601 struct starpu_sched_component *no_perfmodel_component;
602 struct starpu_sched_component *perfmodel_component;
603};
604struct 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;
605int starpu_sched_component_is_perfmodel_select(struct starpu_sched_component *component);
606
614struct starpu_sched_component * starpu_sched_component_stage_create(struct starpu_sched_tree *tree, void *arg) STARPU_ATTRIBUTE_MALLOC;
615int starpu_sched_component_is_stage(struct starpu_sched_component *component);
616
624struct starpu_sched_component * starpu_sched_component_userchoice_create(struct starpu_sched_tree *tree, void *arg) STARPU_ATTRIBUTE_MALLOC;
625int starpu_sched_component_is_userchoice(struct starpu_sched_component *component);
626
637struct starpu_sched_component_composed_recipe;
638
642struct starpu_sched_component_composed_recipe *starpu_sched_component_composed_recipe_create(void) STARPU_ATTRIBUTE_MALLOC;
643
647struct 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;
648
652void 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);
653
657void starpu_sched_component_composed_recipe_destroy(struct starpu_sched_component_composed_recipe *);
658
664
665#ifdef STARPU_HAVE_HWLOC
671{
676 struct starpu_sched_component_composed_recipe *hwloc_machine_composed_sched_component;
680 struct starpu_sched_component_composed_recipe *hwloc_component_composed_sched_component;
684 struct starpu_sched_component_composed_recipe *hwloc_socket_composed_sched_component;
688 struct starpu_sched_component_composed_recipe *hwloc_cache_composed_sched_component;
689
694 struct starpu_sched_component_composed_recipe *(*worker_composed_sched_component)(enum starpu_worker_archtype archtype);
702};
703
704
709#endif /* STARPU_HAVE_HWLOC */
710
716#define STARPU_SCHED_SIMPLE_DECIDE_MASK (3<<0)
717
721#define STARPU_SCHED_SIMPLE_DECIDE_WORKERS (1<<0)
722
726#define STARPU_SCHED_SIMPLE_DECIDE_MEMNODES (2<<0)
727
731#define STARPU_SCHED_SIMPLE_DECIDE_ARCHS (3<<0)
732
736#define STARPU_SCHED_SIMPLE_DECIDE_ALWAYS (1<<3)
737
742#define STARPU_SCHED_SIMPLE_PERFMODEL (1<<4)
743
747#define STARPU_SCHED_SIMPLE_IMPL (1<<5)
748
754#define STARPU_SCHED_SIMPLE_FIFO_ABOVE (1<<6)
755
759#define STARPU_SCHED_SIMPLE_FIFO_ABOVE_PRIO (1<<7)
760
766#define STARPU_SCHED_SIMPLE_FIFOS_BELOW (1<<8)
767
771#define STARPU_SCHED_SIMPLE_FIFOS_BELOW_PRIO (1<<9)
772
776#define STARPU_SCHED_SIMPLE_FIFOS_BELOW_READY (1<<10)
777
781#define STARPU_SCHED_SIMPLE_WS_BELOW (1<<11)
782
786#define STARPU_SCHED_SIMPLE_COMBINED_WORKERS (1<<12)
787
793#define STARPU_SCHED_SIMPLE_PRE_DECISION (1<<14)
794
802void starpu_sched_component_initialize_simple_scheduler(starpu_sched_component_create_t create_decision_component, void *data, unsigned flags, unsigned sched_ctx_id);
803
817
820#define STARPU_COMPONENT_MUTEX_LOCK(m) \
821do \
822{ \
823 const int _relaxed_state = starpu_worker_get_relax_state(); \
824 if (!_relaxed_state) \
825 starpu_worker_relax_on(); \
826 STARPU_PTHREAD_MUTEX_LOCK((m)); \
827 if (!_relaxed_state) \
828 starpu_worker_relax_off(); \
829} \
830while(0)
831
832#define STARPU_COMPONENT_MUTEX_TRYLOCK(m) STARPU_PTHREAD_MUTEX_TRYLOCK((m))
833
834#define STARPU_COMPONENT_MUTEX_UNLOCK(m) STARPU_PTHREAD_MUTEX_UNLOCK((m))
835
838#ifdef __cplusplus
839}
840#endif
841
842#endif /* __STARPU_SCHED_COMPONENT_H__ */
unsigned sched_ctx
Definition: starpu_task.h:1106
uint32_t * workerids
Definition: starpu_task.h:1029
Definition: starpu_task.h:567
struct starpu_bitmap * workers
Definition: starpu_sched_component.h:72
void * data
Definition: starpu_sched_component.h:81
void(* notify_change_workers)(struct starpu_sched_component *component)
Definition: starpu_sched_component.h:163
void(* add_child)(struct starpu_sched_component *component, struct starpu_sched_component *child)
Definition: starpu_sched_component.h:93
void(* deinit_data)(struct starpu_sched_component *component)
Definition: starpu_sched_component.h:158
struct starpu_bitmap * workers_in_ctx
Definition: starpu_sched_component.h:79
struct starpu_sched_tree * tree
Definition: starpu_sched_component.h:70
int(* can_pull)(struct starpu_sched_component *component)
Definition: starpu_sched_component.h:139
struct starpu_sched_component ** parents
Definition: starpu_sched_component.h:90
struct starpu_sched_component_composed_recipe * hwloc_cache_composed_sched_component
Definition: starpu_sched_component.h:688
struct starpu_sched_component * root
Definition: starpu_sched_component.h:187
int mix_heterogeneous_workers
Definition: starpu_sched_component.h:701
starpu_pthread_mutex_t lock
Definition: starpu_sched_component.h:200
struct starpu_sched_component ** children
Definition: starpu_sched_component.h:86
void(* remove_child)(struct starpu_sched_component *component, struct starpu_sched_component *child)
Definition: starpu_sched_component.h:95
struct starpu_sched_component_composed_recipe * hwloc_socket_composed_sched_component
Definition: starpu_sched_component.h:684
double(* estimated_end)(struct starpu_sched_component *component)
Definition: starpu_sched_component.h:153
unsigned sched_ctx_id
Definition: starpu_sched_component.h:195
double(* estimated_load)(struct starpu_sched_component *component)
Definition: starpu_sched_component.h:148
unsigned nchildren
Definition: starpu_sched_component.h:84
int(* push_task)(struct starpu_sched_component *, struct starpu_task *)
Definition: starpu_sched_component.h:109
unsigned nparents
Definition: starpu_sched_component.h:88
struct starpu_bitmap * workers
Definition: starpu_sched_component.h:191
struct starpu_sched_component_composed_recipe * hwloc_machine_composed_sched_component
Definition: starpu_sched_component.h:676
int(* can_push)(struct starpu_sched_component *from, struct starpu_sched_component *to)
Definition: starpu_sched_component.h:127
hwloc_obj_t obj
Definition: starpu_sched_component.h:173
struct starpu_sched_component_composed_recipe * hwloc_component_composed_sched_component
Definition: starpu_sched_component.h:680
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_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_transfer_length(struct starpu_sched_component *component, struct starpu_task *task)
double starpu_sched_component_estimated_end_average(struct starpu_sched_component *component)
int STARPU_WARN_UNUSED_RESULT starpu_sched_component_execute_preds(struct starpu_sched_component *component, struct starpu_task *task, double *length)
struct starpu_sched_component * starpu_sched_component_worker_get(unsigned sched_ctx, int workerid)
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_sched_component * starpu_sched_component_work_stealing_create(struct starpu_sched_tree *tree, void *arg) STARPU_ATTRIBUTE_MALLOC
struct starpu_sched_component * starpu_sched_component_best_implementation_create(struct starpu_sched_tree *tree, void *arg) STARPU_ATTRIBUTE_MALLOC
struct starpu_task * starpu_sched_component_pull_task(struct starpu_sched_component *from, struct starpu_sched_component *to)
void starpu_sched_component_composed_recipe_destroy(struct starpu_sched_component_composed_recipe *)
struct starpu_sched_component * starpu_sched_component_parallel_worker_create(struct starpu_sched_tree *tree, unsigned nworkers, unsigned *workers)
void starpu_sched_tree_remove_workers(unsigned sched_ctx_id, int *workerids, unsigned nworkers)
struct starpu_sched_component_composed_recipe * starpu_sched_component_composed_recipe_create(void) STARPU_ATTRIBUTE_MALLOC
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
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)
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_update_workers(struct starpu_sched_tree *t)
double starpu_sched_component_estimated_end_min(struct starpu_sched_component *component)
struct starpu_task * starpu_sched_tree_pop_task(unsigned sched_ctx)
double starpu_sched_component_estimated_load(struct starpu_sched_component *component)
struct starpu_sched_tree * starpu_sched_tree_create(unsigned sched_ctx_id) STARPU_ATTRIBUTE_MALLOC
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)
struct starpu_sched_component * starpu_sched_component_create(struct starpu_sched_tree *tree, const char *name) STARPU_ATTRIBUTE_MALLOC
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)
struct starpu_sched_component * starpu_sched_component_random_create(struct starpu_sched_tree *tree, void *arg) STARPU_ATTRIBUTE_MALLOC
int starpu_sched_component_can_execute_task(struct starpu_sched_component *component, 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
void starpu_sched_component_destroy_rec(struct starpu_sched_component *component)
struct starpu_sched_tree * starpu_sched_component_make_scheduler(unsigned sched_ctx_id, struct starpu_sched_component_specs s)
starpu_sched_component_properties
Definition: starpu_sched_component.h:42
void starpu_sched_tree_destroy(struct starpu_sched_tree *tree)
struct starpu_task * starpu_sched_component_parents_pull_task(struct starpu_sched_component *component, struct starpu_sched_component *to)
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)
int starpu_sched_component_is_random(struct starpu_sched_component *)
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)
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:44
@ STARPU_SCHED_COMPONENT_SINGLE_MEMORY_NODE
Definition: starpu_sched_component.h:46
Definition: starpu_sched_component.h:68
Definition: starpu_sched_component.h:423
Definition: starpu_sched_component.h:568
Definition: starpu_sched_component.h:534
Definition: starpu_sched_component.h:599
Definition: starpu_sched_component.h:449
Definition: starpu_sched_component.h:671
Definition: starpu_sched_component.h:183
#define STARPU_ATTRIBUTE_MALLOC
Definition: starpu_util.h:112
starpu_worker_archtype
Definition: starpu_worker.h:63