The Gaudi Framework  v30r3 (a5ef0a68)
plotSpeedupsPyRoot.py
Go to the documentation of this file.
1 from ROOT import *
2 
3 '''
4 Script to parse all the logs and produce the speedup plot.
5 Usage:
6 plotSpeedupsPyRoot.py --> vanilla plot
7 plotSpeedupsPyRoot.py 1 --> HT scaled plot
8 The variable fname_template contains the template of the file names to be
9 opened and parsed and is FIXED for all the logs.
10 The word "seconds" is looked for in the log and then the total runtime of the
11 event loop is extracted. This allows to discard the time spent in calibration
12 and so on.
13 '''
14 
15 # Configuration ----------------------------------------------------------------
16 fname_template = "measurement_BrunelScenario_n100_eif%s_aif100_nthreads%s_c%s_dqFalse_v5.log"
17 # Number of events in flight
18 neif_l = [1, 2, 3, 5, 20, 30]
19 # Number of Threads
20 nts = [2, 3, 5, 10, 11, 12, 13, 15, 23]
21 # Clone Flag
22 cFlags = ["True", "False"]
23 
24 ScalarTime = 1640.87
25 
26 # Style
27 LegendDrawOpts = "lp"
28 LineColours = [kRed,
29  kBlue,
30  kGreen + 2,
31  kOrange,
32  kPink + 10,
33  kViolet + 10]
34 MarkerStyles = [kFullCircle,
35  kOpenCross,
36  kFullTriangleUp,
37  kOpenStar,
38  kFullCross,
39  kOpenCircle]
40 MarkerSize = 4
41 LineWidth = 6
42 LineStyle = 7
43 graph_counter = 0
44 
45 PhCores = 11
46 TotalCores = 24
47 HtCoreWeight = 0.4
48 
49 LabelsFont = 12
50 LabelsSize = .6
51 # --------------------
52 
53 
54 def scaleCores(n_threads):
55  effective_n_threads = n_threads
56  if effective_n_threads > PhCores:
57  ht_cores = n_threads - PhCores
58  effective_n_threads = PhCores + ht_cores * HtCoreWeight
59  return effective_n_threads
60 
61 # --------------------
62 
63 
64 def getText(x, y, text, scale, angle, colour, font):
65  lat = TLatex(x, y, "#scale[%s]{#color[%s]{#font[%s]{%s}}}" % (
66  scale, colour, font, text))
67  if angle != 0.:
68  lat.SetTextAngle(angle)
69  return lat
70 
71 # --------------------
72 
73 
74 def formatGraphs(graph, graphc):
75  global graph_counter
76  graphc.SetLineStyle(LineStyle)
77  graphs = (graph, graphc)
78  for g in graphs:
79  g.SetLineWidth(LineWidth)
80  g.SetMarkerSize(MarkerSize)
81  g.SetMarkerStyle(MarkerStyles[graph_counter])
82  g.SetLineColor(LineColours[graph_counter])
83  g.SetMarkerColor(LineColours[graph_counter])
84  graph_counter += 1
85 
86 # --------------------
87 
88 
89 def createFname(neif, nt, cFlag):
90  return fname_template % (neif, nt, cFlag)
91 
92 # --------------------
93 
94 
95 def xtractTiming(neif, nt, cFlag):
96  filename = createFname(neif, nt, cFlag)
97  ifile = open(filename, "r")
98  seconds = -1
99  for line in ifile:
100  if "seconds" in line:
101  line = line[:-1]
102  seconds = float(line.split(" ")[-1])
103  break
104  ifile.close()
105  if seconds == -1:
106  seconds = xtractTiming(neif, nts[nts.index(nt) - 1], cFlag)
107  return seconds
108 
109 # --------------------
110 
111 
112 import sys
113 scaleThreads = False
114 if len(sys.argv) > 1:
115  scaleThreads = True
116 
117 
118 # main loop: just printouts
119 for neif in neif_l:
120  print "Events in flight: %s" % neif
121  for tn in nts:
122  print "%s %s %s" % (tn, xtractTiming(
123  neif, tn, False), xtractTiming(neif, tn, True))
124 
125 
126 len_nt = len(nts) + 1
127 # Prepare ideal speedup graph
128 idealSpeedup = TGraph(2)
129 idealSpeedup.SetPoint(0, 1, 1)
130 idealSpeedup.SetPoint(1, TotalCores, TotalCores)
131 scaled_s = ""
132 if scaleThreads:
133  scaled_s = " (scaled for HT)"
134 idealSpeedup.SetTitle(
135  "GaudiHive Speedup (Brunel, 100 evts);Thread Pool Size%s;Speedup wrt Serial Case" % scaled_s)
136 idealSpeedup.SetLineWidth(4)
137 idealSpeedup.SetLineColor(kGray - 2)
138 idealSpeedup.SetLineStyle(2)
139 
140 # Main Loop: fill all graphs
141 neif_graphs = []
142 for neif in neif_l: # One graph per number of events in flight
143  graph = TGraph(len_nt)
144  graph.SetName("%s" % neif)
145  graph.SetPoint(0, 1, 1)
146 
147  graphc = TGraph(len_nt)
148  graphc.SetName("%s clone" % neif)
149  graphc.SetPoint(0, 1, 1)
150  counter = 1
151  for tn in nts:
152  scaled_tn = tn
153  if scaleThreads:
154  scaled_tn = scaleCores(tn)
155  time = xtractTiming(neif, tn, False)
156  graph.SetPoint(counter, scaled_tn, ScalarTime / time)
157  timec = xtractTiming(neif, tn, True)
158  graphc.SetPoint(counter, scaled_tn, ScalarTime / timec)
159  counter += 1
160  formatGraphs(graph, graphc)
161  neif_graphs.append([neif, graph, graphc])
162 
163 neif_graphs.reverse()
164 
165 # Now that all are complete, let's make the plot
166 canvas = TCanvas("Speedup", "Speedup", 2048, 1800)
167 canvas.cd()
168 canvas.SetGrid()
169 idealSpeedup.Draw("APL")
170 idealSpeedup.GetYaxis().SetRangeUser(0.1, TotalCores + 1) # only one 0
171 
172 # Line
173 line = TLine(11, 0, 11, 25)
174 line.SetLineColor(kRed)
175 line.SetLineWidth(4)
176 line.SetLineStyle(2)
177 line.Draw()
178 
179 for neif, graph, graphc in neif_graphs:
180  graph.Draw("SamePL")
181  graphc.Draw("SamePL")
182 
183 # Prepare Legend
184 legend = TLegend(.1, .45, .38, .9)
185 legend.SetFillColor(kWhite)
186 legend.SetHeader("# Simultaneous Evts")
187 for neif, graph, graphc in neif_graphs:
188  legend.AddEntry(graph, "%s" % neif, LegendDrawOpts)
189  legend.AddEntry(graphc, "%s (clone)" % neif, LegendDrawOpts)
190 legend.Draw()
191 
192 # Labels
193 ph_cores = getText(10.5, 15, "Physical Cores", LabelsSize, 90, 2, LabelsFont)
194 ph_cores.Draw()
195 ht_cores = getText(12., 15, "Hardware Threaded Regime",
196  LabelsSize, 90, 2, LabelsFont)
197 ht_cores.Draw()
198 is_text = getText(16, 16.5, "Ideal (linear) Speedup",
199  LabelsSize, 45, 918, LabelsFont)
200 is_text.Draw()
201 ht_weight = 0
202 if scaleThreads:
203  ht_weight = getText(
204  18.5, 8, "#splitline{Hardware threaded}{cores weight: %s}" % HtCoreWeight, LabelsSize, 0, 600, LabelsFont)
205  ht_weight.Draw()
206 
207 if scaleThreads:
208  scaled_s = "_HTScaled"
209 canvas.Print("GaudiHivePerfBrunelAllPoints%s.png" % scaled_s)
def createFname(neif, nt, cFlag)
def getText(x, y, text, scale, angle, colour, font)
def formatGraphs(graph, graphc)
def scaleCores(n_threads)
def xtractTiming(neif, nt, cFlag)