13 Reference optionfile which shows in a simple way how to take advantage of the
14 Gaudi components desicated to concurrency.
16 o HiveWhiteBoard: a convenient way to collect several TES (one per "processing
17 slot"), accessible in a thread safe way, keeps a catalogue of the products
18 written on each processing slot. The number of slots in the whiteboard
19 determines also the number of events processed simultaneously by the scheduler.
20 o AvalancheSchedulerSvc: state machine of the algorithms interfaced with the
21 TBB runtime. It is responsible for the submission of the algorithms. An
22 algorithm is marked ready for submission when its needed input is available.
23 It deals the asynchronous termination of algorithms with a "receiver" thread
24 and a thread safe queue.
25 o HiveSlimEventLoopMgr: an event factory. Pushes new events and pops finished
26 events to/from the scheduler. It does not manage algorithms/streams.
27 o AlgResourcePool: Service managing the creation of algorithms (through the
28 algorithm manager), including clones. It also manages the algorithms according
29 to the resources they need (parameter NeededResources - vector of strings - of
31 o InertMessageSvc: as the TBBMsgSvc, it manages the printing of the messages in
32 a multithreaded environment.
34 The CPUCruncher is not a component dealing with concurrency, but a useful
35 entity to test it. It's an algorithm that simply wastes cpu.
38 from Configurables
import (
40 AvalancheSchedulerSvc,
41 ContextEventCounterData,
42 ContextEventCounterPtr,
62 whiteboard = HiveWhiteBoard(
"EventDataSvc", EventSlots=evtslots)
70 slimeventloopmgr = HiveSlimEventLoopMgr(
71 SchedulerName=
"AvalancheSchedulerSvc", OutputLevel=DEBUG
81 scheduler = AvalancheSchedulerSvc(ThreadPoolSize=threads, OutputLevel=WARNING)
87 AlgResourcePool(OutputLevel=DEBUG)
89 CPUCrunchSvc(shortCalib=
True)
95 a1 = CPUCruncher(
"A1")
96 a1.outKeys = [
"/Event/a1"]
98 a2 = CPUCruncher(
"A2")
99 a2.inpKeys = [
"/Event/a1"]
100 a2.outKeys = [
"/Event/a2"]
102 a3 = CPUCruncher(
"A3")
103 a3.inpKeys = [
"/Event/a1"]
104 a3.outKeys = [
"/Event/a3"]
106 a4 = CPUCruncher(
"A4")
107 a4.inpKeys = [
"/Event/a2",
"/Event/a3"]
108 a4.outKeys = [
"/Event/a4"]
110 for algo
in [a1, a2, a3, a4]:
111 algo.Cardinality = cardinality
112 algo.OutputLevel = WARNING
113 algo.varRuntime = 0.3
114 algo.avgRuntime = 0.5
116 ctrp = ContextEventCounterPtr(
"CNT*", Cardinality=0, OutputLevel=INFO)
117 ctrd = ContextEventCounterData(
"CNT&", Cardinality=0, OutputLevel=INFO)
126 EventLoop=slimeventloopmgr,
127 TopAlg=[a1, a2, a3, a4, ctrp, ctrd],
128 MessageSvcType=
"InertMessageSvc",