The Gaudi Framework  v30r0 (c919700c)
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 *svc)
 Constructor. More...
 
 ~PrecedenceSvc ()=default
 Destructor. More...
 
StatusCode initialize () override
 Initialize. More...
 
StatusCode finalize () override
 Finalize. More...
 
StatusCode iterate (EventSlot &, const Cause &) override
 Infer the precedence effect caused by an execution flow event. More...
 
StatusCode simulate (EventSlot &) const override
 Simulate execution flow. More...
 
bool CFRulesResolved (EventSlot &) const override
 Check if the root CF decision is resolved. More...
 
uint getPriority (const std::string &name) const override
 Get priority of an algorithm. More...
 
bool isBlocking (const std::string &name) const override
 Check if a task is CPU-blocking. More...
 
void dumpControlFlow () const override
 Dump precedence rules. More...
 
void dumpDataFlow () const override
 
const std::string printState (EventSlot &) const override
 
void dumpPrecedenceRules (EventSlot &) override
 Dump precedence rules (available only in DEBUG mode, and must be enabled with the corresponding service property) More...
 
void dumpPrecedenceTrace (EventSlot &) override
 Dump precedence trace (available only in DEBUG mode, and must be enabled with the corresponding service property) More...
 
const concurrency::PrecedenceRulesGraphgetRules () const
 Precedence rules accessor. More...
 
- Public Member Functions inherited from extends< Service, IPrecedenceSvc >
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::stringgetInterfaceNames () const override
 Implementation of IInterface::getInterfaceNames. More...
 
 ~extends () override=default
 Virtual destructor. More...
 
- Public Member Functions inherited from Service
const std::stringname () const override
 Retrieve name of the service. More...
 
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. More...
 
StatusCode sysStart () override
 Initialize Service. More...
 
StatusCode sysStop () override
 Initialize Service. More...
 
StatusCode sysFinalize () override
 Finalize Service. More...
 
StatusCode sysReinitialize () override
 Re-initialize the Service. More...
 
StatusCode sysRestart () override
 Re-initialize the Service. More...
 
 Service (std::string name, ISvcLocator *svcloc)
 Standard Constructor. More...
 
SmartIF< ISvcLocator > & serviceLocator () const override
 Retrieve pointer to service locator. More...
 
StatusCode setProperties ()
 Method for setting declared properties to the values specified for the job. More...
 
template<class T >
StatusCode service (const std::string &name, const T *&psvc, bool createIf=true) const
 Access a service by name, creating it if it doesn't already exist. More...
 
template<class T >
StatusCode service (const std::string &name, T *&psvc, bool createIf=true) const
 
template<typename IFace = IService>
SmartIF< IFace > service (const std::string &name, bool createIf=true) const
 
template<class T >
StatusCode service (const std::string &svcType, const std::string &svcName, T *&psvc) const
 Access a service by name and type, creating it if it doesn't already exist. More...
 
template<class T >
StatusCode declareTool (ToolHandle< T > &handle, std::string toolTypeAndName, bool createIf=true)
 Declare used tool. More...
 
SmartIF< IAuditorSvc > & auditorSvc () const
 The standard auditor service.May not be invoked before sysInitialize() has been invoked. More...
 
- Public Member Functions inherited from PropertyHolder< CommonMessaging< implements< IService, IProperty, IStateful > > >
 PropertyHolder ()=default
 
 ~PropertyHolder () override=default
 
Gaudi::Details::PropertyBasedeclareProperty (Gaudi::Details::PropertyBase &prop)
 Declare a property. More...
 
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. More...
 
Gaudi::Details::PropertyBasedeclareProperty (const std::string &name, TYPE &value, const std::string &doc="none") const
 
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. More...
 
Gaudi::Details::PropertyBasedeclareRemoteProperty (const std::string &name, IProperty *rsvc, const std::string &rname="")
 Declare a remote property. More...
 
StatusCode setProperty (const Gaudi::Details::PropertyBase &p) override
 set the property form another property More...
 
StatusCode setProperty (const std::string &s) override
 set the property from the formatted string More...
 
StatusCode setProperty (const std::string &n, const std::string &v) override
 set the property from name and the value More...
 
StatusCode setProperty (const std::string &name, const TYPE &value)
 set the property form the value More...
 
StatusCode getProperty (Gaudi::Details::PropertyBase *p) const override
 get the property More...
 
const Gaudi::Details::PropertyBasegetProperty (const std::string &name) const override
 get the property by name More...
 
StatusCode getProperty (const std::string &n, std::string &v) const override
 convert the property to the string More...
 
const std::vector< Gaudi::Details::PropertyBase * > & getProperties () const override
 get all properties More...
 
bool hasProperty (const std::string &name) const override
 Return true if we have a property with the given name. More...
 
 PropertyHolder (const PropertyHolder &)=delete
 
PropertyHolderoperator= (const PropertyHolder &)=delete
 
Gaudi::Details::PropertyBasedeclareProperty (const std::string &name, GaudiHandleBase &ref, const std::string &doc="none")
 Specializations for various GaudiHandles. More...
 
Gaudi::Details::PropertyBasedeclareProperty (const std::string &name, GaudiHandleArrayBase &ref, const std::string &doc="none")
 
Gaudi::Details::PropertyBasedeclareProperty (const std::string &name, DataObjectHandleBase &ref, const std::string &doc="none")
 
- Public Member Functions inherited from CommonMessagingBase
virtual ~CommonMessagingBase ()=default
 Virtual destructor. More...
 
const SmartIF< IMessageSvc > & msgSvc () const
 The standard message service. More...
 
MsgStreammsgStream () const
 Return an uninitialized MsgStream. More...
 
MsgStreammsgStream (const MSG::Level level) const
 Predefined configurable message stream for the efficient printouts. More...
 
MsgStreamalways () const
 shortcut for the method msgStream(MSG::ALWAYS) More...
 
MsgStreamfatal () const
 shortcut for the method msgStream(MSG::FATAL) More...
 
MsgStreamerr () const
 shortcut for the method msgStream(MSG::ERROR) More...
 
MsgStreamerror () const
 shortcut for the method msgStream(MSG::ERROR) More...
 
MsgStreamwarning () const
 shortcut for the method msgStream(MSG::WARNING) More...
 
MsgStreaminfo () const
 shortcut for the method msgStream(MSG::INFO) More...
 
MsgStreamdebug () const
 shortcut for the method msgStream(MSG::DEBUG) More...
 
MsgStreamverbose () const
 shortcut for the method msgStream(MSG::VERBOSE) More...
 
MsgStreammsg () const
 shortcut for the method msgStream(MSG::INFO) More...
 
MSG::Level msgLevel () const
 get the cached level (originally extracted from the embedded MsgStream) More...
 
MSG::Level outputLevel () const __attribute__((deprecated))
 Backward compatibility function for getting the output level. More...
 
bool msgLevel (MSG::Level lvl) const
 get the output level from the embedded MsgStream More...
 
- Public Member Functions inherited from extend_interfaces< Interfaces... >
 ~extend_interfaces () override=default
 Virtual destructor. More...
 

Private Member Functions

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

Private Attributes

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

Additional Inherited Members

- Public Types inherited from extends< Service, IPrecedenceSvc >
using base_class = extends
 Typedef to this class. More...
 
using extend_interfaces_base = extend_interfaces< Interfaces... >
 Typedef to the base of this class. More...
 
- Public Types inherited from Service
typedef Gaudi::PluginService::Factory< IService *, const std::string &, ISvcLocator * > Factory
 
- Public Types inherited from PropertyHolder< CommonMessaging< implements< IService, IProperty, IStateful > > >
using PropertyHolderImpl = PropertyHolder< CommonMessaging< implements< IService, IProperty, IStateful > > >
 Typedef used to refer to this class from derived classes, as in. More...
 
- Public Types inherited from CommonMessaging< implements< IService, IProperty, IStateful > >
using base_class = CommonMessaging
 
- Public Types inherited from extend_interfaces< Interfaces... >
using ext_iids = typename Gaudi::interface_list_cat< typename Interfaces::ext_iids... >::type
 take union of the ext_iids of all Interfaces... More...
 
- Protected Member Functions inherited from Service
 ~Service () override
 Standard Destructor. More...
 
int outputLevel () const
 get the Service's output level More...
 
- Protected Member Functions inherited from PropertyHolder< CommonMessaging< implements< IService, IProperty, IStateful > > >
Gaudi::Details::PropertyBaseproperty (const std::string &name) const
 
- Protected Member Functions inherited from CommonMessaging< implements< IService, IProperty, IStateful > >
MSG::Level setUpMessaging ()
 Set up local caches. More...
 
MSG::Level resetMessaging ()
 Reinitialize internal states. More...
 
void updateMsgStreamOutputLevel (int level)
 Update the output level of the cached MsgStream. More...
 
- Protected Attributes inherited from Service
Gaudi::StateMachine::State m_state = Gaudi::StateMachine::OFFLINE
 Service state. More...
 
Gaudi::StateMachine::State m_targetState = Gaudi::StateMachine::OFFLINE
 Service state. More...
 
Gaudi::Property< int > m_outputLevel {this, "OutputLevel", MSG::NIL, "output level"}
 
Gaudi::Property< bool > m_auditInit {this, "AuditServices", false, "[[deprecated]] unused"}
 
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()"}
 
SmartIF< IAuditorSvcm_pAuditorSvc
 Auditor Service. More...
 

Detailed Description

A service to resolve the task execution precedence.

Author
Illya Shapoval Aug 7, 2017

Definition at line 21 of file PrecedenceSvc.h.

Constructor & Destructor Documentation

PrecedenceSvc::PrecedenceSvc ( const std::string name,
ISvcLocator svc 
)

Constructor.

Definition at line 18 of file PrecedenceSvc.cpp.

18 : base_class( name, svcLoc ) {}
extends base_class
Typedef to this class.
Definition: extends.h:15
PrecedenceSvc::~PrecedenceSvc ( )
default

Destructor.

Member Function Documentation

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

Definition at line 110 of file PrecedenceSvc.cpp.

111 {
112  using namespace concurrency;
113 
115 
116  ++recursionDepth;
117 
118  bool isGaudiSequencer( false );
119  bool isAthSequencer( false );
120 
121  if ( algo->isSequence() ) {
122  if ( algo->hasProperty( "ShortCircuit" ) )
123  isGaudiSequencer = true;
124  else if ( algo->hasProperty( "StopOverride" ) )
125  isAthSequencer = true;
126  }
127 
128  std::vector<Algorithm*>* subAlgorithms = algo->subAlgorithms();
129  if ( // we only want to add basic algorithms -> have no subAlgs
130  // and exclude the case of empty sequencers
131  ( subAlgorithms->empty() && !( isGaudiSequencer || isAthSequencer ) ) ) {
132 
133  ON_DEBUG debug() << std::string( recursionDepth, ' ' ) << "Algorithm '" << algo->name() << "' discovered" << endmsg;
134  sc = m_PRGraph.addAlgorithmNode( algo, parentName, false, false );
135  return sc;
136  }
137 
138  // Recursively unroll
139  ON_DEBUG debug() << std::string( recursionDepth, ' ' ) << "Decision hub '" << algo->name() << "' discovered"
140  << endmsg;
141  bool modeOr = false;
142  bool allPass = false;
143  bool promptDecision = false;
144  bool isSequential = false;
145  bool isInverted = false;
146 
147  if ( isGaudiSequencer ) {
148  modeOr = ( algo->getProperty( "ModeOR" ).toString() == "True" );
149  allPass = ( algo->getProperty( "IgnoreFilterPassed" ).toString() == "True" );
150  promptDecision = ( algo->getProperty( "ShortCircuit" ).toString() == "True" );
151  isInverted = ( algo->getProperty( "Invert" ).toString() == "True" );
152  if ( allPass ) promptDecision = false; // standard GaudiSequencer behavior on all pass is to execute everything
153  isSequential = ( algo->hasProperty( "Sequential" ) && ( algo->getProperty( "Sequential" ).toString() == "True" ) );
154  } else if ( isAthSequencer ) {
155  modeOr = ( algo->getProperty( "ModeOR" ).toString() == "True" );
156  allPass = ( algo->getProperty( "IgnoreFilterPassed" ).toString() == "True" );
157  promptDecision = ( algo->getProperty( "StopOverride" ).toString() == "False" );
158  isSequential = ( algo->hasProperty( "Sequential" ) && ( algo->getProperty( "Sequential" ).toString() == "True" ) );
159  }
160  sc = m_PRGraph.addDecisionHubNode( algo, parentName, Concurrent{!isSequential}, PromptDecision{promptDecision},
161  ModeOr{modeOr}, AllPass{allPass}, Inverted{isInverted} );
162  if ( sc.isFailure() ) {
163  error() << "Failed to add DecisionHub " << algo->name() << " to graph of precedence rules" << endmsg;
164  return sc;
165  }
166 
167  for ( Algorithm* subalgo : *subAlgorithms ) {
168  sc = assembleCFRules( subalgo, algo->name(), recursionDepth );
169  if ( sc.isFailure() ) {
170  error() << "Algorithm " << subalgo->name() << " could not be flattened" << endmsg;
171  return sc;
172  }
173  }
174  return sc;
175 }
StatusCode getProperty(Gaudi::Details::PropertyBase *p) const override
get the property
concurrency::PrecedenceRulesGraph m_PRGraph
Graph of precedence rules.
Definition: PrecedenceSvc.h:77
T empty(T...args)
StatusCode addAlgorithmNode(Algorithm *daughterAlgo, const std::string &parentName, bool inverted, bool allPass)
Add algorithm node.
const std::string & name() const override
The identifying name of the algorithm object.
Definition: Algorithm.cpp:737
StatusCode assembleCFRules(Algorithm *, const std::string &, unsigned int recursionDepth=0)
bool hasProperty(const std::string &name) const override
Return true if we have a property with the given name.
#define ON_DEBUG
bool isFailure() const
Test for a status code of FAILURE.
Definition: StatusCode.h:61
Gaudi::tagged_bool< class ModeOr_tag > ModeOr
STL class.
MsgStream & error() const
shortcut for the method msgStream(MSG::ERROR)
Gaudi::tagged_bool< class Inverted_tag > Inverted
This class is used for returning status codes from appropriate routines.
Definition: StatusCode.h:26
Gaudi::tagged_bool< class Concurrent_tag > Concurrent
const std::vector< Algorithm * > * subAlgorithms() const
List of sub-algorithms. Returns a pointer to a vector of (sub) Algorithms.
Definition: Algorithm.cpp:782
Base class from which all concrete algorithm classes should be derived.
Definition: Algorithm.h:79
Gaudi::tagged_bool< class PromptDecision_tag > PromptDecision
MsgStream & debug() const
shortcut for the method msgStream(MSG::DEBUG)
bool isSequence() const override
Are we a Sequence?
Definition: Algorithm.h:220
StatusCode addDecisionHubNode(Algorithm *daughterAlgo, const std::string &parentName, concurrency::Concurrent, concurrency::PromptDecision, concurrency::ModeOr, concurrency::AllPass, concurrency::Inverted)
Add a node, which aggregates decisions of direct daughter nodes.
Gaudi::tagged_bool< class AllPass_tag > AllPass
MsgStream & endmsg(MsgStream &s)
MsgStream Modifier: endmsg. Calls the output method of the MsgStream.
Definition: MsgStream.h:209
bool PrecedenceSvc::CFRulesResolved ( EventSlot slot) const
override

Check if the root CF decision is resolved.

Definition at line 247 of file PrecedenceSvc.cpp.

248 {
249  return ( -1 != slot.controlFlowState[m_PRGraph.getHeadNode()->getNodeIndex()] ? true : false );
250 }
concurrency::PrecedenceRulesGraph m_PRGraph
Graph of precedence rules.
Definition: PrecedenceSvc.h:77
std::vector< int > controlFlowState
State of the control flow.
Definition: EventSlot.h:37
const unsigned int & getNodeIndex() const
Get node index.
DecisionNode * getHeadNode() const
Get head node.
void PrecedenceSvc::dumpControlFlow ( ) const
override

Dump precedence rules.

Definition at line 253 of file PrecedenceSvc.cpp.

254 {
255 
256  info() << std::endl << "==================== Control Flow Configuration ==================" << std::endl << std::endl;
258 }
concurrency::PrecedenceRulesGraph m_PRGraph
Graph of precedence rules.
Definition: PrecedenceSvc.h:77
MsgStream & info() const
shortcut for the method msgStream(MSG::INFO)
T endl(T...args)
std::string dumpControlFlow() const
Print out control flow of Algorithms and Sequences.
MsgStream & endmsg(MsgStream &s)
MsgStream Modifier: endmsg. Calls the output method of the MsgStream.
Definition: MsgStream.h:209
void PrecedenceSvc::dumpDataFlow ( ) const
override

Definition at line 260 of file PrecedenceSvc.cpp.

261 {
262  info() << std::endl << "===================== Data Flow Configuration ====================" << std::endl;
263  info() << m_PRGraph.dumpDataFlow() << endmsg;
264 }
concurrency::PrecedenceRulesGraph m_PRGraph
Graph of precedence rules.
Definition: PrecedenceSvc.h:77
MsgStream & info() const
shortcut for the method msgStream(MSG::INFO)
T endl(T...args)
std::string dumpDataFlow() const
Print out all data origins and destinations, as reflected in the EF graph.
MsgStream & endmsg(MsgStream &s)
MsgStream Modifier: endmsg. Calls the output method of the MsgStream.
Definition: MsgStream.h:209
void PrecedenceSvc::dumpPrecedenceRules ( EventSlot slot)
override

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

Definition at line 276 of file PrecedenceSvc.cpp.

277 {
278 
279  if ( !m_dumpPrecRules ) {
280  warning() << "No temporal and topological aspects of execution flow were traced. "
281  << "To get them traced, please set DumpPrecedenceRules "
282  << "property to True " << endmsg;
283  return;
284  }
285 
286  ON_DEBUG debug() << "Dumping temporal precedence rules" << endmsg;
287 
288  std::string fileName;
289  if ( m_dumpPrecRulesFile.empty() ) {
290  const auto& eventID = slot.eventContext->eventID();
291  fileName = "rules.evt-" + std::to_string( eventID.event_number() ) + "." + "run-" +
292  std::to_string( eventID.run_number() ) + ".graphml";
293  } else {
294  fileName = m_dumpPrecRulesFile;
295  }
296 
298  pth.append( fileName );
299 
300  m_PRGraph.dumpPrecRules( pth, slot );
301 }
concurrency::PrecedenceRulesGraph m_PRGraph
Graph of precedence rules.
Definition: PrecedenceSvc.h:77
EventContext * eventContext
Cache for the eventContext.
Definition: EventSlot.h:28
void dumpPrecRules(const boost::filesystem::path &, const EventSlot &slot)
dump to file the precedence rules
T to_string(T...args)
boost::filesystem::path m_dumpDirName
Precedence analysis facilities.
Definition: PrecedenceSvc.h:83
#define ON_DEBUG
STL class.
Gaudi::Property< std::string > m_dumpPrecRulesFile
Definition: PrecedenceSvc.h:96
MsgStream & warning() const
shortcut for the method msgStream(MSG::WARNING)
MsgStream & debug() const
shortcut for the method msgStream(MSG::DEBUG)
Gaudi::Property< bool > m_dumpPrecRules
Definition: PrecedenceSvc.h:93
const EventIDBase & eventID() const
Definition: EventContext.h:42
MsgStream & endmsg(MsgStream &s)
MsgStream Modifier: endmsg. Calls the output method of the MsgStream.
Definition: MsgStream.h:209
void PrecedenceSvc::dumpPrecedenceTrace ( EventSlot slot)
override

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

Definition at line 304 of file PrecedenceSvc.cpp.

305 {
306 
307  if ( !m_dumpPrecTrace ) {
308  warning() << "Task precedence was not traced. To get it traced, please set "
309  << "DumpPrecedenceTrace property to True " << endmsg;
310  return;
311  }
312 
313  ON_DEBUG debug() << "Dumping temporal precedence trace" << endmsg;
314 
315  std::string fileName;
316  if ( m_dumpPrecTraceFile.empty() ) {
317  const auto& eventID = slot.eventContext->eventID();
318  fileName = "trace.evt-" + std::to_string( eventID.event_number() ) + "." + "run-" +
319  std::to_string( eventID.run_number() ) + ".graphml";
320  } else {
321  fileName = m_dumpPrecTraceFile;
322  }
323 
325  pth.append( fileName );
326 
327  m_PRGraph.dumpPrecTrace( pth );
328 }
Gaudi::Property< bool > m_dumpPrecTrace
Definition: PrecedenceSvc.h:85
concurrency::PrecedenceRulesGraph m_PRGraph
Graph of precedence rules.
Definition: PrecedenceSvc.h:77
EventContext * eventContext
Cache for the eventContext.
Definition: EventSlot.h:28
T to_string(T...args)
boost::filesystem::path m_dumpDirName
Precedence analysis facilities.
Definition: PrecedenceSvc.h:83
#define ON_DEBUG
STL class.
void dumpPrecTrace(const boost::filesystem::path &)
dump to file the precedence trace
MsgStream & warning() const
shortcut for the method msgStream(MSG::WARNING)
MsgStream & debug() const
shortcut for the method msgStream(MSG::DEBUG)
Gaudi::Property< std::string > m_dumpPrecTraceFile
Definition: PrecedenceSvc.h:89
const EventIDBase & eventID() const
Definition: EventContext.h:42
MsgStream & endmsg(MsgStream &s)
MsgStream Modifier: endmsg. Calls the output method of the MsgStream.
Definition: MsgStream.h:209
StatusCode PrecedenceSvc::finalize ( )
override

Finalize.

Definition at line 333 of file PrecedenceSvc.cpp.

333 { return Service::finalize(); }
StatusCode finalize() override
Definition: Service.cpp:174
uint PrecedenceSvc::getPriority ( const std::string name) const
inlineoverride

Get priority of an algorithm.

Definition at line 47 of file PrecedenceSvc.h.

48  {
49  return (int)m_PRGraph.getAlgorithmNode( name )->getRank();
50  }
concurrency::PrecedenceRulesGraph m_PRGraph
Graph of precedence rules.
Definition: PrecedenceSvc.h:77
AlgorithmNode * getAlgorithmNode(const std::string &algoName) const
Get the AlgorithmNode from by algorithm name using graph index.
const float & getRank() const
Get Algorithm rank.
const concurrency::PrecedenceRulesGraph* PrecedenceSvc::getRules ( ) const
inline

Precedence rules accessor.

Definition at line 68 of file PrecedenceSvc.h.

68 { return &m_PRGraph; };
concurrency::PrecedenceRulesGraph m_PRGraph
Graph of precedence rules.
Definition: PrecedenceSvc.h:77
StatusCode PrecedenceSvc::initialize ( )
override

Initialize.

Definition at line 23 of file PrecedenceSvc.cpp.

24 {
25  using namespace concurrency;
26 
27  auto sc = Service::initialize(); // parent class must be initialized first
28  if ( sc.isFailure() ) {
29  fatal() << "Base class failed to initialize" << endmsg;
30  return sc;
31  }
32 
33  // prepare a directory to dump precedence analysis files to.
35  if ( !boost::filesystem::create_directory( m_dumpDirName ) ) {
36  error() << "Could not create directory " << m_dumpDirName << "required "
37  "for task precedence tracing"
38  << endmsg;
39  return StatusCode::FAILURE;
40  }
41  }
42 
44 
45  // Get the algo resource pool
46  m_algResourcePool = serviceLocator()->service( "AlgResourcePool" );
47  if ( !m_algResourcePool.isValid() ) {
48  fatal() << "Error retrieving AlgoResourcePool" << endmsg;
49  return StatusCode::FAILURE;
50  }
51 
52  info() << "Assembling CF and DF task precedence rules" << endmsg;
53 
54  ON_DEBUG debug() << "Assembling CF precedence realm:" << endmsg;
55  // create the root CF node
56  m_PRGraph.addHeadNode( "RootDecisionHub", Concurrent{true}, PromptDecision{false}, ModeOr{true}, AllPass{true},
57  Inverted{false} );
58  // assemble the CF rules
59  for ( const auto& ialgoPtr : m_algResourcePool->getTopAlgList() ) {
60  auto algorithm = dynamic_cast<Algorithm*>( ialgoPtr );
61  if ( !algorithm ) fatal() << "Conversion from IAlgorithm to Algorithm failed" << endmsg;
62  sc = assembleCFRules( algorithm, "RootDecisionHub" );
63  if ( sc.isFailure() ) {
64  fatal() << "Could not assemble the CF precedence realm" << endmsg;
65  return sc;
66  }
67  }
68 
69  if ( m_ignoreDFRules ) {
70  warning() << "Ignoring DF precedence rules, disabling all associated features" << endmsg;
71  return StatusCode::SUCCESS;
72  }
73 
74  ON_DEBUG debug() << "Assembling DF precedence realm:" << endmsg;
75  sc = m_PRGraph.initialize();
76  if ( sc.isFailure() ) {
77  fatal() << "Could not assemble the DF precedence realm" << endmsg;
78  return sc;
79  }
80 
81  // Rank algorithms if a prioritization rule is supplied
82  if ( m_mode == "PCE" ) {
84  m_PRGraph.rankAlgorithms( ranker );
85  } else if ( m_mode == "COD" ) {
87  m_PRGraph.rankAlgorithms( ranker );
88  } else if ( m_mode == "E" ) {
89  auto ranker = concurrency::RankerByEccentricity();
90  m_PRGraph.rankAlgorithms( ranker );
91  } else if ( m_mode == "T" ) {
92  auto ranker = concurrency::RankerByTiming();
93  m_PRGraph.rankAlgorithms( ranker );
94  } else if ( m_mode == "DRE" ) {
96  m_PRGraph.rankAlgorithms( ranker );
97  } else if ( !m_mode.empty() ) {
98  error() << "Requested prioritization rule '" << m_mode << "' is unknown" << endmsg;
99  return StatusCode::FAILURE;
100  }
101 
103 
104  if ( sc.isSuccess() ) info() << "PrecedenceSvc initialized successfully" << endmsg;
105 
106  return sc;
107 }
Gaudi::Property< bool > m_dumpPrecTrace
Definition: PrecedenceSvc.h:85
concurrency::PrecedenceRulesGraph m_PRGraph
Graph of precedence rules.
Definition: PrecedenceSvc.h:77
StatusCode initialize() override
Definition: Service.cpp:64
MsgStream & info() const
shortcut for the method msgStream(MSG::INFO)
StatusCode assembleCFRules(Algorithm *, const std::string &, unsigned int recursionDepth=0)
boost::filesystem::path m_dumpDirName
Precedence analysis facilities.
Definition: PrecedenceSvc.h:83
#define ON_DEBUG
void rankAlgorithms(IGraphVisitor &ranker) const
Rank Algorithm nodes by the number of data outputs.
Gaudi::tagged_bool< class ModeOr_tag > ModeOr
Gaudi::Property< bool > m_ignoreDFRules
Scheduling strategy.
Definition: PrecedenceSvc.h:81
StatusCode service(const Gaudi::Utils::TypeNameString &name, T *&svc, bool createIf=true)
Templated method to access a service by name.
Definition: ISvcLocator.h:79
StatusCode initialize()
Initialize graph.
MsgStream & error() const
shortcut for the method msgStream(MSG::ERROR)
SmartIF< IAlgResourcePool > m_algResourcePool
A shortcut to the algorithm resource pool.
Definition: PrecedenceSvc.h:75
virtual std::list< IAlgorithm * > getTopAlgList()=0
Get top list of algorithms.
MsgStream & warning() const
shortcut for the method msgStream(MSG::WARNING)
Gaudi::tagged_bool< class Inverted_tag > Inverted
void enableAnalysis()
BGL-based facilities.
std::string dumpDataFlow() const
Print out all data origins and destinations, as reflected in the EF graph.
Gaudi::Property< std::string > m_mode
Scheduling strategy.
Definition: PrecedenceSvc.h:79
Gaudi::tagged_bool< class Concurrent_tag > Concurrent
Base class from which all concrete algorithm classes should be derived.
Definition: Algorithm.h:79
Gaudi::tagged_bool< class PromptDecision_tag > PromptDecision
MsgStream & debug() const
shortcut for the method msgStream(MSG::DEBUG)
bool isValid() const
Allow for check if smart pointer is valid.
Definition: SmartIF.h:68
Gaudi::Property< bool > m_dumpPrecRules
Definition: PrecedenceSvc.h:93
Gaudi::tagged_bool< class AllPass_tag > AllPass
MsgStream & fatal() const
shortcut for the method msgStream(MSG::FATAL)
SmartIF< ISvcLocator > & serviceLocator() const override
Retrieve pointer to service locator.
Definition: Service.cpp:292
MsgStream & endmsg(MsgStream &s)
MsgStream Modifier: endmsg. Calls the output method of the MsgStream.
Definition: MsgStream.h:209
void addHeadNode(const std::string &headName, concurrency::Concurrent, concurrency::PromptDecision, concurrency::ModeOr, concurrency::AllPass, concurrency::Inverted)
Add a node, which has no parents.
bool PrecedenceSvc::isBlocking ( const std::string name) const
inlineoverride

Check if a task is CPU-blocking.

Definition at line 53 of file PrecedenceSvc.h.

53 { return m_PRGraph.getAlgorithmNode( name )->isIOBound(); }
concurrency::PrecedenceRulesGraph m_PRGraph
Graph of precedence rules.
Definition: PrecedenceSvc.h:77
AlgorithmNode * getAlgorithmNode(const std::string &algoName) const
Get the AlgorithmNode from by algorithm name using graph index.
bool isIOBound() const
Check if algorithm is I/O-bound.
StatusCode PrecedenceSvc::iterate ( EventSlot slot,
const Cause cause 
)
override

Infer the precedence effect caused by an execution flow event.

Definition at line 178 of file PrecedenceSvc.cpp.

179 {
180 
181  if ( LIKELY( Cause::source::Task == cause.m_source ) ) {
182  ON_VERBOSE verbose() << "Triggering bottom-up traversal at node '" << cause.m_sourceName << "'" << endmsg;
183  auto visitor = concurrency::DecisionUpdater( slot, cause, m_dumpPrecTrace );
184  m_PRGraph.getAlgorithmNode( cause.m_sourceName )->accept( visitor );
185  } else {
186  ON_VERBOSE verbose() << "Triggering top-down traversal at the root node" << endmsg;
187  auto visitor = concurrency::Supervisor( slot, cause, m_dumpPrecTrace );
188  m_PRGraph.getHeadNode()->accept( visitor );
189  }
190 
191  if ( UNLIKELY( m_dumpPrecTrace ) )
192  if ( UNLIKELY( CFRulesResolved( slot ) ) ) dumpPrecedenceTrace( slot );
193  if ( UNLIKELY( m_dumpPrecRules ) )
194  if ( UNLIKELY( CFRulesResolved( slot ) ) ) dumpPrecedenceRules( slot );
195 
196  return StatusCode::SUCCESS;
197 }
#define UNLIKELY(x)
Definition: Kernel.h:128
Gaudi::Property< bool > m_dumpPrecTrace
Definition: PrecedenceSvc.h:85
concurrency::PrecedenceRulesGraph m_PRGraph
Graph of precedence rules.
Definition: PrecedenceSvc.h:77
void dumpPrecedenceRules(EventSlot &) override
Dump precedence rules (available only in DEBUG mode, and must be enabled with the corresponding servi...
MsgStream & verbose() const
shortcut for the method msgStream(MSG::VERBOSE)
AlgorithmNode * getAlgorithmNode(const std::string &algoName) const
Get the AlgorithmNode from by algorithm name using graph index.
bool accept(IGraphVisitor &visitor) override
Visitor entry point.
#define ON_VERBOSE
void dumpPrecedenceTrace(EventSlot &) override
Dump precedence trace (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.
#define LIKELY(x)
Definition: Kernel.h:127
Gaudi::Property< bool > m_dumpPrecRules
Definition: PrecedenceSvc.h:93
bool accept(IGraphVisitor &visitor) override
Visitor entry point.
MsgStream & endmsg(MsgStream &s)
MsgStream Modifier: endmsg. Calls the output method of the MsgStream.
Definition: MsgStream.h:209
std::string m_sourceName
DecisionNode * getHeadNode() const
Get head node.
const std::string PrecedenceSvc::printState ( EventSlot slot) const
override

Definition at line 267 of file PrecedenceSvc.cpp.

268 {
269 
271  m_PRGraph.printState( ss, slot.algsStates, slot.controlFlowState, 0 );
272  return ss.str();
273 }
concurrency::PrecedenceRulesGraph m_PRGraph
Graph of precedence rules.
Definition: PrecedenceSvc.h:77
AlgsExecutionStates algsStates
Vector of algorithms states.
Definition: EventSlot.h:33
void printState(std::stringstream &output, AlgsExecutionStates &states, const std::vector< int > &node_decisions, const unsigned int &recursionLevel) const
Print a string representing the control flow state.
std::vector< int > controlFlowState
State of the control flow.
Definition: EventSlot.h:37
T str(T...args)
StatusCode PrecedenceSvc::simulate ( EventSlot slot) const
override

Simulate execution flow.

Definition at line 200 of file PrecedenceSvc.cpp.

201 {
202 
203  Cause cs = {Cause::source::Root, "RootDecisionHub"};
204  auto visitor = concurrency::RunSimulator( slot, cs );
205 
206  auto& nodeDecisions = slot.controlFlowState;
207 
208  std::vector<int> prevNodeDecisions;
209  int cntr = 0;
210  std::vector<int> counters;
211 
212  while ( !CFRulesResolved( slot ) ) {
213  cntr += 1;
214  int prevAlgosNum = visitor.m_nodesSucceeded;
215  debug() << " Proceeding with iteration #" << cntr << endmsg;
216  prevNodeDecisions = slot.controlFlowState;
217  m_PRGraph.getHeadNode()->accept( visitor );
218  if ( prevNodeDecisions == nodeDecisions ) {
219  error() << " No progress on iteration " << cntr << " detected, node decisions are:" << nodeDecisions << endmsg;
220  return StatusCode::FAILURE;
221  }
222  info() << " Iteration #" << cntr << " finished, total algorithms executed: " << visitor.m_nodesSucceeded
223  << endmsg;
224 
226  s << cntr << ", " << ( visitor.m_nodesSucceeded - prevAlgosNum ) << "\n";
227 
228  std::ofstream myfile;
229  myfile.open( "RunSimulation.csv", std::ios::app );
230  myfile << s.str();
231  myfile.close();
232 
233  if ( visitor.m_nodesSucceeded != prevAlgosNum ) counters.push_back( visitor.m_nodesSucceeded );
234  }
235 
236  info() << "Asymptotical concurrency speedup depth: " << (float)visitor.m_nodesSucceeded / (float)counters.size()
237  << endmsg;
238 
239  // Reset algorithm states and node decisions
240  slot.algsStates.reset();
241  nodeDecisions.assign( nodeDecisions.size(), -1 );
242 
243  return StatusCode::SUCCESS;
244 }
concurrency::PrecedenceRulesGraph m_PRGraph
Graph of precedence rules.
Definition: PrecedenceSvc.h:77
T open(T...args)
MsgStream & info() const
shortcut for the method msgStream(MSG::INFO)
AlgsExecutionStates algsStates
Vector of algorithms states.
Definition: EventSlot.h:33
bool accept(IGraphVisitor &visitor) override
Visitor entry point.
T push_back(T...args)
MsgStream & error() const
shortcut for the method msgStream(MSG::ERROR)
STL class.
std::vector< int > controlFlowState
State of the control flow.
Definition: EventSlot.h:37
T str(T...args)
bool CFRulesResolved(EventSlot &) const override
Check if the root CF decision is resolved.
T size(T...args)
MsgStream & debug() const
shortcut for the method msgStream(MSG::DEBUG)
string s
Definition: gaudirun.py:253
MsgStream & endmsg(MsgStream &s)
MsgStream Modifier: endmsg. Calls the output method of the MsgStream.
Definition: MsgStream.h:209
DecisionNode * getHeadNode() const
Get head node.

Member Data Documentation

SmartIF<IAlgResourcePool> PrecedenceSvc::m_algResourcePool
private

A shortcut to the algorithm resource pool.

Definition at line 75 of file PrecedenceSvc.h.

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

Precedence analysis facilities.

Definition at line 83 of file PrecedenceSvc.h.

Gaudi::Property<bool> PrecedenceSvc::m_dumpPrecRules
private
Initial value:
{this, "DumpPrecedenceRules", false, "Dump task precedence rules. The service "
"must be in DEBUG mode for this switch "
"to have effect."}

Definition at line 93 of file PrecedenceSvc.h.

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

Definition at line 96 of file PrecedenceSvc.h.

Gaudi::Property<bool> PrecedenceSvc::m_dumpPrecTrace
private
Initial value:
{this, "DumpPrecedenceTrace", false,
"Dump task precedence traces for each event."
"The service must be in DEBUG mode for this switch "
"to have effect."}

Definition at line 85 of file PrecedenceSvc.h.

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 89 of file PrecedenceSvc.h.

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

Scheduling strategy.

Definition at line 81 of file PrecedenceSvc.h.

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

Scheduling strategy.

Definition at line 79 of file PrecedenceSvc.h.

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

Graph of precedence rules.

Definition at line 77 of file PrecedenceSvc.h.


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