The Gaudi Framework  master (37c0b60a)
ManySmallAlgs.py
Go to the documentation of this file.
1 #!/usr/bin/env gaudirun.py
2 
12 """
13 A totally synthetic test of scheduler performance, with a large number of CF nodes and algorithms, but each algorithm does no work.
14 
15 In the flat mode (nested=False) 1000 algorithms are added directly to the base CF node as a baseline measurement.
16 
17 In nested mode the algorithms are grouped into sets of under a parent CF node.
18 Those nodes are then given 2 different CF node parents (20 in total) which include a prescale algorithm.
19 
20 In sequential mode (sequence=True) the prescale algorithms will randomly deactivate CF nodes at a frequency given by filterPass
21 """
22 
23 from Configurables import AlgResourcePool, AvalancheSchedulerSvc, Gaudi__Sequencer
24 from Configurables import Gaudi__TestSuite__Prescaler as Prescaler
25 from Configurables import HiveSlimEventLoopMgr, HiveWhiteBoard
26 from Gaudi.Configuration import *
27 
28 # metaconfig -------------------------------------------------------------------
29 # It's confortable to collect the relevant parameters at the top of the optionfile
30 evtslots = 5
31 evtMax = 1000
32 cardinality = 10
33 threads = 5
34 nested = True
35 sequence = True
36 filterPass = 50.0
37 
38 # -------------------------------------------------------------------------------
39 
40 # The configuration of the whiteboard ------------------------------------------
41 # It is useful to call it EventDataSvc to replace the usual data service with
42 # the whiteboard transparently.
43 
44 whiteboard = HiveWhiteBoard("EventDataSvc", EventSlots=evtslots, OutputLevel=FATAL)
45 
46 # -------------------------------------------------------------------------------
47 
48 # Event Loop Manager -----------------------------------------------------------
49 # It's called slim since it has less functionalities overall than the good-old
50 # event loop manager. Here we just set its outputlevel to DEBUG.
51 
52 slimeventloopmgr = HiveSlimEventLoopMgr(
53  SchedulerName="AvalancheSchedulerSvc", OutputLevel=INFO
54 )
55 
56 # -------------------------------------------------------------------------------
57 
58 # ForwardScheduler -------------------------------------------------------------
59 # We just decide how many algorithms in flight we want to have and how many
60 # threads in the pool. The default value is -1, which is for TBB equivalent
61 # to take over the whole machine.
62 
63 scheduler = AvalancheSchedulerSvc(
64  ThreadPoolSize=threads,
65  ShowControlFlow=False,
66  ShowDataDependencies=False,
67  OutputLevel=INFO,
68 )
69 
70 # -------------------------------------------------------------------------------
71 
72 # Algo Resource Pool -----------------------------------------------------------
73 # Nothing special here, we just set the debug level.
74 AlgResourcePool(OutputLevel=FATAL)
75 
76 # -------------------------------------------------------------------------------
77 
78 # Flat structure
79 allAlgs = []
80 for i in range(1000):
81  alg = Prescaler("alg" + str(i))
82  alg.OutputLevel = FATAL
83  alg.Cardinality = cardinality
84  alg.PercentPass = 100.0
85  allAlgs.append(alg)
86 
87 baseSeq = Gaudi__Sequencer(
88  "baseSeq",
89  Members=allAlgs,
90  Sequential=sequence,
91  ModeOR=True,
92  ShortCircuit=False,
93  OutputLevel=FATAL,
94 )
95 
96 # Nested structure
97 allSeqs = []
98 allSeqSeqs = []
99 if nested:
100  for i in range(100):
101  seqAlgs = allAlgs[10 * i : 10 * (i + 1)]
102  seq = Gaudi__Sequencer(
103  "seq" + str(i),
104  Members=seqAlgs,
105  Sequential=sequence,
106  ModeOR=False,
107  ShortCircuit=True,
108  OutputLevel=FATAL,
109  )
110  allSeqs.append(seq)
111 
112  for i in range(10):
113  seqSeqs = allSeqs[10 * i : 10 * (i + 1)]
114 
115  filterAlg = Prescaler("filterAlg" + str(i))
116  filterAlg.OutputLevel = FATAL
117  filterAlg.Cardinality = cardinality
118  filterAlg.PercentPass = filterPass
119 
120  seq = Gaudi__Sequencer(
121  "seqSeq" + str(i),
122  Members=[filterAlg] + seqSeqs,
123  Sequential=sequence,
124  ModeOR=False,
125  ShortCircuit=True,
126  OutputLevel=FATAL,
127  )
128  allSeqSeqs.append(seq)
129 
130  for i in range(9):
131  seqSeqs = allSeqs[5 + (10 * i) : 15 + (10 * i)]
132 
133  filterAlg = Prescaler("filterAlg" + str(i + 10))
134  filterAlg.OutputLevel = FATAL
135  filterAlg.Cardinality = cardinality
136  filterAlg.PercentPass = filterPass
137 
138  seq = Gaudi__Sequencer(
139  "seqSeq" + str(i + 10),
140  Members=[filterAlg] + seqSeqs,
141  Sequential=sequence,
142  ModeOR=False,
143  ShortCircuit=True,
144  OutputLevel=FATAL,
145  )
146  allSeqSeqs.append(seq)
147 
148  baseSeq.Members = allSeqSeqs
149 
150 # Application Manager ----------------------------------------------------------
151 # We put everything together and change the type of message service
152 
154  EvtMax=evtMax,
155  EvtSel="NONE",
156  ExtSvc=[whiteboard],
157  EventLoop=slimeventloopmgr,
158  TopAlg=[baseSeq],
159  MessageSvcType="InertMessageSvc",
160 )
161 
162 # -------------------------------------------------------------------------------
Gaudi.Configuration
Definition: Configuration.py:1
ApplicationMgr
Definition: ApplicationMgr.h:57
Gaudi::Functional::details::zip::range
decltype(auto) range(Args &&... args)
Zips multiple containers together to form a single range.
Definition: details.h:97