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