80 lines · python
1# SPDX-License-Identifier: GPL-2.02 3from __future__ import print_function4 5data = {}6times = []7threads = []8cpus = []9 10def get_key(time, event, cpu, thread):11 return "%d-%s-%d-%d" % (time, event, cpu, thread)12 13def store_key(time, cpu, thread):14 if (time not in times):15 times.append(time)16 17 if (cpu not in cpus):18 cpus.append(cpu)19 20 if (thread not in threads):21 threads.append(thread)22 23def store(time, event, cpu, thread, val, ena, run):24 #print("event %s cpu %d, thread %d, time %d, val %d, ena %d, run %d" %25 # (event, cpu, thread, time, val, ena, run))26 27 store_key(time, cpu, thread)28 key = get_key(time, event, cpu, thread)29 data[key] = [ val, ena, run]30 31def get(time, event, cpu, thread):32 key = get_key(time, event, cpu, thread)33 return data[key][0]34 35def stat__cycles_k(cpu, thread, time, val, ena, run):36 store(time, "cycles", cpu, thread, val, ena, run);37 38def stat__instructions_k(cpu, thread, time, val, ena, run):39 store(time, "instructions", cpu, thread, val, ena, run);40 41def stat__cycles_u(cpu, thread, time, val, ena, run):42 store(time, "cycles", cpu, thread, val, ena, run);43 44def stat__instructions_u(cpu, thread, time, val, ena, run):45 store(time, "instructions", cpu, thread, val, ena, run);46 47def stat__cycles(cpu, thread, time, val, ena, run):48 store(time, "cycles", cpu, thread, val, ena, run);49 50def stat__instructions(cpu, thread, time, val, ena, run):51 store(time, "instructions", cpu, thread, val, ena, run);52 53def stat__interval(time):54 for cpu in cpus:55 for thread in threads:56 cyc = get(time, "cycles", cpu, thread)57 ins = get(time, "instructions", cpu, thread)58 cpi = 059 60 if ins != 0:61 cpi = cyc/float(ins)62 63 print("%15f: cpu %d, thread %d -> cpi %f (%d/%d)" % (time/(float(1000000000)), cpu, thread, cpi, cyc, ins))64 65def trace_end():66 pass67# XXX trace_end callback could be used as an alternative place68# to compute same values as in the script above:69#70# for time in times:71# for cpu in cpus:72# for thread in threads:73# cyc = get(time, "cycles", cpu, thread)74# ins = get(time, "instructions", cpu, thread)75#76# if ins != 0:77# cpi = cyc/float(ins)78#79# print("time %.9f, cpu %d, thread %d -> cpi %f" % (time/(float(1000000000)), cpu, thread, cpi))80