![]() |
The Gaudi Framework
v27r0
|
The SchedulerSvc implements the IScheduler interface. More...
#include <GaudiKernel/ForwardSchedulerSvc.h>
Public Member Functions | |
ForwardSchedulerSvc (const std::string &name, ISvcLocator *svc) | |
Constructor. More... | |
~ForwardSchedulerSvc () | |
Destructor. More... | |
virtual StatusCode | initialize () |
Initialise. More... | |
virtual StatusCode | finalize () |
Finalise. More... | |
virtual StatusCode | pushNewEvent (EventContext *eventContext) |
Make an event available to the scheduler. More... | |
virtual StatusCode | pushNewEvents (std::vector< EventContext * > &eventContexts) |
virtual StatusCode | popFinishedEvent (EventContext *&eventContext) |
Blocks until an event is availble. More... | |
virtual StatusCode | tryPopFinishedEvent (EventContext *&eventContext) |
Try to fetch an event from the scheduler. More... | |
virtual unsigned int | freeSlots () |
Get free slots number. More... | |
![]() | |
void * | i_cast (const InterfaceID &tid) const override |
Implementation of IInterface::i_cast. More... | |
StatusCode | queryInterface (const InterfaceID &ti, void **pp) override |
Implementation of IInterface::queryInterface. More... | |
std::vector< std::string > | getInterfaceNames () const override |
Implementation of IInterface::getInterfaceNames. More... | |
~extends () override=default | |
Virtual destructor. More... | |
void * | i_cast (const InterfaceID &tid) const override |
Implementation of IInterface::i_cast. More... | |
StatusCode | queryInterface (const InterfaceID &ti, void **pp) override |
Implementation of IInterface::queryInterface. More... | |
std::vector< std::string > | getInterfaceNames () const override |
Implementation of IInterface::getInterfaceNames. More... | |
~extends () override=default | |
Virtual destructor. More... | |
![]() | |
~extend_interfaces () override=default | |
Virtual destructor. More... | |
~extend_interfaces () override=default | |
Virtual destructor. More... | |
Private Types | |
typedef std::function< StatusCode()> | action |
Private Member Functions | |
void | activate () |
Activate scheduler. More... | |
StatusCode | deactivate () |
Deactivate scheduler. More... | |
unsigned int | algname2index (const std::string &algoname) |
Convert a name to an integer. More... | |
const std::string & | index2algname (unsigned int index) |
Convert an integer to a name. More... | |
StatusCode | eventFailed (EventContext *eventContext) |
Method to check if an event failed and take appropriate actions. More... | |
StatusCode | updateStates (int si=-1, const std::string &algo_name=std::string()) |
Loop on algorithm in the slots and promote them to successive states (-1 means all slots, while empty string means skipping an update of the Control Flow state) More... | |
StatusCode | promoteToControlReady (unsigned int iAlgo, int si) |
Algorithm promotion: Accepted by the control flow. More... | |
StatusCode | promoteToDataReady (unsigned int iAlgo, int si) |
StatusCode | promoteToScheduled (unsigned int iAlgo, int si) |
StatusCode | promoteToExecuted (unsigned int iAlgo, int si, IAlgorithm *algo) |
The call to this method is triggered only from within the AlgoExecutionTask. More... | |
StatusCode | promoteToFinished (unsigned int iAlgo, int si) |
StatusCode | isStalled (int si) |
Check if the scheduling is in a stall. More... | |
void | dumpSchedulerState (int iSlot) |
Dump the state of the scheduler. More... | |
StatusCode | m_drain () |
Drain the actions present in the queue. More... | |
Private Attributes | |
bool | m_isActive |
Flag to track if the scheduler is active or not. More... | |
std::thread | m_thread |
The thread in which the activate function runs. More... | |
std::unordered_map< std::string, unsigned int > | m_algname_index_map |
Map to bookkeep the information necessary to the name2index conversion. More... | |
std::vector< std::string > | m_algname_vect |
Vector to bookkeep the information necessary to the index2name conversion. More... | |
SmartIF< IHiveWhiteBoard > | m_whiteboard |
A shortcut to the whiteboard. More... | |
std::string | m_whiteboardSvcName |
The whiteboard name. More... | |
std::vector< EventSlot > | m_eventSlots |
Vector of events slots. More... | |
int | m_maxEventsInFlight |
Maximum number of event processed simultaneously. More... | |
std::atomic_int | m_freeSlots |
Atomic to account for asyncronous updates by the scheduler wrt the rest. More... | |
tbb::concurrent_bounded_queue< EventContext * > | m_finishedEvents |
Queue of finished events. More... | |
unsigned int | m_maxAlgosInFlight |
Maximum number of simultaneous algorithms. More... | |
unsigned int | m_algosInFlight |
Number of algoritms presently in flight. More... | |
bool | m_updateNeeded |
Keep track of update actions scheduled. More... | |
SmartIF< IAlgResourcePool > | m_algResourcePool |
Cache for the algorithm resource pool. More... | |
std::vector< std::vector< std::string > > | m_algosDependencies |
Ugly, will disappear when the deps are declared only within the C++ code of the algos. More... | |
int | m_threadPoolSize |
Size of the threadpool initialised by TBB; a value of -1 gives TBB the freedom to choose. More... | |
tbb::concurrent_bounded_queue< action > | m_actionsQueue |
Queue where closures are stored and picked for execution. More... | |
concurrency::ExecutionFlowManager | m_efManager |
Member to take care of the control flow. More... | |
bool | m_CFNext |
bool | m_DFNext |
bool | m_simulateExecution |
std::string | m_optimizationMode |
bool | m_dumpIntraEventDynamics |
Friends | |
class | AlgoExecutionTask |
Additional Inherited Members | |
![]() | |
using | base_class = extends |
Typedef to this class. More... | |
using | extend_interfaces_base = extend_interfaces< Interfaces...> |
Typedef to the base of this class. More... | |
using | base_class = extends |
Typedef to this class. More... | |
using | extend_interfaces_base = extend_interfaces< Interfaces...> |
Typedef to the base of this class. More... | |
![]() | |
using | ext_iids = typename Gaudi::interface_list_cat< typename Interfaces::ext_iids...>::type |
take union of the ext_iids of all Interfaces... More... | |
using | ext_iids = typename Gaudi::interface_list_cat< typename Interfaces::ext_iids...>::type |
take union of the ext_iids of all Interfaces... More... | |
The SchedulerSvc implements the IScheduler interface.
It manages all the execution states of the algorithms and interacts with the TBB runtime for the algorithm tasks submission. A state machine takes care of the tracking of the execution state of the algorithms. This is a forward scheduler: algorithms are scheduled for execution as soon as their data dependencies are available in the whiteboard.
The activate() method runs in a separate thread. It checks a TBB concurrent bounded queue of closures in a loop via the Pop method. This allows not to use a cpu entirely to check the presence of new actions to be taken. In other words, the asynchronous actions are serialised via the actions queue. Once a task terminates, a call to the promoteToExecuted method will be pushed into the actions queue. The promoteToExecuted method also triggers a call to the updateStates method, which brushes all algorithms, checking if their state can be changed. It's indeed possible that upon termination of an algorithm, the control flow and/or the data flow allow the submission of more algorithms.
There are two ways of declaring algorithms dependencies. One which is only temporarly available to ease developments consists in declaring them through AlgosDependencies property as a list of list. The order of these sublist must be the same one of the algorithms in the TopAlg list. The second one consists in declaring the data dependencies directly within the algorithms via data object handles.
The scheduler accepts events to be processed (in the form of eventContexts) and releases processed events. This flow is implemented through three methods:
Please refer to the full documentation of the methods for more details.
Definition at line 72 of file ForwardSchedulerSvc.h.
|
private |
Definition at line 195 of file ForwardSchedulerSvc.h.
ForwardSchedulerSvc::ForwardSchedulerSvc | ( | const std::string & | name, |
ISvcLocator * | svc | ||
) |
Constructor.
Definition at line 32 of file ForwardSchedulerSvc.cpp.
ForwardSchedulerSvc::~ForwardSchedulerSvc | ( | ) |
|
private |
Activate scheduler.
Activate the scheduler.
From this moment on the queue of actions is checked. The checking will stop when the m_isActive flag is false and the queue is not empty. This will guarantee that all actions are executed and a stall is not created. The TBB pool must be initialised in the thread from where the tasks are launched (http://threadingbuildingblocks.org/docs/doxygen/a00342.html) The scheduler is initialised here since this method runs in a separate thread and spawns the tasks (through the execution of the lambdas)
Activate a pool
Definition at line 238 of file ForwardSchedulerSvc.cpp.
|
inlineprivate |
Convert a name to an integer.
Definition at line 311 of file ForwardSchedulerSvc.cpp.
|
private |
Deactivate scheduler.
Deactivates the scheduler.
Two actions are pushed into the queue: 1) Drain the scheduler until all events are finished. 2) Flip the status flag m_isActive to false This second action is the last one to be executed by the scheduler.
Definition at line 287 of file ForwardSchedulerSvc.cpp.
|
private |
Dump the state of the scheduler.
Used for debugging purposes, the state of the scheduler is dumped on screen in order to be inspected.
The dependencies of each algo are printed and the missing ones specified.
Definition at line 695 of file ForwardSchedulerSvc.cpp.
|
private |
Method to check if an event failed and take appropriate actions.
It can be possible that an event fails.
In this case this method is called. It dumps the state of the scheduler, drains the actions (without executing them) and events in the queues and returns a failure.
Definition at line 436 of file ForwardSchedulerSvc.cpp.
|
virtual |
Finalise.
Here the scheduler is deactivated and the thread joined.
Definition at line 209 of file ForwardSchedulerSvc.cpp.
|
virtual |
Get free slots number.
Definition at line 378 of file ForwardSchedulerSvc.cpp.
|
inlineprivate |
Convert an integer to a name.
Definition at line 305 of file ForwardSchedulerSvc.cpp.
|
virtual |
Initialise.
Here, among some "bureaucracy" operations, the scheduler is activated, executing the activate() function in a new thread.
In addition the algorithms list is acquired from the algResourcePool.
Definition at line 61 of file ForwardSchedulerSvc.cpp.
|
private |
Check if the scheduling is in a stall.
Check if we are in present of a stall condition for a particular slot.
This is the case when no actions are present in the actionsQueue, no algorithm is in flight and no algorithm has all of its dependencies satisfied.
Definition at line 670 of file ForwardSchedulerSvc.cpp.
|
private |
Drain the actions present in the queue.
Update the states for all slots until nothing is left to do.
Definition at line 386 of file ForwardSchedulerSvc.cpp.
|
virtual |
Blocks until an event is availble.
Get a finished event or block until one becomes available.
Definition at line 402 of file ForwardSchedulerSvc.cpp.
|
private |
Algorithm promotion: Accepted by the control flow.
Definition at line 769 of file ForwardSchedulerSvc.cpp.
|
private |
Definition at line 783 of file ForwardSchedulerSvc.cpp.
|
private |
The call to this method is triggered only from within the AlgoExecutionTask.
Definition at line 855 of file ForwardSchedulerSvc.cpp.
|
private |
|
private |
Definition at line 806 of file ForwardSchedulerSvc.cpp.
|
virtual |
Make an event available to the scheduler.
Add event to the scheduler.
There are two cases possible: 1) No slot is free. A StatusCode::FAILURE is returned. 2) At least one slot is free. An action which resets the slot and kicks off its update is queued.
Definition at line 324 of file ForwardSchedulerSvc.cpp.
|
virtual |
Definition at line 368 of file ForwardSchedulerSvc.cpp.
|
virtual |
Try to fetch an event from the scheduler.
Try to get a finished event, if not available just return a failure.
Definition at line 419 of file ForwardSchedulerSvc.cpp.
|
private |
Loop on algorithm in the slots and promote them to successive states (-1 means all slots, while empty string means skipping an update of the Control Flow state)
Update the state of the algorithms.
The oldest events are checked before the newest, in order to reduce the event backlog. To check if the event is finished the algorithm checks if:
Definition at line 474 of file ForwardSchedulerSvc.cpp.
|
friend |
Definition at line 214 of file ForwardSchedulerSvc.h.
|
private |
Queue where closures are stored and picked for execution.
Definition at line 198 of file ForwardSchedulerSvc.h.
|
private |
Map to bookkeep the information necessary to the name2index conversion.
Definition at line 122 of file ForwardSchedulerSvc.h.
|
private |
Vector to bookkeep the information necessary to the index2name conversion.
Definition at line 128 of file ForwardSchedulerSvc.h.
|
private |
Ugly, will disappear when the deps are declared only within the C++ code of the algos.
Definition at line 185 of file ForwardSchedulerSvc.h.
|
private |
Number of algoritms presently in flight.
Definition at line 158 of file ForwardSchedulerSvc.h.
|
private |
Cache for the algorithm resource pool.
Definition at line 182 of file ForwardSchedulerSvc.h.
|
private |
Definition at line 203 of file ForwardSchedulerSvc.h.
|
private |
Definition at line 205 of file ForwardSchedulerSvc.h.
|
private |
Definition at line 211 of file ForwardSchedulerSvc.h.
|
private |
Member to take care of the control flow.
Definition at line 201 of file ForwardSchedulerSvc.h.
|
private |
Vector of events slots.
Definition at line 137 of file ForwardSchedulerSvc.h.
|
private |
Queue of finished events.
Definition at line 146 of file ForwardSchedulerSvc.h.
|
private |
Atomic to account for asyncronous updates by the scheduler wrt the rest.
Definition at line 143 of file ForwardSchedulerSvc.h.
|
private |
Flag to track if the scheduler is active or not.
Definition at line 113 of file ForwardSchedulerSvc.h.
|
private |
Maximum number of simultaneous algorithms.
Definition at line 155 of file ForwardSchedulerSvc.h.
|
private |
Maximum number of event processed simultaneously.
Definition at line 140 of file ForwardSchedulerSvc.h.
|
private |
Definition at line 209 of file ForwardSchedulerSvc.h.
|
private |
Definition at line 207 of file ForwardSchedulerSvc.h.
|
private |
The thread in which the activate function runs.
Definition at line 116 of file ForwardSchedulerSvc.h.
|
private |
Size of the threadpool initialised by TBB; a value of -1 gives TBB the freedom to choose.
Definition at line 191 of file ForwardSchedulerSvc.h.
|
private |
Keep track of update actions scheduled.
Definition at line 178 of file ForwardSchedulerSvc.h.
|
private |
A shortcut to the whiteboard.
Definition at line 131 of file ForwardSchedulerSvc.h.
|
private |
The whiteboard name.
Definition at line 134 of file ForwardSchedulerSvc.h.