StarPU Handbook
|
Data Structures | |
struct | starpu_sched_component |
struct | starpu_sched_tree |
struct | starpu_sched_component_composed_recipe |
struct | starpu_sched_component_specs |
Macros | |
#define | STARPU_SCHED_COMPONENT_IS_HOMOGENEOUS(component) |
#define | STARPU_SCHED_COMPONENT_IS_SINGLE_MEMORY_NODE(component) |
Enumerations | |
enum | starpu_sched_component_properties { STARPU_SCHED_COMPONENT_HOMOGENEOUS, STARPU_SCHED_COMPONENT_SINGLE_MEMORY_NODE } |
Scheduling Tree API | |
struct starpu_sched_tree * | starpu_sched_tree_create (unsigned sched_ctx_id) |
void | starpu_sched_tree_destroy (struct starpu_sched_tree *tree) |
void | starpu_sched_tree_update_workers (struct starpu_sched_tree *t) |
void | starpu_sched_tree_update_workers_in_ctx (struct starpu_sched_tree *t) |
int | starpu_sched_tree_push_task (struct starpu_task *task) |
struct starpu_task * | starpu_sched_tree_pop_task () |
void | starpu_sched_tree_add_workers (unsigned sched_ctx_id, int *workerids, unsigned nworkers) |
void | starpu_sched_tree_remove_workers (unsigned sched_ctx_id, int *workerids, unsigned nworkers) |
Generic Scheduling Component API | |
struct starpu_sched_component * | starpu_sched_component_create (struct starpu_sched_tree *tree) |
void | starpu_sched_component_destroy (struct starpu_sched_component *component) |
void | starpu_sched_component_destroy_rec (struct starpu_sched_component *component) |
int | starpu_sched_component_can_execute_task (struct starpu_sched_component *component, struct starpu_task *task) |
int STARPU_WARN_UNUSED_RESULT | starpu_sched_component_execute_preds (struct starpu_sched_component *component, struct starpu_task *task, double *length) |
double | starpu_sched_component_transfer_length (struct starpu_sched_component *component, struct starpu_task *task) |
Worker Component API | |
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) |
int | starpu_sched_component_is_worker (struct starpu_sched_component *component) |
int | starpu_sched_component_is_simple_worker (struct starpu_sched_component *component) |
int | starpu_sched_component_is_combined_worker (struct starpu_sched_component *component) |
void | starpu_sched_component_worker_pre_exec_hook (struct starpu_task *task) |
void | starpu_sched_component_worker_post_exec_hook (struct starpu_task *task) |
Flow-control Fifo Component API | |
struct starpu_sched_component * | starpu_sched_component_fifo_create (struct starpu_sched_tree *tree, struct starpu_sched_component_fifo_data *fifo_data) |
int | starpu_sched_component_is_fifo (struct starpu_sched_component *component) |
Flow-control Prio Component API | |
struct starpu_sched_component * | starpu_sched_component_prio_create (struct starpu_sched_tree *tree, struct starpu_sched_component_prio_data *prio_data) |
int | starpu_sched_component_is_prio (struct starpu_sched_component *component) |
Resource-mapping Work-Stealing Component API | |
int | starpu_sched_tree_work_stealing_push_task (struct starpu_task *task) |
int | starpu_sched_component_is_work_stealing (struct starpu_sched_component *component) |
Resource-mapping Random Component API | |
int | starpu_sched_component_is_random (struct starpu_sched_component *) |
Resource-mapping Eager Component API | |
int | starpu_sched_component_is_eager (struct starpu_sched_component *) |
Resource-mapping Eager-Calibration Component API | |
int | starpu_sched_component_is_eager_calibration (struct starpu_sched_component *) |
Resource-mapping MCT Component API | |
struct starpu_sched_component * | starpu_sched_component_mct_create (struct starpu_sched_tree *tree, struct starpu_sched_component_mct_data *mct_data) |
int | starpu_sched_component_is_mct (struct starpu_sched_component *component) |
Resource-mapping Heft Component API | |
struct starpu_sched_component * | starpu_sched_component_heft_create (struct starpu_sched_tree *tree, struct starpu_sched_component_mct_data *mct_data) |
int | starpu_sched_component_is_heft (struct starpu_sched_component *component) |
Special-purpose Perfmodel_Select Component API | |
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) |
int | starpu_sched_component_is_perfmodel_select (struct starpu_sched_component *component) |
Recipe Component API | |
struct starpu_sched_component_composed_recipe * | starpu_sched_component_composed_recipe_create (void) |
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) |
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_composed_recipe_destroy (struct starpu_sched_component_composed_recipe *) |
struct starpu_sched_component * | starpu_sched_component_composed_component_create (struct starpu_sched_tree *tree, struct starpu_sched_component_composed_recipe *recipe) |
struct starpu_sched_tree * | starpu_sched_component_make_scheduler (unsigned sched_ctx_id, struct starpu_sched_component_specs s) |
struct starpu_sched_component |
This structure represent a scheduler module. A scheduler is a tree-like structure of them, some parts of scheduler can be shared by several contexes to perform some local optimisations, so, for all components, a list of parent is defined indexed by sched_ctx_id. They embed there specialised method in a pseudo object-style, so calls are like component->push_task(component,task)
struct starpu_sched_tree * starpu_sched_component::tree |
The tree containing the component
struct starpu_bitmap * starpu_sched_component::workers |
this member contain the set of underlying workers
starpu_sched_component::workers_in_ctx |
this member contain the subset of starpu_sched_component::workers that is currently available in the context The push method should take this member into account. this member is set with : component->workers UNION tree->workers UNION component->child[i]->workers_in_ctx iff exist x such as component->children[i]->parents[x] == component
void * starpu_sched_component::data |
private data
int starpu_sched_component::nchildren |
the number of compoments's children
struct starpu_sched_component ** starpu_sched_component::children |
the vector of component's children
int starpu_sched_component::nparents |
the numbers of component's parents
struct starpu_sched_component ** starpu_sched_component::parents |
the vector of component's parents
void(* starpu_sched_component::add_child)(struct starpu_sched_component *component, struct starpu_sched_component *child) |
add a child to component
void(* starpu_sched_component::remove_child)(struct starpu_sched_component *component, struct starpu_sched_component *child) |
remove a child from component
void(* starpu_sched_component::add_parent)(struct starpu_sched_component *component, struct starpu_sched_component *parent) |
todo
void(* starpu_sched_component::remove_parent)(struct starpu_sched_component *component, struct starpu_sched_component *parent) |
todo
int(* starpu_sched_component::push_task)(struct starpu_sched_component *, struct starpu_task *) |
push a task in the scheduler module. this function is called to push a task on component subtree, this can either perform a recursive call on a child or store the task in the component, then it will be returned by a further pull_task call. the caller must ensure that component is able to execute task.
struct starpu_task *(* starpu_sched_component::pull_task)(struct starpu_sched_component *) |
pop a task from the scheduler module. this function is called by workers to get a task from their parents. this function should first return a locally stored task or perform a recursive call on the parents. the task returned by this function is executable by the caller
int(* starpu_sched_component::can_push)(struct starpu_sched_component *component) |
This function is called by a component which implements a queue, allowing it to signify to its parents that an empty slot is available in its queue. The basic implementation of this function is a recursive call to its parents, the user have to specify a personally-made function to catch those calls.
void(* starpu_sched_component::can_pull)(struct starpu_sched_component *component) |
This function allow a component to wake up a worker. It is currently called by component which implements a queue, to signify to its children that a task have been pushed in its local queue, and is available to been popped by a worker, for example. The basic implementation of this function is a recursive call to its children, until at least one worker have been woken up.
double(* starpu_sched_component::estimated_load)(struct starpu_sched_component *component) |
is an heuristic to compute load of scheduler module. Basically the number of tasks divided by the sum of relatives speedup of workers available in context. estimated_load(component) = sum(estimated_load(component_children)) + nb_local_tasks / average(relative_speedup(underlying_worker))
starpu_sched_component::estimated_end |
return the time when a worker will enter in starvation. This function is relevant only if the task->predicted member has been set.
void(* starpu_sched_component::deinit_data)(struct starpu_sched_component *component) |
called by starpu_sched_component_destroy. Should free data allocated during creation
void(* starpu_sched_component::notify_change_workers)(struct starpu_sched_component *component) |
this function is called for each component when workers are added or removed from a context
int starpu_sched_component::properties |
todo
hwloc_obj_t starpu_sched_component::obj |
the hwloc object associated to scheduler module. points to the part of topology that is binded to this component, eg: a numa node for a ws component that would balance load between underlying sockets
struct starpu_sched_tree |
The actual scheduler
Data Fields | ||
---|---|---|
struct starpu_sched_component * | root |
this is the entry module of the scheduler |
struct starpu_bitmap * | workers |
this is the set of workers available in this context, this value is used to mask workers in modules |
unsigned | sched_ctx_id |
the context id of the scheduler |
struct starpu_sched_component * | worker_components[STARPU_NMAXWORKERS] |
worker components |
starpu_pthread_mutex_t | lock |
this lock is used to protect the scheduler, it is taken in read mode pushing a task and in write mode for adding or removing workers |
struct starpu_sched_component_composed_recipe |
parameters for starpu_sched_component_composed_component_create
struct starpu_sched_component_specs |
Define how build a scheduler according to topology. Each level (except for hwloc_machine_composed_sched_component) can be NULL, then the level is just skipped. Bugs everywhere, do not rely on.
Data Fields | |
struct starpu_sched_component_composed_recipe * | hwloc_machine_composed_sched_component |
struct starpu_sched_component_composed_recipe * | hwloc_component_composed_sched_component |
struct starpu_sched_component_composed_recipe * | hwloc_socket_composed_sched_component |
struct starpu_sched_component_composed_recipe * | hwloc_cache_composed_sched_component |
struct starpu_sched_component_composed_recipe *(* | worker_composed_sched_component )(enum starpu_worker_archtype archtype) |
int | mix_heterogeneous_workers |
#define STARPU_SCHED_COMPONENT_IS_HOMOGENEOUS | ( | component | ) |
indicate if component is homogeneous
#define STARPU_SCHED_COMPONENT_IS_SINGLE_MEMORY_NODE | ( | component | ) |
indicate if all workers have the same memory component
flags for starpu_sched_component::properties
struct starpu_sched_tree * starpu_sched_tree_create | ( | unsigned | sched_ctx_id | ) |
create a empty initialized starpu_sched_tree
void starpu_sched_tree_destroy | ( | struct starpu_sched_tree * | tree | ) |
destroy tree and free all non shared component in it.
void starpu_sched_tree_update_workers | ( | struct starpu_sched_tree * | t | ) |
recursively set all starpu_sched_component::workers, do not take into account shared parts (except workers).
void starpu_sched_tree_update_workers_in_ctx | ( | struct starpu_sched_tree * | t | ) |
recursively set all starpu_sched_component::workers_in_ctx, do not take into account shared parts (except workers)
int starpu_sched_tree_push_task | ( | struct starpu_task * | task | ) |
compatibility with starpu_sched_policy interface
struct starpu_task * starpu_sched_tree_pop_task | ( | ) |
compatibility with starpu_sched_policy interface
void starpu_sched_tree_add_workers | ( | unsigned | sched_ctx_id, |
int * | workerids, | ||
unsigned | nworkers | ||
) |
compatibility with starpu_sched_policy interface
void starpu_sched_tree_remove_workers | ( | unsigned | sched_ctx_id, |
int * | workerids, | ||
unsigned | nworkers | ||
) |
compatibility with starpu_sched_policy interface
struct starpu_sched_component * starpu_sched_component_create | ( | struct starpu_sched_tree * | tree | ) |
allocate and initialize component field with defaults values : .pop_task make recursive call on father .estimated_load compute relative speedup and tasks in sub tree .estimated_end return the average of recursive call on children .add_child is starpu_sched_component_add_child .remove_child is starpu_sched_component_remove_child .notify_change_workers does nothing .deinit_data does nothing
void starpu_sched_component_destroy | ( | struct starpu_sched_component * | component | ) |
free data allocated by starpu_sched_component_create and call component->deinit_data(component) set to null the member starpu_sched_component::fathers[sched_ctx_id] of all child if its equal to component
void starpu_sched_component_destroy_rec | ( | struct starpu_sched_component * | component | ) |
recursively destroy non shared parts of a component
's tree
int starpu_sched_component_can_execute_task | ( | struct starpu_sched_component * | component, |
struct starpu_task * | task | ||
) |
return true iff component
can execute task
, this function take into account the workers available in the scheduling context
int starpu_sched_component_execute_preds | ( | struct starpu_sched_component * | component, |
struct starpu_task * | task, | ||
double * | length | ||
) |
return a non null value if component
can execute task
. write the execution prediction length for the best implementation of the best worker available and write this at length
address. this result is more relevant if starpu_sched_component::is_homogeneous is non null. if a worker need to be calibrated for an implementation, nan is set to length
.
double starpu_sched_component_transfer_length | ( | struct starpu_sched_component * | component, |
struct starpu_task * | task | ||
) |
return the average time to transfer task
data to underlying component
workers.
struct starpu_sched_component * starpu_sched_component_worker_get | ( | unsigned | sched_ctx, |
int | workerid | ||
) |
return the struct starpu_sched_component corresponding to workerid
. Undefined if workerid
is not a valid workerid
int starpu_sched_component_worker_get_workerid | ( | struct starpu_sched_component * | worker_component | ) |
return the workerid of worker_component
, undefined if starpu_sched_component_is_worker(worker_component) == 0
int starpu_sched_component_is_worker | ( | struct starpu_sched_component * | component | ) |
return true iff component
is a worker component
int starpu_sched_component_is_simple_worker | ( | struct starpu_sched_component * | component | ) |
return true iff component
is a simple worker component
int starpu_sched_component_is_combined_worker | ( | struct starpu_sched_component * | component | ) |
return true iff component
is a combined worker component
void starpu_sched_component_worker_pre_exec_hook | ( | struct starpu_task * | task | ) |
compatibility with starpu_sched_policy interface update predictions for workers
void starpu_sched_component_worker_post_exec_hook | ( | struct starpu_task * | task | ) |
compatibility with starpu_sched_policy interface
struct starpu_sched_component * starpu_sched_component_fifo_create | ( | struct starpu_sched_tree * | tree, |
struct starpu_sched_component_fifo_data * | fifo_data | ||
) |
Return a struct starpu_sched_component with a fifo. A stable sort is performed according to tasks priorities. A push_task call on this component does not perform recursive calls, underlying components will have to call pop_task to get it. starpu_sched_component::estimated_end function compute the estimated length by dividing the sequential length by the number of underlying workers. Do not take into account tasks that are currently executed.
int starpu_sched_component_is_fifo | ( | struct starpu_sched_component * | component | ) |
return true iff component
is a fifo component
struct starpu_sched_component * starpu_sched_component_prio_create | ( | struct starpu_sched_tree * | tree, |
struct starpu_sched_component_prio_data * | prio_data | ||
) |
todo
int starpu_sched_component_is_prio | ( | struct starpu_sched_component * | component | ) |
todo
int starpu_sched_tree_work_stealing_push_task | ( | struct starpu_task * | task | ) |
undefined if there is no work stealing component in the scheduler. If any, task
is pushed in a default way if the caller is the application, and in the caller's fifo if its a worker.
int starpu_sched_component_is_work_stealing | ( | struct starpu_sched_component * | component | ) |
return true iff component
is a work stealing component
int starpu_sched_component_is_random | ( | struct starpu_sched_component * | ) |
return true iff component
is a random component
int starpu_sched_component_is_eager | ( | struct starpu_sched_component * | ) |
todo
int starpu_sched_component_is_eager_calibration | ( | struct starpu_sched_component * | ) |
todo
struct starpu_sched_component * starpu_sched_component_mct_create | ( | struct starpu_sched_tree * | tree, |
struct starpu_sched_component_mct_data * | mct_data | ||
) |
create a component with mct_data paremeters. the mct component doesnt do anything but pushing tasks on no_perf_model_component and calibrating_component
int starpu_sched_component_is_mct | ( | struct starpu_sched_component * | component | ) |
todo
struct starpu_sched_component * starpu_sched_component_heft_create | ( | struct starpu_sched_tree * | tree, |
struct starpu_sched_component_mct_data * | mct_data | ||
) |
this component perform a heft scheduling
int starpu_sched_component_is_heft | ( | struct starpu_sched_component * | component | ) |
return true iff component
is a heft component
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 | ||
) |
todo
int starpu_sched_component_is_perfmodel_select | ( | struct starpu_sched_component * | component | ) |
todo
struct starpu_sched_component_composed_recipe * starpu_sched_component_composed_recipe_create | ( | void | ) |
return an empty recipe for a composed component, it should not be used without modification
struct starpu_sched_component_composed_recipe * starpu_sched_component_composed_recipe_create_singleton | ( | struct starpu_sched_component *(*)(struct starpu_sched_tree *tree, void *arg) | create_component, |
void * | arg | ||
) |
return a recipe to build a composed component with a create_component
void starpu_sched_component_composed_recipe_add | ( | struct starpu_sched_component_composed_recipe * | recipe, |
struct starpu_sched_component *(*)(struct starpu_sched_tree *tree, void *arg) | create_component, | ||
void * | arg | ||
) |
add create_component
under all previous components in recipe
void starpu_sched_component_composed_recipe_destroy | ( | struct starpu_sched_component_composed_recipe * | ) |
destroy composed_sched_component, this should be done after starpu_sched_component_composed_component_create was called
struct starpu_sched_component * starpu_sched_component_composed_component_create | ( | struct starpu_sched_tree * | tree, |
struct starpu_sched_component_composed_recipe * | recipe | ||
) |
create a component that behave as all component of recipe where linked. Except that you cant use starpu_sched_component_is_foo function if recipe contain a single create_foo arg_foo pair, create_foo(arg_foo) is returned instead of a composed component
struct starpu_sched_tree * starpu_sched_component_make_scheduler | ( | unsigned | sched_ctx_id, |
struct starpu_sched_component_specs | s | ||
) |
this function build a scheduler for sched_ctx_id
according to s
and the hwloc topology of the machine.