/*! \page ModularizedScheduler Modularized Scheduler \section Introduction Scheduler are a tree-like structure of homogeneous nodes that each provides push and pop primitives. Each node may have one father by context, specially worker nodes ase they are shared between all contexts. Tasks make a top bottom traversal of tree. A push call on a node make either a recursive call on one of its childs or make the task stored in the node and made available to a pop, in this case that node should call available to wake workers up. Push must be called on a child, and only if this child can execute the task. A pop call on a node can either return a localy stored task or perform a recursive call on its father in its current context. Only workers can call pop. \section Initialization The scheduler is initialized with all workers, and workers are then added or removed by simply masking them. Scheduler nodes are created by starpu_sched_node_foo_create(void \* arg) , arg may be stored in starpu_sched_node::data The starpu_sched_node::init_data is the last function to be called during initialization, it can use starpu_sched_node::workers and starpu_sched_node::data. \section Push All scheduler node must define a starpu_sched_node::push_task function. The caller ensure that the node can realy execute the task. \section Pop starpu_sched_node::push_task should either return a local task or perform a recursive call on starpu_sched_node::fathers[sched_ctx_id], or \c NULL if its a root node. \section WorkersAndCombinedWorkers Workers and Combined workers Leafs are either a worker node that is bind to a starpu workers or a combined worker node that is bind to several worker nodes. Pushing a task on a combined worker node will in fact push a copy of that task on each worker node of the combined worker. A push call simply enqueue task in worker queue, no sort is performed here. If a worker call pop and get a parallel task, it will execute it with the combined worker it belong to. */