23#define ON_DEBUG if ( msgLevel( MSG::DEBUG ) )
24#define ON_VERBOSE if ( msgLevel( MSG::VERBOSE ) )
35 if ( sc.isFailure() ) {
36 fatal() <<
"Base class failed to initialize" <<
endmsg;
42 if ( !boost::filesystem::create_directory(
m_dumpDirName ) ) {
45 "for task precedence tracing"
56 fatal() <<
"Error retrieving AlgoResourcePool" <<
endmsg;
60 info() <<
"Assembling CF and DF task precedence rules" <<
endmsg;
69 if ( !algorithm )
fatal() <<
"Conversion from IAlgorithm to Gaudi::Algorithm failed" <<
endmsg;
71 if ( sc.isFailure() ) {
72 fatal() <<
"Could not assemble the CF precedence realm" <<
endmsg;
78 warning() <<
"Ignoring DF precedence rules, disabling all associated features" <<
endmsg;
84 if ( sc.isFailure() ) {
85 fatal() <<
"Could not assemble the DF precedence realm" <<
endmsg;
93 }
else if (
m_mode ==
"COD" ) {
96 }
else if (
m_mode ==
"E" ) {
99 }
else if (
m_mode ==
"T" ) {
102 }
else if (
m_mode ==
"DRE" ) {
105 }
else if ( !
m_mode.empty() ) {
106 error() <<
"Requested prioritization rule '" <<
m_mode <<
"' is unknown" <<
endmsg;
118 if ( !propValidator.passed() )
126 if ( !prodValidator.passed() ) {
135 if ( !sccFinder.passed() ) {
143 if ( sc.isSuccess() )
info() <<
"PrecedenceSvc initialized successfully" <<
endmsg;
150 unsigned int recursionDepth ) {
157 bool isGaudiSequencer(
false );
158 bool isAthSequencer(
false );
161 ON_DEBUG debug() << std::string( recursionDepth,
' ' ) <<
"Algorithm '" << algo->
name() <<
"' discovered" <<
endmsg;
162 sc =
m_PRGraph.addAlgorithmNode( algo, parentName );
166 isGaudiSequencer =
true;
168 isAthSequencer =
true;
173 error() <<
"Algorithm " << algo->
name() <<
" has isSequence==true, but unable to dcast to Sequence" <<
endmsg;
177 auto subAlgorithms = seq->subAlgorithms();
180 ON_DEBUG debug() << std::string( recursionDepth,
' ' ) <<
"Decision hub '" << algo->
name() <<
"' discovered"
183 bool allPass =
false;
184 bool promptDecision =
false;
185 bool isSequential =
false;
186 bool isInverted =
false;
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;
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" ) );
204 error() <<
"Failed to add DecisionHub " << algo->
name() <<
" to graph of precedence rules" <<
endmsg;
208 for (
auto subalgo : *subAlgorithms ) {
211 error() <<
"Algorithm " << subalgo->name() <<
" could not be flattened" <<
endmsg;
228 m_PRGraph.getHeadNode()->accept( visitor );
250 std::vector<int> prevNodeDecisions;
252 std::vector<int> counters;
256 int prevAlgosNum = visitor.m_nodesSucceeded;
259 m_PRGraph.getHeadNode()->accept( visitor );
260 if ( prevNodeDecisions == nodeDecisions ) {
261 error() <<
" No progress on iteration " << cntr <<
" detected, node decisions are:" << nodeDecisions <<
endmsg;
264 info() <<
" Iteration #" << cntr <<
" finished, total algorithms executed: " << visitor.m_nodesSucceeded
268 s << cntr <<
", " << ( visitor.m_nodesSucceeded - prevAlgosNum ) <<
"\n";
270 std::ofstream myfile;
271 myfile.open(
"RunSimulation.csv", std::ios::app );
275 if ( visitor.m_nodesSucceeded != prevAlgosNum ) counters.push_back( visitor.m_nodesSucceeded );
278 info() <<
"Asymptotical intra-event speedup: " << (float)visitor.m_nodesSucceeded / (
float)counters.size() <<
endmsg;
282 nodeDecisions.assign( nodeDecisions.size(), -1 );
295 info() << std::endl <<
"==================== Control Flow Configuration ==================" << std::endl << std::endl;
300 info() << std::endl <<
"===================== Data Flow Configuration ====================" << std::endl;
307 std::stringstream ss;
316 warning() <<
"To trace temporal and topological aspects of execution flow, "
317 <<
"set DumpPrecedenceRules property to True " <<
endmsg;
323 std::string fileName;
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() ) +
334 pth.append( fileName );
343 warning() <<
"To trace task precedence patterns, set DumpPrecedenceTrace "
344 <<
"property to True " <<
endmsg;
350 std::string fileName;
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() ) +
361 pth.append( fileName );
MsgStream & endmsg(MsgStream &s)
MsgStream Modifier: endmsg. Calls the output method of the MsgStream.
#define DECLARE_COMPONENT(type)
MsgStream & error() const
shortcut for the method msgStream(MSG::ERROR)
MsgStream & verbose() const
shortcut for the method msgStream(MSG::VERBOSE)
MsgStream & warning() const
shortcut for the method msgStream(MSG::WARNING)
MsgStream & fatal() const
shortcut for the method msgStream(MSG::FATAL)
MsgStream & debug() const
shortcut for the method msgStream(MSG::DEBUG)
MsgStream & info() const
shortcut for the method msgStream(MSG::INFO)
const EventIDBase & eventID() const
Base class from which all concrete algorithm classes should be derived.
const std::string & name() const override
The identifying name of the algorithm object.
bool isSequence() const override
Are we a Sequence?
A service to resolve the task execution precedence.
PrecedenceSvc(const std::string &name, ISvcLocator *svcLoc)
Constructor.
void dumpControlFlow() const override
Dump precedence rules.
Gaudi::Property< bool > m_showDataFlow
concurrency::PrecedenceRulesGraph m_PRGraph
Graph of precedence rules.
Gaudi::Property< bool > m_dumpPrecTrace
Gaudi::Property< std::string > m_dumpPrecTraceFile
Gaudi::Property< bool > m_ignoreDFRules
Scheduling strategy.
Gaudi::Property< bool > m_dumpPrecRules
StatusCode iterate(EventSlot &, const Cause &) override
Infer the precedence effect caused by an execution flow event.
Gaudi::Property< std::string > m_dumpPrecRulesFile
const std::string printState(EventSlot &) const override
StatusCode finalize() override
Finalize.
Gaudi::Property< bool > m_verifyRules
StatusCode simulate(EventSlot &) const override
Simulate execution flow.
SmartIF< IAlgResourcePool > m_algResourcePool
A shortcut to the algorithm resource pool.
void dumpPrecedenceRules(const EventSlot &) override
Dump precedence rules (available only in DEBUG mode, and must be enabled with the corresponding servi...
Gaudi::Property< std::string > m_mode
Scheduling strategy.
bool CFRulesResolved(EventSlot &) const override
Check if the root CF decision is resolved.
boost::filesystem::path m_dumpDirName
Precedence analysis facilities.
StatusCode initialize() override
Initialize.
void dumpPrecedenceTrace(const EventSlot &) override
Dump precedence trace (available only in DEBUG mode, and must be enabled with the corresponding servi...
StatusCode assembleCFRules(Gaudi::Algorithm *, const std::string &, unsigned int recursionDepth=0)
void dumpDataFlow() const override
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.
SmartIF< ISvcLocator > & serviceLocator() const override
Retrieve pointer to service locator.
StatusCode finalize() override
StatusCode initialize() override
This class is used for returning status codes from appropriate routines.
constexpr static const auto SUCCESS
constexpr static const auto FAILURE
The visitor implements the Tarjan algorithm for searching strongly connected components in the data f...
Gaudi::tagged_bool< class AllPass_tag > AllPass
Gaudi::tagged_bool< class Concurrent_tag > Concurrent
Gaudi::tagged_bool< class ModeOr_tag > ModeOr
Gaudi::tagged_bool< class PromptDecision_tag > PromptDecision
Gaudi::tagged_bool< class Inverted_tag > Inverted
Class representing an event slot.
std::unique_ptr< EventContext > eventContext
Cache for the eventContext.
EventSlot * parentSlot
Pointer to parent slot (null for top level)
AlgsExecutionStates algsStates
Vector of algorithms states.
std::vector< int > controlFlowState
State of the control flow.