"""ETH vs worker op-to-op gap attribution: per (previous op, op) pair, mean gap under each dispatch. usage: python scripts/prof_gaps.py (last forward of scripts/prof.py)""" import csv,sys,statistics from collections import defaultdict def load(p): rows=[r for r in csv.DictReader(open(p)) if r.get("DEVICE KERNEL DURATION [ns]")] starts=[i for i,r in enumerate(rows[:-1]) if r["OP CODE"].startswith("GenericOp") and rows[i+1]["OP CODE"].startswith("MinimalMatmul")] return rows[starts[-1]:] E=load(sys.argv[1]); W=load(sys.argv[2]) g=defaultdict(lambda:[0,0.,0.,0.,0.]) for i,(e,w) in enumerate(zip(E,W)): if i==0: continue k=(E[i-1]["OP CODE"][:22],e["OP CODE"][:22]) s=g[k]; s[0]+=1; s[1]+=float(e["OP TO OP LATENCY [ns]"] or 0)/1e3; s[2]+=float(w["OP TO OP LATENCY [ns]"] or 0)/1e3 s[3]+=float(E[i-1]["DEVICE KERNEL DURATION [ns]"])/1e3; s[4]+=float(e["CORE COUNT"]) for k,s in sorted(g.items(),key=lambda kv:-(kv[1][1]-kv[1][2])): print(f"{k[0]:22s} -> {k[1]:22s} n={s[0]:4d} ethgap={s[1]/s[0]:6.2f} wgap={s[2]/s[0]:6.2f} prevdur={s[3]/s[0]:6.1f} cores={s[4]/s[0]:.0f}")