File size: 1,687 Bytes
58ba6df | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 | """Per (prev op, op) pair: count, mean op-to-op gap, mean kernel duration of op; last forward of scripts/prof.py.
usage: python scripts/prof_pairs.py <ops_perf.csv> [<ops_perf B.csv>] (B: printed side by side by pair key)"""
import csv, sys
from collections import defaultdict
def load(p):
rows = [r for r in csv.DictReader(open(p)) if r.get("DEVICE KERNEL DURATION [ns]")]
st = [i for i, r in enumerate(rows[:-1]) if r["OP CODE"].startswith("GenericOp")
and rows[i + 1]["OP CODE"].startswith("MinimalMatmul")]
last = rows[st[-1]:]
g = defaultdict(lambda: [0, 0.0, 0.0])
for i in range(1, len(last)):
k = (last[i - 1]["OP CODE"][:24], last[i]["OP CODE"][:24])
s = g[k]; s[0] += 1
s[1] += float(last[i]["OP TO OP LATENCY [ns]"] or 0) / 1e3
s[2] += float(last[i]["DEVICE KERNEL DURATION [ns]"]) / 1e3
kern = sum(float(r["DEVICE KERNEL DURATION [ns]"]) for r in last) / 1e3
gap = sum(float(r["OP TO OP LATENCY [ns]"] or 0) for r in last[1:]) / 1e3
return g, len(last), kern, gap
A = load(sys.argv[1]); B = load(sys.argv[2]) if len(sys.argv) > 2 else None
print(f"A: ops={A[1]} kernel={A[2]:.1f} us gaps={A[3]:.1f} us" + (f" B: ops={B[1]} kernel={B[2]:.1f} us gaps={B[3]:.1f} us" if B else ""))
keys = set(A[0]) | (set(B[0]) if B else set())
def tot(k, X):
s = X[0].get(k); return (s[1] + s[2]) if s else 0.0
for k in sorted(keys, key=lambda k: -max(tot(k, A), tot(k, B) if B else 0)):
line = f"{k[0]:24s} -> {k[1]:24s}"
for X in ([A, B] if B else [A]):
s = X[0].get(k)
line += f" | n={s[0]:3d} gap={s[1]/s[0]:6.2f} dur={s[2]/s[0]:6.2f}" if s else " | " + " " * 31
print(line)
|