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