The Gaudi Framework  master (ff829712)
Loading...
Searching...
No Matches
PrecedenceSvc Class Reference

A service to resolve the task execution precedence. More...

#include <GaudiHive/PrecedenceSvc.h>

Inheritance diagram for PrecedenceSvc:
Collaboration diagram for PrecedenceSvc:

Public Member Functions

 PrecedenceSvc (const std::string &name, ISvcLocator *svcLoc)
 Constructor.
 
StatusCode initialize () override
 Initialize.
 
StatusCode finalize () override
 Finalize.
 
StatusCode iterate (EventSlot &, const Cause &) override
 Infer the precedence effect caused by an execution flow event.
 
StatusCode simulate (EventSlot &) const override
 Simulate execution flow.
 
bool CFRulesResolved (EventSlot &) const override
 Check if the root CF decision is resolved.
 
uint getPriority (const std::string &name) const override
 Get priority of an algorithm.
 
bool isAsynchronous (const std::string &name) const override
 Check if a task is asynchronous.
 
void dumpControlFlow () const override
 Dump precedence rules.
 
void dumpDataFlow () const override
 
const std::string printState (EventSlot &) const override
 
void dumpPrecedenceRules (const EventSlot &) override
 Dump precedence rules (available only in DEBUG mode, and must be enabled with the corresponding service property)
 
void dumpPrecedenceTrace (const EventSlot &) override
 Dump precedence trace (available only in DEBUG mode, and must be enabled with the corresponding service property)
 
const concurrency::PrecedenceRulesGraphgetRules () const
 Precedence rules accessor.
 
- Public Member Functions inherited from extends< Service, IPrecedenceSvc >
void const * i_cast (const InterfaceID &tid) const override
 Implementation of IInterface::i_cast.
 
StatusCode queryInterface (const InterfaceID &ti, void **pp) override
 Implementation of IInterface::queryInterface.
 
std::vector< std::string > getInterfaceNames () const override
 Implementation of IInterface::getInterfaceNames.
 
- Public Member Functions inherited from Service
const std::string & name () const override
 Retrieve name of the service.
 
StatusCode configure () override
 
StatusCode initialize () override
 
StatusCode start () override
 
StatusCode stop () override
 
StatusCode finalize () override
 
StatusCode terminate () override
 
Gaudi::StateMachine::State FSMState () const override
 
Gaudi::StateMachine::State targetFSMState () const override
 
StatusCode reinitialize () override
 
StatusCode restart () override
 
StatusCode sysInitialize () override
 Initialize Service.
 
StatusCode sysStart () override
 Initialize Service.
 
StatusCode sysStop () override
 Initialize Service.
 
StatusCode sysFinalize () override
 Finalize Service.
 
StatusCode sysReinitialize () override
 Re-initialize the Service.
 
StatusCode sysRestart () override
 Re-initialize the Service.
 
 Service (std::string name, ISvcLocator *svcloc)
 Standard Constructor.
 
SmartIF< ISvcLocator > & serviceLocator () const override
 Retrieve pointer to service locator.
 
template<typename IFace = IService>
SmartIF< IFace > service (const std::string &name, bool createIf=true) const
 
template<class T>
Gaudi::Details::PropertyBasedeclareProperty (const std::string &name, ToolHandle< T > &hndl, const std::string &doc="none")
 
template<class T>
StatusCode declareTool (ToolHandle< T > &handle, bool createIf=true)
 
template<class T>
StatusCode declareTool (ToolHandle< T > &handle, const std::string &toolTypeAndName, bool createIf=true)
 Declare used tool.
 
template<class T>
Gaudi::Details::PropertyBasedeclareProperty (const std::string &name, ToolHandleArray< T > &hndlArr, const std::string &doc="none")
 
template<class T>
void addToolsArray (ToolHandleArray< T > &hndlArr)
 
const std::vector< IAlgTool * > & tools () const
 
SmartIF< IAuditorSvc > & auditorSvc () const
 The standard auditor service.May not be invoked before sysInitialize() has been invoked.
 
- Public Member Functions inherited from PropertyHolder< CommonMessaging< implements< IService, IProperty, IStateful > > >
StatusCode setProperty (const Gaudi::Details::PropertyBase &p)
 Set the property from a property.
 
StatusCode setProperty (const std::string &name, const char *v)
 Special case for string literals.
 
StatusCode setProperty (const std::string &name, const std::string &v)
 Special case for std::string.
 
StatusCode setProperty (const std::string &name, const TYPE &value)
 set the property form the value
 
 PropertyHolder ()=default
 
Gaudi::Details::PropertyBasedeclareProperty (Gaudi::Details::PropertyBase &prop)
 Declare a property.
 
Gaudi::Details::PropertyBasedeclareProperty (const std::string &name, TYPE &value, const std::string &doc="none")
 Helper to wrap a regular data member and use it as a regular property.
 
Gaudi::Details::PropertyBasedeclareProperty (const std::string &name, Gaudi::Property< TYPE, VERIFIER, HANDLERS > &prop, const std::string &doc="none")
 Declare a PropertyBase instance setting name and documentation.
 
Gaudi::Details::PropertyBasedeclareRemoteProperty (const std::string &name, IProperty *rsvc, const std::string &rname="")
 Declare a remote property.
 
StatusCode setProperty (const std::string &name, const Gaudi::Details::PropertyBase &p) override
 set the property from another property with a different name
 
StatusCode setProperty (const std::string &s) override
 set the property from the formatted string
 
StatusCode setProperty (const Gaudi::Details::PropertyBase &p)
 Set the property from a property.
 
StatusCode setProperty (const std::string &name, const char *v)
 Special case for string literals.
 
StatusCode setProperty (const std::string &name, const std::string &v)
 Special case for std::string.
 
StatusCode setProperty (const std::string &name, const TYPE &value)
 set the property form the value
 
StatusCode setPropertyRepr (const std::string &n, const std::string &r) override
 set the property from name and value string representation
 
StatusCode getProperty (Gaudi::Details::PropertyBase *p) const override
 get the property
 
const Gaudi::Details::PropertyBasegetProperty (std::string_view name) const override
 get the property by name
 
StatusCode getProperty (std::string_view n, std::string &v) const override
 convert the property to the string
 
const std::vector< Gaudi::Details::PropertyBase * > & getProperties () const override
 get all properties
 
bool hasProperty (std::string_view name) const override
 Return true if we have a property with the given name.
 
Gaudi::Details::PropertyBaseproperty (std::string_view name) const
 \fixme property and bindPropertiesTo should be protected
 
void bindPropertiesTo (Gaudi::Interfaces::IOptionsSvc &optsSvc)
 
 PropertyHolder (const PropertyHolder &)=delete
 
PropertyHolderoperator= (const PropertyHolder &)=delete
 
- Public Member Functions inherited from CommonMessaging< implements< IService, IProperty, IStateful > >
MSG::Level msgLevel () const
 get the cached level (originally extracted from the embedded MsgStream)
 
bool msgLevel (MSG::Level lvl) const
 get the output level from the embedded MsgStream
 
- Public Member Functions inherited from CommonMessagingBase
virtual ~CommonMessagingBase ()=default
 Virtual destructor.
 
const SmartIF< IMessageSvc > & msgSvc () const
 The standard message service.
 
MsgStreammsgStream () const
 Return an uninitialized MsgStream.
 
MsgStreammsgStream (const MSG::Level level) const
 Predefined configurable message stream for the efficient printouts.
 
MsgStreamalways () const
 shortcut for the method msgStream(MSG::ALWAYS)
 
MsgStreamfatal () const
 shortcut for the method msgStream(MSG::FATAL)
 
MsgStreamerr () const
 shortcut for the method msgStream(MSG::ERROR)
 
MsgStreamerror () const
 shortcut for the method msgStream(MSG::ERROR)
 
MsgStreamwarning () const
 shortcut for the method msgStream(MSG::WARNING)
 
MsgStreaminfo () const
 shortcut for the method msgStream(MSG::INFO)
 
MsgStreamdebug () const
 shortcut for the method msgStream(MSG::DEBUG)
 
MsgStreamverbose () const
 shortcut for the method msgStream(MSG::VERBOSE)
 
MsgStreammsg () const
 shortcut for the method msgStream(MSG::INFO)
 

Private Member Functions

StatusCode assembleCFRules (Gaudi::Algorithm *, const std::string &, unsigned int recursionDepth=0)
 

Private Attributes

SmartIF< IAlgResourcePoolm_algResourcePool
 A shortcut to the algorithm resource pool.
 
concurrency::PrecedenceRulesGraph m_PRGraph { "PrecedenceRulesGraph", serviceLocator() }
 Graph of precedence rules.
 
Gaudi::Property< std::string > m_mode { this, "TaskPriorityRule", "", "Task avalanche induction strategy." }
 Scheduling strategy.
 
Gaudi::Property< bool > m_ignoreDFRules { this, "IgnoreDFRules", false, "Ignore the data flow rules." }
 Scheduling strategy.
 
boost::filesystem::path m_dumpDirName
 Precedence analysis facilities.
 
Gaudi::Property< bool > m_dumpPrecTrace
 
Gaudi::Property< std::string > m_dumpPrecTraceFile
 
Gaudi::Property< bool > m_dumpPrecRules { this, "DumpPrecedenceRules", false, "Dump task precedence rules." }
 
Gaudi::Property< std::string > m_dumpPrecRulesFile
 
Gaudi::Property< bool > m_verifyRules
 
Gaudi::Property< bool > m_showDataFlow
 

Additional Inherited Members

- Public Types inherited from extends< Service, IPrecedenceSvc >
using base_class
 Typedef to this class.
 
using extend_interfaces_base
 Typedef to the base of this class.
 
- Public Types inherited from Service
using Factory = Gaudi::PluginService::Factory<IService*( const std::string&, ISvcLocator* )>
 
- Public Types inherited from PropertyHolder< CommonMessaging< implements< IService, IProperty, IStateful > > >
using PropertyHolderImpl
 Typedef used to refer to this class from derived classes, as in.
 
- Public Types inherited from CommonMessaging< implements< IService, IProperty, IStateful > >
using base_class
 
- Public Types inherited from extend_interfaces< Interfaces... >
using ext_iids
 take union of the ext_iids of all Interfaces...
 
- Protected Member Functions inherited from Service
std::vector< IAlgTool * > & tools ()
 
 ~Service () override
 
int outputLevel () const
 get the Service's output level
 
- Protected Member Functions inherited from CommonMessaging< implements< IService, IProperty, IStateful > >
MSG::Level setUpMessaging () const
 Set up local caches.
 
MSG::Level resetMessaging ()
 Reinitialize internal states.
 
void updateMsgStreamOutputLevel (int level)
 Update the output level of the cached MsgStream.
 
- Protected Attributes inherited from Service
Gaudi::StateMachine::State m_state = Gaudi::StateMachine::OFFLINE
 Service state.
 
Gaudi::StateMachine::State m_targetState = Gaudi::StateMachine::OFFLINE
 Service state.
 
Gaudi::Property< int > m_outputLevel { this, "OutputLevel", MSG::NIL, "output level" }
 flag indicating whether ToolHandle tools have been added to m_tools
 
Gaudi::Property< bool > m_auditorInitialize { this, "AuditInitialize", false, "trigger auditor on initialize()" }
 
Gaudi::Property< bool > m_auditorStart { this, "AuditStart", false, "trigger auditor on start()" }
 
Gaudi::Property< bool > m_auditorStop { this, "AuditStop", false, "trigger auditor on stop()" }
 
Gaudi::Property< bool > m_auditorFinalize { this, "AuditFinalize", false, "trigger auditor on finalize()" }
 
Gaudi::Property< bool > m_auditorReinitialize { this, "AuditReinitialize", false, "trigger auditor on reinitialize()" }
 
Gaudi::Property< bool > m_auditorRestart { this, "AuditRestart", false, "trigger auditor on restart()" }
 
Gaudi::Property< bool > m_autoRetrieveTools
 
Gaudi::Property< bool > m_checkToolDeps
 
SmartIF< IAuditorSvcm_pAuditorSvc
 Auditor Service.
 

Detailed Description

A service to resolve the task execution precedence.

Author
Illya Shapoval @created Aug 7, 2017

Definition at line 30 of file PrecedenceSvc.h.

Constructor & Destructor Documentation

◆ PrecedenceSvc()

PrecedenceSvc::PrecedenceSvc ( const std::string & name,
ISvcLocator * svcLoc )
inline

Constructor.

Definition at line 34 of file PrecedenceSvc.h.

34: base_class( name, svcLoc ) {}
const std::string & name() const override
Retrieve name of the service.
Definition Service.cpp:333

Member Function Documentation

◆ assembleCFRules()

StatusCode PrecedenceSvc::assembleCFRules ( Gaudi::Algorithm * algo,
const std::string & parentName,
unsigned int recursionDepth = 0 )
private

Definition at line 149 of file PrecedenceSvc.cpp.

150 {
151 using namespace concurrency;
152
153 StatusCode sc = StatusCode::SUCCESS;
154
155 ++recursionDepth;
156
157 bool isGaudiSequencer( false );
158 bool isAthSequencer( false );
159
160 if ( !algo->isSequence() ) {
161 ON_DEBUG debug() << std::string( recursionDepth, ' ' ) << "Algorithm '" << algo->name() << "' discovered" << endmsg;
162 sc = m_PRGraph.addAlgorithmNode( algo, parentName );
163 return sc;
164 } else {
165 if ( algo->hasProperty( "ShortCircuit" ) )
166 isGaudiSequencer = true;
167 else if ( algo->hasProperty( "StopOverride" ) )
168 isAthSequencer = true;
169 }
170
171 auto seq = dynamic_cast<Gaudi::Sequence*>( algo );
172 if ( seq == 0 ) {
173 error() << "Algorithm " << algo->name() << " has isSequence==true, but unable to dcast to Sequence" << endmsg;
174 return StatusCode::FAILURE;
175 }
176
177 auto subAlgorithms = seq->subAlgorithms();
178
179 // Recursively unroll
180 ON_DEBUG debug() << std::string( recursionDepth, ' ' ) << "Decision hub '" << algo->name() << "' discovered"
181 << endmsg;
182 bool modeOr = false;
183 bool allPass = false;
184 bool promptDecision = false;
185 bool isSequential = false;
186 bool isInverted = false;
187
188 if ( isGaudiSequencer ) {
189 modeOr = ( algo->getProperty( "ModeOR" ).toString() == "True" );
190 allPass = ( algo->getProperty( "IgnoreFilterPassed" ).toString() == "True" );
191 promptDecision = ( algo->getProperty( "ShortCircuit" ).toString() == "True" );
192 isInverted = ( algo->getProperty( "Invert" ).toString() == "True" );
193 if ( allPass ) promptDecision = false; // standard Gaudi::Sequencer behavior on all pass is to execute everything
194 isSequential = ( algo->hasProperty( "Sequential" ) && ( algo->getProperty( "Sequential" ).toString() == "True" ) );
195 } else if ( isAthSequencer ) {
196 modeOr = ( algo->getProperty( "ModeOR" ).toString() == "True" );
197 allPass = ( algo->getProperty( "IgnoreFilterPassed" ).toString() == "True" );
198 promptDecision = ( algo->getProperty( "StopOverride" ).toString() == "False" );
199 isSequential = ( algo->hasProperty( "Sequential" ) && ( algo->getProperty( "Sequential" ).toString() == "True" ) );
200 }
201 sc = m_PRGraph.addDecisionHubNode( algo, parentName, Concurrent{ !isSequential }, PromptDecision{ promptDecision },
202 ModeOr{ modeOr }, AllPass{ allPass }, Inverted{ isInverted } );
203 if ( sc.isFailure() ) {
204 error() << "Failed to add DecisionHub " << algo->name() << " to graph of precedence rules" << endmsg;
205 return sc;
206 }
207
208 for ( auto subalgo : *subAlgorithms ) {
209 sc = assembleCFRules( subalgo, algo->name(), recursionDepth );
210 if ( sc.isFailure() ) {
211 error() << "Algorithm " << subalgo->name() << " could not be flattened" << endmsg;
212 return sc;
213 }
214 }
215 return sc;
216}
MsgStream & endmsg(MsgStream &s)
MsgStream Modifier: endmsg. Calls the output method of the MsgStream.
Definition MsgStream.h:198
#define ON_DEBUG
MsgStream & error() const
shortcut for the method msgStream(MSG::ERROR)
MsgStream & debug() const
shortcut for the method msgStream(MSG::DEBUG)
const std::string & name() const override
The identifying name of the algorithm object.
bool isSequence() const override
Are we a Sequence?
Definition Algorithm.h:195
concurrency::PrecedenceRulesGraph m_PRGraph
Graph of precedence rules.
StatusCode assembleCFRules(Gaudi::Algorithm *, const std::string &, unsigned int recursionDepth=0)
StatusCode getProperty(Gaudi::Details::PropertyBase *p) const override
get the property
bool hasProperty(std::string_view name) const override
Return true if we have a property with the given name.
bool isFailure() const
Definition StatusCode.h:129
constexpr static const auto SUCCESS
Definition StatusCode.h:99
constexpr static const auto FAILURE
Definition StatusCode.h:100
std::string toString(const TYPE &obj)
the generic implementation of the type conversion to the string
Definition ToStream.h:326
Gaudi::tagged_bool< class AllPass_tag > AllPass
Gaudi::tagged_bool< class ModeOr_tag > ModeOr
Gaudi::tagged_bool< class PromptDecision_tag > PromptDecision
Gaudi::tagged_bool< class Inverted_tag > Inverted

◆ CFRulesResolved()

bool PrecedenceSvc::CFRulesResolved ( EventSlot & slot) const
override

Check if the root CF decision is resolved.

Definition at line 288 of file PrecedenceSvc.cpp.

288 {
289 return ( -1 != slot.controlFlowState[m_PRGraph.getHeadNode()->getNodeIndex()] ? true : false );
290}
std::vector< int > controlFlowState
State of the control flow.
Definition EventSlot.h:86

◆ dumpControlFlow()

void PrecedenceSvc::dumpControlFlow ( ) const
override

Dump precedence rules.

Definition at line 293 of file PrecedenceSvc.cpp.

293 {
294
295 info() << std::endl << "==================== Control Flow Configuration ==================" << std::endl << std::endl;
296 info() << m_PRGraph.dumpControlFlow() << endmsg;
297}
MsgStream & info() const
shortcut for the method msgStream(MSG::INFO)

◆ dumpDataFlow()

void PrecedenceSvc::dumpDataFlow ( ) const
override

Definition at line 299 of file PrecedenceSvc.cpp.

299 {
300 info() << std::endl << "===================== Data Flow Configuration ====================" << std::endl;
301 info() << m_PRGraph.dumpDataFlow() << endmsg;
302}

◆ dumpPrecedenceRules()

void PrecedenceSvc::dumpPrecedenceRules ( const EventSlot & slot)
override

Dump precedence rules (available only in DEBUG mode, and must be enabled with the corresponding service property)

Definition at line 313 of file PrecedenceSvc.cpp.

313 {
314
315 if ( !m_dumpPrecRules ) {
316 warning() << "To trace temporal and topological aspects of execution flow, "
317 << "set DumpPrecedenceRules property to True " << endmsg;
318 return;
319 }
320
321 ON_DEBUG debug() << "Dumping temporal precedence rules" << endmsg;
322
323 std::string fileName;
324 if ( m_dumpPrecRulesFile.empty() ) {
325 const auto& eventID = slot.eventContext->eventID();
326 fileName = "rules_evt-" + std::to_string( eventID.event_number() ) + "_slot-" +
327 std::to_string( slot.eventContext->slot() ) + "_run-" + std::to_string( eventID.run_number() ) +
328 ".graphml";
329 } else {
330 fileName = m_dumpPrecRulesFile;
331 }
332
333 boost::filesystem::path pth{ m_dumpDirName };
334 pth.append( fileName );
335
336 m_PRGraph.dumpPrecRules( pth, slot );
337}
MsgStream & warning() const
shortcut for the method msgStream(MSG::WARNING)
const EventIDBase & eventID() const
ContextID_t slot() const
Gaudi::Property< bool > m_dumpPrecRules
Gaudi::Property< std::string > m_dumpPrecRulesFile
boost::filesystem::path m_dumpDirName
Precedence analysis facilities.
std::unique_ptr< EventContext > eventContext
Cache for the eventContext.
Definition EventSlot.h:82

◆ dumpPrecedenceTrace()

void PrecedenceSvc::dumpPrecedenceTrace ( const EventSlot & slot)
override

Dump precedence trace (available only in DEBUG mode, and must be enabled with the corresponding service property)

Definition at line 340 of file PrecedenceSvc.cpp.

340 {
341
342 if ( !m_dumpPrecTrace ) {
343 warning() << "To trace task precedence patterns, set DumpPrecedenceTrace "
344 << "property to True " << endmsg;
345 return;
346 }
347
348 ON_DEBUG debug() << "Dumping temporal precedence trace" << endmsg;
349
350 std::string fileName;
351 if ( m_dumpPrecTraceFile.empty() ) {
352 const auto& eventID = slot.eventContext->eventID();
353 fileName = "trace_evt-" + std::to_string( eventID.event_number() ) + "_slot-" +
354 std::to_string( slot.eventContext->slot() ) + "_run-" + std::to_string( eventID.run_number() ) +
355 ".graphml";
356 } else {
357 fileName = m_dumpPrecTraceFile;
358 }
359
360 boost::filesystem::path pth{ m_dumpDirName };
361 pth.append( fileName );
362
363 m_PRGraph.dumpPrecTrace( pth, slot );
364}
Gaudi::Property< bool > m_dumpPrecTrace
Gaudi::Property< std::string > m_dumpPrecTraceFile

◆ finalize()

StatusCode PrecedenceSvc::finalize ( )
override

Finalize.

Definition at line 369 of file PrecedenceSvc.cpp.

369{ return Service::finalize(); }
StatusCode finalize() override
Definition Service.cpp:223

◆ getPriority()

uint PrecedenceSvc::getPriority ( const std::string & name) const
inlineoverride

Get priority of an algorithm.

Definition at line 52 of file PrecedenceSvc.h.

52 {
53 return (int)m_PRGraph.getAlgorithmNode( name )->getRank();
54 }

◆ getRules()

const concurrency::PrecedenceRulesGraph * PrecedenceSvc::getRules ( ) const
inline

Precedence rules accessor.

Definition at line 74 of file PrecedenceSvc.h.

74{ return &m_PRGraph; }

◆ initialize()

StatusCode PrecedenceSvc::initialize ( )
override

Initialize.

Definition at line 31 of file PrecedenceSvc.cpp.

31 {
32 using namespace concurrency;
33
34 auto sc = Service::initialize(); // parent class must be initialized first
35 if ( sc.isFailure() ) {
36 fatal() << "Base class failed to initialize" << endmsg;
37 return sc;
38 }
39
40 // prepare a directory to dump precedence analysis files to.
42 if ( !boost::filesystem::create_directory( m_dumpDirName ) ) {
43 error() << "Could not create directory " << m_dumpDirName
44 << "required "
45 "for task precedence tracing"
46 << endmsg;
48 }
49 }
50
51 if ( m_dumpPrecRules ) m_PRGraph.enableAnalysis();
52
53 // Get the algo resource pool
54 m_algResourcePool = serviceLocator()->service( "AlgResourcePool" );
55 if ( !m_algResourcePool.isValid() ) {
56 fatal() << "Error retrieving AlgoResourcePool" << endmsg;
58 }
59
60 info() << "Assembling CF and DF task precedence rules" << endmsg;
61
62 ON_DEBUG debug() << "Assembling CF precedence realm:" << endmsg;
63 // create the root CF node
64 m_PRGraph.addHeadNode( "RootDecisionHub", Concurrent{ true }, PromptDecision{ false }, ModeOr{ true },
65 AllPass{ true }, Inverted{ false } );
66 // assemble the CF rules
67 for ( const auto& ialgoPtr : m_algResourcePool->getTopAlgList() ) {
68 auto algorithm = dynamic_cast<Gaudi::Algorithm*>( ialgoPtr );
69 if ( !algorithm ) fatal() << "Conversion from IAlgorithm to Gaudi::Algorithm failed" << endmsg;
70 sc = assembleCFRules( algorithm, "RootDecisionHub" );
71 if ( sc.isFailure() ) {
72 fatal() << "Could not assemble the CF precedence realm" << endmsg;
73 return sc;
74 }
75 }
76
77 if ( m_ignoreDFRules ) {
78 warning() << "Ignoring DF precedence rules, disabling all associated features" << endmsg;
80 }
81
82 ON_DEBUG debug() << "Assembling DF precedence realm:" << endmsg;
83 sc = m_PRGraph.initialize();
84 if ( sc.isFailure() ) {
85 fatal() << "Could not assemble the DF precedence realm" << endmsg;
86 return sc;
87 }
88
89 // Rank algorithms if a prioritization rule is supplied
90 if ( m_mode == "PCE" ) {
91 auto ranker = concurrency::RankerByProductConsumption();
92 m_PRGraph.rankAlgorithms( ranker );
93 } else if ( m_mode == "COD" ) {
94 auto ranker = concurrency::RankerByCummulativeOutDegree();
95 m_PRGraph.rankAlgorithms( ranker );
96 } else if ( m_mode == "E" ) {
97 auto ranker = concurrency::RankerByEccentricity();
98 m_PRGraph.rankAlgorithms( ranker );
99 } else if ( m_mode == "T" ) {
100 auto ranker = concurrency::RankerByTiming();
101 m_PRGraph.rankAlgorithms( ranker );
102 } else if ( m_mode == "DRE" ) {
103 auto ranker = concurrency::RankerByDataRealmEccentricity();
104 m_PRGraph.rankAlgorithms( ranker );
105 } else if ( !m_mode.empty() ) {
106 error() << "Requested prioritization rule '" << m_mode << "' is unknown" << endmsg;
107 return StatusCode::FAILURE;
108 }
109
110 if ( m_showDataFlow ) { debug() << m_PRGraph.dumpDataFlow() << endmsg; }
111
112 if ( m_verifyRules ) {
113 ON_DEBUG debug() << "Verifying task precedence rules" << endmsg;
114
115 // Check if CF properties are self-consistent
116 auto propValidator = concurrency::NodePropertiesValidator();
117 m_PRGraph.accept( propValidator );
118 if ( !propValidator.passed() )
119 warning() << propValidator.reply() << endmsg;
120 else
121 ON_DEBUG debug() << propValidator.reply() << endmsg;
122
123 // Check for violations in the DF topology
124 auto prodValidator = concurrency::ProductionAmbiguityFinder();
125 m_PRGraph.accept( prodValidator );
126 if ( !prodValidator.passed() ) {
127 error() << prodValidator.reply() << endmsg;
128 return StatusCode::FAILURE;
129 } else {
130 ON_DEBUG debug() << prodValidator.reply() << endmsg;
131 }
132
133 auto sccFinder = concurrency::TarjanSCCFinder();
134 m_PRGraph.accept( sccFinder );
135 if ( !sccFinder.passed() ) {
136 error() << sccFinder.reply() << endmsg;
137 return StatusCode::FAILURE;
138 } else {
139 ON_DEBUG debug() << sccFinder.reply() << endmsg;
140 }
141 }
142
143 if ( sc.isSuccess() ) info() << "PrecedenceSvc initialized successfully" << endmsg;
144
145 return sc;
146}
MsgStream & fatal() const
shortcut for the method msgStream(MSG::FATAL)
virtual SmartIF< IService > & service(const Gaudi::Utils::TypeNameString &typeName, const bool createIf=true)=0
Returns a smart pointer to a service.
Gaudi::Property< bool > m_showDataFlow
Gaudi::Property< bool > m_ignoreDFRules
Scheduling strategy.
Gaudi::Property< bool > m_verifyRules
SmartIF< IAlgResourcePool > m_algResourcePool
A shortcut to the algorithm resource pool.
Gaudi::Property< std::string > m_mode
Scheduling strategy.
SmartIF< ISvcLocator > & serviceLocator() const override
Retrieve pointer to service locator.
Definition Service.cpp:336
StatusCode initialize() override
Definition Service.cpp:118

◆ isAsynchronous()

bool PrecedenceSvc::isAsynchronous ( const std::string & name) const
inlineoverride

Check if a task is asynchronous.

Definition at line 57 of file PrecedenceSvc.h.

57 {
58 return m_PRGraph.getAlgorithmNode( name )->isAsynchronous();
59 }

◆ iterate()

StatusCode PrecedenceSvc::iterate ( EventSlot & slot,
const Cause & cause )
override

Infer the precedence effect caused by an execution flow event.

Definition at line 219 of file PrecedenceSvc.cpp.

219 {
220
221 if ( Cause::source::Task == cause.m_source ) {
222 ON_VERBOSE verbose() << "Triggering bottom-up traversal at node '" << cause.m_sourceName << "'" << endmsg;
223 auto visitor = concurrency::DecisionUpdater( slot, cause, m_dumpPrecTrace );
224 m_PRGraph.getAlgorithmNode( cause.m_sourceName )->accept( visitor );
225 } else {
226 ON_VERBOSE verbose() << "Triggering top-down traversal at the root node" << endmsg;
227 auto visitor = concurrency::Supervisor( slot, cause, m_dumpPrecTrace );
228 m_PRGraph.getHeadNode()->accept( visitor );
229 }
230
231 if ( m_dumpPrecTrace )
232 if ( CFRulesResolved( slot.parentSlot ? *slot.parentSlot : slot ) )
233 dumpPrecedenceTrace( slot.parentSlot ? *slot.parentSlot : slot );
234
235 if ( m_dumpPrecRules )
236 if ( CFRulesResolved( slot.parentSlot ? *slot.parentSlot : slot ) )
237 dumpPrecedenceRules( slot.parentSlot ? *slot.parentSlot : slot );
238
239 return StatusCode::SUCCESS;
240}
#define ON_VERBOSE
MsgStream & verbose() const
shortcut for the method msgStream(MSG::VERBOSE)
void dumpPrecedenceRules(const EventSlot &) override
Dump precedence rules (available only in DEBUG mode, and must be enabled with the corresponding servi...
bool CFRulesResolved(EventSlot &) const override
Check if the root CF decision is resolved.
void dumpPrecedenceTrace(const EventSlot &) override
Dump precedence trace (available only in DEBUG mode, and must be enabled with the corresponding servi...
std::string m_sourceName
EventSlot * parentSlot
Pointer to parent slot (null for top level)
Definition EventSlot.h:95

◆ printState()

const std::string PrecedenceSvc::printState ( EventSlot & slot) const
override

Definition at line 305 of file PrecedenceSvc.cpp.

305 {
306
307 std::stringstream ss;
308 m_PRGraph.printState( ss, slot, 0 );
309 return ss.str();
310}

◆ simulate()

StatusCode PrecedenceSvc::simulate ( EventSlot & slot) const
override

Simulate execution flow.

Definition at line 243 of file PrecedenceSvc.cpp.

243 {
244
245 Cause cs = { Cause::source::Root, "RootDecisionHub" };
246 auto visitor = concurrency::RunSimulator( slot, cs );
247
248 auto& nodeDecisions = slot.controlFlowState;
249
250 std::vector<int> prevNodeDecisions;
251 int cntr = 0;
252 std::vector<int> counters;
253
254 while ( !CFRulesResolved( slot ) ) {
255 cntr += 1;
256 int prevAlgosNum = visitor.m_nodesSucceeded;
257 ON_DEBUG debug() << " Proceeding with iteration #" << cntr << endmsg;
258 prevNodeDecisions = slot.controlFlowState;
259 m_PRGraph.getHeadNode()->accept( visitor );
260 if ( prevNodeDecisions == nodeDecisions ) {
261 error() << " No progress on iteration " << cntr << " detected, node decisions are:" << nodeDecisions << endmsg;
262 return StatusCode::FAILURE;
263 }
264 info() << " Iteration #" << cntr << " finished, total algorithms executed: " << visitor.m_nodesSucceeded
265 << endmsg;
266
267 std::stringstream s;
268 s << cntr << ", " << ( visitor.m_nodesSucceeded - prevAlgosNum ) << "\n";
269
270 std::ofstream myfile;
271 myfile.open( "RunSimulation.csv", std::ios::app );
272 myfile << s.str();
273 myfile.close();
274
275 if ( visitor.m_nodesSucceeded != prevAlgosNum ) counters.push_back( visitor.m_nodesSucceeded );
276 }
277
278 info() << "Asymptotical intra-event speedup: " << (float)visitor.m_nodesSucceeded / (float)counters.size() << endmsg;
279
280 // Reset algorithm states and node decisions
281 slot.algsStates.reset();
282 nodeDecisions.assign( nodeDecisions.size(), -1 );
283
284 return StatusCode::SUCCESS;
285}
AlgsExecutionStates algsStates
Vector of algorithms states.
Definition EventSlot.h:84

Member Data Documentation

◆ m_algResourcePool

SmartIF<IAlgResourcePool> PrecedenceSvc::m_algResourcePool
private

A shortcut to the algorithm resource pool.

Definition at line 81 of file PrecedenceSvc.h.

◆ m_dumpDirName

boost::filesystem::path PrecedenceSvc::m_dumpDirName
private
Initial value:
{
boost::filesystem::unique_path( boost::filesystem::path( "precedence.analysis.%%%%" ) ) }

Precedence analysis facilities.

Definition at line 89 of file PrecedenceSvc.h.

89 {
90 boost::filesystem::unique_path( boost::filesystem::path( "precedence.analysis.%%%%" ) ) };

◆ m_dumpPrecRules

Gaudi::Property<bool> PrecedenceSvc::m_dumpPrecRules { this, "DumpPrecedenceRules", false, "Dump task precedence rules." }
private

Definition at line 98 of file PrecedenceSvc.h.

98{ this, "DumpPrecedenceRules", false, "Dump task precedence rules." };

◆ m_dumpPrecRulesFile

Gaudi::Property<std::string> PrecedenceSvc::m_dumpPrecRulesFile
private
Initial value:
{ this, "PrecedenceRulesFile", "",
"Override default name of the GRAPHML precedence rules file." }

Definition at line 99 of file PrecedenceSvc.h.

99 { this, "PrecedenceRulesFile", "",
100 "Override default name of the GRAPHML precedence rules file." };

◆ m_dumpPrecTrace

Gaudi::Property<bool> PrecedenceSvc::m_dumpPrecTrace
private
Initial value:
{ this, "DumpPrecedenceTrace", false,
"Dump task precedence traces for each event." }

Definition at line 91 of file PrecedenceSvc.h.

91 { this, "DumpPrecedenceTrace", false,
92 "Dump task precedence traces for each event." };

◆ m_dumpPrecTraceFile

Gaudi::Property<std::string> PrecedenceSvc::m_dumpPrecTraceFile
private
Initial value:
{
this, "PrecedenceTraceFile", "",
"Override default name of the GRAPHML trace file. NOTE: if more than "
"1 event is processed, the setting forces creation of a single file "
"with cumulative precedence trace." }

Definition at line 93 of file PrecedenceSvc.h.

93 {
94 this, "PrecedenceTraceFile", "",
95 "Override default name of the GRAPHML trace file. NOTE: if more than "
96 "1 event is processed, the setting forces creation of a single file "
97 "with cumulative precedence trace." };

◆ m_ignoreDFRules

Gaudi::Property<bool> PrecedenceSvc::m_ignoreDFRules { this, "IgnoreDFRules", false, "Ignore the data flow rules." }
private

Scheduling strategy.

Definition at line 87 of file PrecedenceSvc.h.

87{ this, "IgnoreDFRules", false, "Ignore the data flow rules." };

◆ m_mode

Gaudi::Property<std::string> PrecedenceSvc::m_mode { this, "TaskPriorityRule", "", "Task avalanche induction strategy." }
private

Scheduling strategy.

Definition at line 85 of file PrecedenceSvc.h.

85{ this, "TaskPriorityRule", "", "Task avalanche induction strategy." };

◆ m_PRGraph

concurrency::PrecedenceRulesGraph PrecedenceSvc::m_PRGraph { "PrecedenceRulesGraph", serviceLocator() }
private

Graph of precedence rules.

Definition at line 83 of file PrecedenceSvc.h.

83{ "PrecedenceRulesGraph", serviceLocator() };

◆ m_showDataFlow

Gaudi::Property<bool> PrecedenceSvc::m_showDataFlow
private
Initial value:
{ this, "ShowDataFlow", false,
"Show the configuration of DataFlow between Algorithms" }

Definition at line 103 of file PrecedenceSvc.h.

103 { this, "ShowDataFlow", false,
104 "Show the configuration of DataFlow between Algorithms" };

◆ m_verifyRules

Gaudi::Property<bool> PrecedenceSvc::m_verifyRules
private
Initial value:
{ this, "VerifyTaskPrecedenceRules", true,
"Verify task precedence rules for common errors." }

Definition at line 101 of file PrecedenceSvc.h.

101 { this, "VerifyTaskPrecedenceRules", true,
102 "Verify task precedence rules for common errors." };

The documentation for this class was generated from the following files: