|
|
@@ -9,8 +9,8 @@
|
|
|
|
|
|
\section Introduction
|
|
|
|
|
|
-StarPU's Modularized Schedulers are made of individual Scheduling Components
|
|
|
-Modularizedly assembled as a Scheduling Tree. Each Scheduling Component has an
|
|
|
+StarPU's Modularized Schedulers are made of individual Scheduling Components
|
|
|
+Modularizedly assembled as a Scheduling Tree. Each Scheduling Component has an
|
|
|
unique purpose, such as prioritizing tasks or mapping tasks over resources.
|
|
|
A typical Scheduling Tree is shown below.
|
|
|
|
|
|
@@ -21,30 +21,30 @@ A typical Scheduling Tree is shown below.
|
|
|
v
|
|
|
Fifo_Component
|
|
|
| ^
|
|
|
- | |
|
|
|
+ | |
|
|
|
v |
|
|
|
Eager_Component
|
|
|
| ^
|
|
|
- | |
|
|
|
+ | |
|
|
|
v |
|
|
|
--------><--------------><--------
|
|
|
| ^ | ^
|
|
|
- | | | |
|
|
|
+ | | | |
|
|
|
v | v |
|
|
|
Fifo_Component Fifo_Component
|
|
|
| ^ | ^
|
|
|
- | | | |
|
|
|
+ | | | |
|
|
|
v | v |
|
|
|
Worker_Component Worker_Component
|
|
|
</pre>
|
|
|
|
|
|
When a task is pushed by StarPU in a Modularized Scheduler, the task moves from
|
|
|
a Scheduling Component to an other, following the hierarchy of the
|
|
|
-Scheduling Tree, and is stored in one of the Scheduling Components of the
|
|
|
+Scheduling Tree, and is stored in one of the Scheduling Components of the
|
|
|
strategy.
|
|
|
When a worker wants to pop a task from the Modularized Scheduler, the
|
|
|
-corresponding Worker Component of the Scheduling Tree tries to pull a task from
|
|
|
-its parents, following the hierarchy, and gives it to the worker if it succeded
|
|
|
+corresponding Worker Component of the Scheduling Tree tries to pull a task from
|
|
|
+its parents, following the hierarchy, and gives it to the worker if it succeded
|
|
|
to get one.
|
|
|
|
|
|
|
|
|
@@ -52,7 +52,7 @@ to get one.
|
|
|
|
|
|
\subsection ExistingModularizedSchedulers Existing Modularized Schedulers
|
|
|
|
|
|
-StarPU is currently shipped with the following pre-defined Modularized
|
|
|
+StarPU is currently shipped with the following pre-defined Modularized
|
|
|
Schedulers :
|
|
|
|
|
|
- Eager-based Schedulers (with/without prefetching) : \n
|
|
|
@@ -60,11 +60,11 @@ Naive scheduler, which tries to map a task on the first available resource
|
|
|
it finds.
|
|
|
|
|
|
- Prio-based Schedulers (with/without prefetching) : \n
|
|
|
-Similar to Eager-Based Schedulers. Can handle tasks which have a defined
|
|
|
+Similar to Eager-Based Schedulers. Can handle tasks which have a defined
|
|
|
priority and schedule them accordingly.
|
|
|
|
|
|
- Random-based Schedulers (with/without prefetching) : \n
|
|
|
-Selects randomly a resource to be mapped on for each task.
|
|
|
+Selects randomly a resource to be mapped on for each task.
|
|
|
|
|
|
- HEFT Scheduler : \n
|
|
|
Heterogeneous Earliest Finish Time Scheduler.
|
|
|
@@ -73,8 +73,8 @@ defined performance model (\ref PerformanceModelCalibration)
|
|
|
to work efficiently, but can handle tasks without a performance
|
|
|
model.
|
|
|
|
|
|
-It is currently needed to set the environment variable \ref STARPU_SCHED
|
|
|
-to use those Schedulers. Modularized Schedulers' naming is tree-*
|
|
|
+To use one of these schedulers, one can set the environment variable \ref STARPU_SCHED.
|
|
|
+All modularized schedulers are named following the RE <c>tree-*</c>
|
|
|
|
|
|
\subsection ExampleTreeEagerPrefetchingStrategy An Example : The Tree-Eager-Prefetching Strategy
|
|
|
|
|
|
@@ -89,7 +89,7 @@ to use those Schedulers. Modularized Schedulers' naming is tree-*
|
|
|
v |
|
|
|
Eager_Component
|
|
|
| ^
|
|
|
- | |
|
|
|
+ | |
|
|
|
v |
|
|
|
--------><-------------------><---------
|
|
|
| ^ | ^
|
|
|
@@ -104,22 +104,22 @@ to use those Schedulers. Modularized Schedulers' naming is tree-*
|
|
|
|
|
|
\subsection Interface
|
|
|
|
|
|
-Each Scheduling Component must follow the following pre-defined Interface
|
|
|
+Each Scheduling Component must follow the following pre-defined Interface
|
|
|
to be able to interact with other Scheduling Components.
|
|
|
|
|
|
- Push (Caller_Component, Child_Component, Task) \n
|
|
|
- The calling Scheduling Component transfers a task to its
|
|
|
- Child Component. When the Push function returns, the task no longer
|
|
|
- belongs to the calling Component. The Modularized Schedulers'
|
|
|
+ The calling Scheduling Component transfers a task to its
|
|
|
+ Child Component. When the Push function returns, the task no longer
|
|
|
+ belongs to the calling Component. The Modularized Schedulers'
|
|
|
model relies on this function to perform prefetching.
|
|
|
|
|
|
- Pull (Caller_Component, Parent_Component) -> Task \n
|
|
|
The calling Scheduling Component requests a task from
|
|
|
- its Parent Component. When the Pull function ends, the returned
|
|
|
+ its Parent Component. When the Pull function ends, the returned
|
|
|
task belongs to the calling Component.
|
|
|
|
|
|
- Can_Push (Caller_Component, Parent_Component) \n
|
|
|
- The calling Scheduling Component notifies its Parent Component that
|
|
|
+ The calling Scheduling Component notifies its Parent Component that
|
|
|
it is ready to accept new tasks.
|
|
|
|
|
|
- Can_Pull (Caller_Component, Child_Component) \n
|
|
|
@@ -127,13 +127,13 @@ to be able to interact with other Scheduling Components.
|
|
|
that it is ready to give new tasks.
|
|
|
|
|
|
|
|
|
-\section BuildAModularizedScheduler Build a Modularized Scheduler
|
|
|
+\section BuildAModularizedScheduler Building a Modularized Scheduler
|
|
|
|
|
|
\subsection PreImplementedComponents Pre-implemented Components
|
|
|
|
|
|
-StarPU is currently shipped with the following four Scheduling Components :
|
|
|
+StarPU is currently shipped with the following four Scheduling Components :
|
|
|
|
|
|
- - Flow-control Components : Fifo, Prio \n
|
|
|
+ - Flow-control Components : Fifo, Prio \n
|
|
|
Components which store tasks. They can also prioritize them if
|
|
|
they have a defined priority. It is possible to define a threshold
|
|
|
for those Components following two criterias : the number of tasks
|
|
|
@@ -148,19 +148,19 @@ StarPU is currently shipped with the following four Scheduling Components :
|
|
|
Each Worker Component modelize a concrete worker.
|
|
|
|
|
|
- Special-Purpose Components : Perfmodel_Select, Best_Implementation \n
|
|
|
- Components dedicated to original purposes. The Perfmodel_Select
|
|
|
- Component decides which Resource-Mapping Component should be used to
|
|
|
+ Components dedicated to original purposes. The Perfmodel_Select
|
|
|
+ Component decides which Resource-Mapping Component should be used to
|
|
|
schedule a task. The Best_Implementation Component chooses which
|
|
|
implementation of a task should be used on the choosen resource.
|
|
|
|
|
|
\subsection ProgressionAndValidationRules Progression And Validation Rules
|
|
|
|
|
|
-Some rules must be followed to ensure the correctness of a Modularized
|
|
|
+Some rules must be followed to ensure the correctness of a Modularized
|
|
|
Scheduler :
|
|
|
|
|
|
- - At least one Flow-control Component without threshold per Worker Component
|
|
|
- is needed in a Modularized Scheduler, to store incoming tasks from StarPU
|
|
|
- and to give tasks to Worker Components who asks for it. It is possible to
|
|
|
+ - At least one Flow-control Component without threshold per Worker Component
|
|
|
+ is needed in a Modularized Scheduler, to store incoming tasks from StarPU
|
|
|
+ and to give tasks to Worker Components who asks for it. It is possible to
|
|
|
use one Flow-control Component per Worker Component, or one for all Worker
|
|
|
Components, depending on how the Scheduling Tree is defined.
|
|
|
|
|
|
@@ -168,7 +168,7 @@ Scheduler :
|
|
|
Scheduler. Resource-Mapping Components are the only ones who can make
|
|
|
scheduling choices, and so the only ones who can have several child.
|
|
|
|
|
|
-\subsection ImplementAModularizedScheduler Implement a Modularized Scheduler
|
|
|
+\subsection ImplementAModularizedScheduler Implementing a Modularized Scheduler
|
|
|
|
|
|
The following code shows how the Tree-Eager-Prefetching Scheduler
|
|
|
shown in Section \ref ExampleTreeEagerPrefetchingStrategy is implemented :
|
|
|
@@ -188,7 +188,7 @@ static void initialize_eager_prefetching_center_policy(unsigned sched_ctx_id)
|
|
|
(sched_ctx_id, STARPU_WORKER_LIST);
|
|
|
|
|
|
/* Create the Scheduling Tree */
|
|
|
- struct starpu_sched_tree * t =
|
|
|
+ struct starpu_sched_tree * t =
|
|
|
starpu_sched_tree_create(sched_ctx_id);
|
|
|
|
|
|
/* The Root Component is a Flow-control Fifo Component */
|
|
|
@@ -199,16 +199,16 @@ static void initialize_eager_prefetching_center_policy(unsigned sched_ctx_id)
|
|
|
struct starpu_sched_component * eager_component =
|
|
|
starpu_sched_component_eager_create(NULL);
|
|
|
|
|
|
- /* Create links between Components : the Eager Component is the child
|
|
|
+ /* Create links between Components : the Eager Component is the child
|
|
|
* of the Root Component */
|
|
|
t->root->add_child
|
|
|
(t->root, eager_component);
|
|
|
eager_component->add_father
|
|
|
(eager_component, t->root);
|
|
|
|
|
|
- /* A task threshold is set for the Flow-control Components which will
|
|
|
- * be connected to Worker Components. By doing so, this Modularized
|
|
|
- * Scheduler will be able to perform some prefetching on the resources
|
|
|
+ /* A task threshold is set for the Flow-control Components which will
|
|
|
+ * be connected to Worker Components. By doing so, this Modularized
|
|
|
+ * Scheduler will be able to perform some prefetching on the resources
|
|
|
*/
|
|
|
struct starpu_sched_component_fifo_data fifo_data =
|
|
|
{
|
|
|
@@ -218,11 +218,11 @@ static void initialize_eager_prefetching_center_policy(unsigned sched_ctx_id)
|
|
|
|
|
|
unsigned i;
|
|
|
for(i = 0;
|
|
|
- i < starpu_worker_get_count() +
|
|
|
+ i < starpu_worker_get_count() +
|
|
|
starpu_combined_worker_get_count();
|
|
|
i++)
|
|
|
{
|
|
|
- /* Each Worker Component has a Flow-control Fifo Component as
|
|
|
+ /* Each Worker Component has a Flow-control Fifo Component as
|
|
|
* father */
|
|
|
struct starpu_sched_component * worker_component =
|
|
|
starpu_sched_component_worker_get(i);
|
|
|
@@ -233,8 +233,8 @@ static void initialize_eager_prefetching_center_policy(unsigned sched_ctx_id)
|
|
|
worker_component->add_father
|
|
|
(worker_component, fifo_component);
|
|
|
|
|
|
- /* Each Flow-control Fifo Component associated to a Worker
|
|
|
- * Component is linked to the Eager Component as one of its
|
|
|
+ /* Each Flow-control Fifo Component associated to a Worker
|
|
|
+ * Component is linked to the Eager Component as one of its
|
|
|
* children */
|
|
|
eager_component->add_child
|
|
|
(eager_component, fifo_component);
|
|
|
@@ -276,7 +276,7 @@ struct starpu_sched_policy _starpu_sched_tree_eager_prefetching_policy =
|
|
|
};
|
|
|
\endcode
|
|
|
|
|
|
-\section WriteASchedulingComponent Write a Scheduling Component
|
|
|
+\section WriteASchedulingComponent Writing a Scheduling Component
|
|
|
|
|
|
\subsection GenericSchedulingComponent Generic Scheduling Component
|
|
|
|
|
|
@@ -284,10 +284,10 @@ Each Scheduling Component is instantiated from a Generic Scheduling Component,
|
|
|
which implements a generic version of the Interface. The generic implementation
|
|
|
of Pull, Can_Pull and Can_Push functions are recursive calls to their parents
|
|
|
(respectively to their children). However, as a Generic Scheduling Component do
|
|
|
-not know how much children it will have when it will be instantiated, it does
|
|
|
+not know how much children it will have when it will be instantiated, it does
|
|
|
not implement the Push function.
|
|
|
|
|
|
-\subsection InstantiationRedefineInterface Instantiation : Redefine the Interface
|
|
|
+\subsection InstantiationRedefineInterface Instantiation : Redefining the Interface
|
|
|
|
|
|
A Scheduling Component must implement all the functions of the Interface. It is
|
|
|
so necessary to implement a Push function to instantiate a Scheduling Component.
|
|
|
@@ -297,7 +297,7 @@ to the Scheduling Component he is implementing, it is possible to reimplement
|
|
|
all the functions of the Interface. For example, a Flow-control Component
|
|
|
reimplements the Pull and the Can_Push functions of the Interface, allowing him
|
|
|
to catch the generic recursive calls of these functions. The Pull function of
|
|
|
-a Flow-control Component can, for example, pop a task from the local storage
|
|
|
+a Flow-control Component can, for example, pop a task from the local storage
|
|
|
queue of the Component, and give it to the calling Component which asks for it.
|
|
|
|
|
|
\subsection DetailedProgressionAndValidationRules Detailed Progression and Validation Rules
|
|
|
@@ -307,18 +307,18 @@ queue of the Component, and give it to the calling Component which asks for it.
|
|
|
Areas in the Scheduling Tree.
|
|
|
|
|
|
- A Pump is the engine source of the Scheduler : it pushes/pulls tasks
|
|
|
- to/from a Scheduling Component to an other. Native Pumps of a Scheduling
|
|
|
- Tree are located at the root of the Tree (incoming Push calls from StarPU),
|
|
|
- and at the leafs of the Tree (Pop calls coming from StarPU Workers).
|
|
|
- Pre-implemented Scheduling Components currently shipped with Pumps are
|
|
|
- Flow-Control Components and the Resource-Mapping Component Heft, within
|
|
|
+ to/from a Scheduling Component to an other. Native Pumps of a Scheduling
|
|
|
+ Tree are located at the root of the Tree (incoming Push calls from StarPU),
|
|
|
+ and at the leafs of the Tree (Pop calls coming from StarPU Workers).
|
|
|
+ Pre-implemented Scheduling Components currently shipped with Pumps are
|
|
|
+ Flow-Control Components and the Resource-Mapping Component Heft, within
|
|
|
their defined Can_Push functions.
|
|
|
|
|
|
- - A correct Scheduling Tree requires a Pump per Scheduling Area and per
|
|
|
- Execution Flow.
|
|
|
+ - A correct Scheduling Tree requires a Pump per Scheduling Area and per
|
|
|
+ Execution Flow.
|
|
|
|
|
|
|
|
|
-The Tree-Eager-Prefetching Scheduler shown in Section
|
|
|
+The Tree-Eager-Prefetching Scheduler shown in Section
|
|
|
\ref ExampleTreeEagerPrefetchingStrategy follows the previous assumptions :
|
|
|
|
|
|
<pre>
|
|
|
@@ -335,7 +335,7 @@ The Tree-Eager-Prefetching Scheduler shown in Section
|
|
|
v |
|
|
|
Area 2 Eager_Component
|
|
|
| ^
|
|
|
- | |
|
|
|
+ | |
|
|
|
v |
|
|
|
--------><-------------------><---------
|
|
|
| ^ | ^
|
|
|
@@ -350,4 +350,3 @@ The Tree-Eager-Prefetching Scheduler shown in Section
|
|
|
</pre>
|
|
|
|
|
|
*/
|
|
|
-
|