@@ -37,8 +37,9 @@ def read_data(filename):
37
37
with open (filename , "r" , encoding = "utf8" ) as fh :
38
38
re_thread = re .compile (r'^VLPROFTHREAD (\d+)$' )
39
39
re_record = re .compile (r'^VLPROFEXEC (\S+) (\d+)(.*)$' )
40
- re_payload_mtaskBegin = re .compile (r'id (\d+) predictStart (\d+) cpu (\d+)' )
41
- re_payload_mtaskEnd = re .compile (r'id (\d+) predictCost (\d+)' )
40
+ re_payload_mtaskBegin = re .compile (
41
+ r'id (\d+) predictStart (\d+) cpu (\d+) module\s*(\w+)?' )
42
+ re_payload_mtaskEnd = re .compile (r'predictCost (\d+)' )
42
43
re_payload_wait = re .compile (r'cpu (\d+)' )
43
44
44
45
re_arg1 = re .compile (r'VLPROF arg\s+(\S+)\+([0-9.]*)\s*' )
@@ -56,8 +57,8 @@ def read_data(filename):
56
57
57
58
ExecGraphStack = []
58
59
SectionStack = []
60
+ MtasksStack = []
59
61
ThreadScheduleWait = collections .defaultdict (list )
60
- mTaskThread = {}
61
62
62
63
for line in fh :
63
64
recordMatch = re_record .match (line )
@@ -74,33 +75,35 @@ def read_data(filename):
74
75
SectionStack .pop ()
75
76
Sections [thread ].append ((tick , tuple (SectionStack )))
76
77
elif kind == "MTASK_BEGIN" :
77
- mtask , predict_start , ecpu = re_payload_mtaskBegin .match (payload ).groups ()
78
+ mtask , predict_start , ecpu , module = re_payload_mtaskBegin .match (
79
+ payload ).groups ()
78
80
mtask = int (mtask )
79
81
predict_start = int (predict_start )
80
82
ecpu = int (ecpu )
81
- mTaskThread [mtask ] = thread
82
83
records = Threads [thread ]
83
- assert not records or records [- 1 ]['start' ] <= records [- 1 ]['end' ] <= tick
84
84
records .append ({
85
85
'start' : tick ,
86
86
'mtask' : mtask ,
87
87
'predict_start' : predict_start ,
88
+ 'module' : module ,
88
89
'cpu' : ecpu
89
90
})
90
- Mtasks [mtask ]['begin' ] = tick
91
- Mtasks [mtask ]['thread' ] = thread
92
- Mtasks [mtask ]['predict_start' ] = predict_start
91
+ Mtasks [(module , mtask )]['begin' ] = tick
92
+ Mtasks [(module , mtask )]['predict_start' ] = predict_start
93
+ Mtasks [(module , mtask )]['thread' ] = thread
94
+ MtasksStack .append ((module , mtask , records [- 1 ]))
93
95
elif kind == "MTASK_END" :
94
- mtask , predict_cost = re_payload_mtaskEnd .match (payload ).groups ()
96
+ predict_cost , = re_payload_mtaskEnd .match (payload ).groups ()
95
97
mtask = int (mtask )
98
+ module , mtask , record = MtasksStack .pop ()
96
99
predict_cost = int (predict_cost )
97
- begin = Mtasks [mtask ]['begin' ]
98
- record = Threads [mTaskThread [mtask ]][- 1 ]
100
+ begin = Mtasks [(module , mtask )]['begin' ]
99
101
record ['end' ] = tick
102
+ assert record and records [- 1 ]['start' ] <= records [- 1 ]['end' ] <= tick
100
103
record ['predict_cost' ] = predict_cost
101
- Mtasks [mtask ]['elapsed' ] += tick - begin
102
- Mtasks [mtask ]['predict_cost' ] = predict_cost
103
- Mtasks [mtask ]['end' ] = max (Mtasks [mtask ]['end' ], tick )
104
+ Mtasks [( module , mtask ) ]['elapsed' ] += tick - begin
105
+ Mtasks [( module , mtask ) ]['predict_cost' ] = predict_cost
106
+ Mtasks [( module , mtask ) ]['end' ] = max (Mtasks [( module , mtask ) ]['end' ], tick )
104
107
elif kind == "THREAD_SCHEDULE_WAIT_BEGIN" :
105
108
ecpu = int (re_payload_wait .match (payload ).groups ()[0 ])
106
109
ThreadScheduleWait [ecpu ].append (tick )
@@ -234,8 +237,8 @@ def report_mtasks():
234
237
long_mtask = None
235
238
predict_mtask_time = 0
236
239
predict_elapsed = 0
237
- for mtaskId in Mtasks :
238
- record = Mtasks [mtaskId ]
240
+ for ( module , mtaskId ) in Mtasks :
241
+ record = Mtasks [( module , mtaskId ) ]
239
242
predict_mtask_time += record ['predict_cost' ]
240
243
total_mtask_time += record ['elapsed' ]
241
244
thread_mtask_time [record ['thread' ]] += record ['elapsed' ]
@@ -244,6 +247,7 @@ def report_mtasks():
244
247
if record ['elapsed' ] > long_mtask_time :
245
248
long_mtask_time = record ['elapsed' ]
246
249
long_mtask = mtaskId
250
+ long_mtask_module = module
247
251
Global ['predict_last_end' ] = predict_elapsed
248
252
249
253
serialTime = ElapsedTime - ExecGraphTime
@@ -272,31 +276,51 @@ def report_mtasks():
272
276
max_p2e = - 1000000
273
277
max_mtask = None
274
278
275
- for mtask in sorted (Mtasks .keys ()):
276
- if Mtasks [mtask ]['elapsed' ] > 0 :
277
- if Mtasks [mtask ]['predict_cost' ] == 0 :
278
- Mtasks [mtask ]['predict_cost' ] = 1 # don't log(0) below
279
- p2e_ratio = math .log (Mtasks [mtask ]['predict_cost' ] / Mtasks [mtask ]['elapsed' ])
279
+ for (module , mtaskId ) in sorted (Mtasks .keys ()):
280
+ mtask = Mtasks [(module , mtaskId )]
281
+ if mtask ['elapsed' ] > 0 :
282
+ if mtask ['predict_cost' ] == 0 :
283
+ mtask ['predict_cost' ] = 1 # don't log(0) below
284
+ p2e_ratio = math .log (mtask ['predict_cost' ] / mtask ['elapsed' ])
280
285
p2e_ratios .append (p2e_ratio )
281
286
282
287
if p2e_ratio > max_p2e :
283
288
max_p2e = p2e_ratio
284
- max_mtask = mtask
289
+ max_mtask = mtaskId
290
+ max_module = module
285
291
if p2e_ratio < min_p2e :
286
292
min_p2e = p2e_ratio
287
- min_mtask = mtask
293
+ min_mtask = mtaskId
294
+ min_module = module
288
295
289
296
print ("\n MTask statistics:" )
290
- print (" Longest mtask id = {}" .format (long_mtask ))
297
+ if long_mtask_module :
298
+ print (" Longest mtask id = {} from module '{}'" .format (long_mtask , long_mtask_module ))
299
+ else :
300
+ print (" Longest mtask id = {}" .format (long_mtask ))
291
301
print (" Longest mtask time = {:.2%} of time elapsed in parallelized code" .format (
292
302
long_mtask_time / ExecGraphTime ))
293
303
print (" min log(p2e) = %0.3f" % min_p2e , end = "" )
294
304
295
- print (" from mtask %d (predict %d," % (min_mtask , Mtasks [min_mtask ]['predict_cost' ]), end = "" )
296
- print (" elapsed %d)" % Mtasks [min_mtask ]['elapsed' ])
305
+ if min_module :
306
+ print (" from module '%s' mtask %d (predict %d," %
307
+ (min_module , min_mtask , Mtasks [(min_module , min_mtask )]['predict_cost' ]),
308
+ end = "" )
309
+ else :
310
+ print (" from mtask %d (predict %d," %
311
+ (min_mtask , Mtasks [(min_module , min_mtask )]['predict_cost' ]),
312
+ end = "" )
313
+ print (" elapsed %d)" % Mtasks [(min_module , min_mtask )]['elapsed' ])
297
314
print (" max log(p2e) = %0.3f" % max_p2e , end = "" )
298
- print (" from mtask %d (predict %d," % (max_mtask , Mtasks [max_mtask ]['predict_cost' ]), end = "" )
299
- print (" elapsed %d)" % Mtasks [max_mtask ]['elapsed' ])
315
+ if max_module :
316
+ print (" from module '%s' mtask %d (predict %d," %
317
+ (max_module , max_mtask , Mtasks [(max_module , max_mtask )]['predict_cost' ]),
318
+ end = "" )
319
+ else :
320
+ print (" from mtask %d (predict %d," %
321
+ (max_mtask , Mtasks [(max_module , max_mtask )]['predict_cost' ]),
322
+ end = "" )
323
+ print (" elapsed %d)" % Mtasks [(max_module , max_mtask )]['elapsed' ])
300
324
301
325
stddev = statistics .pstdev (p2e_ratios )
302
326
mean = statistics .mean (p2e_ratios )
@@ -482,17 +506,17 @@ def write_vcd(filename):
482
506
# Compute scale so predicted graph is of same width as interval
483
507
measured_scaling = (end - start ) / Global ['predict_last_end' ]
484
508
# Predict mtasks that fill the time the execution occupied
485
- for mtask in Mtasks :
486
- thread = Mtasks [mtask ]['thread' ]
487
- pred_scaled_start = start + int (Mtasks [mtask ]['predict_start' ] * measured_scaling )
509
+ for (module , mtaskId ) in Mtasks :
510
+ mtask = Mtasks [(module , mtaskId )]
511
+ thread = mtask ['thread' ]
512
+ pred_scaled_start = start + int (mtask ['predict_start' ] * measured_scaling )
488
513
pred_scaled_end = start + int (
489
- (Mtasks [mtask ]['predict_start' ] + Mtasks [mtask ]['predict_cost' ]) *
490
- measured_scaling )
514
+ (mtask ['predict_start' ] + mtask ['predict_cost' ]) * measured_scaling )
491
515
if pred_scaled_start == pred_scaled_end :
492
516
continue
493
517
494
518
mcode = getCode (32 , 'predicted' , 't%d_mtask' % thread )
495
- addValue (mcode , pred_scaled_start , mtask )
519
+ addValue (mcode , pred_scaled_start , mtaskId )
496
520
addValue (mcode , pred_scaled_end , None )
497
521
498
522
parallelism ['predicted' ][pred_scaled_start ] += 1
0 commit comments