Monte Carlo Benchmarking Engine
High-performance SIMD Monte Carlo engine (AVX2/NEON) with custom memory allocators and perf logging.
 
Loading...
Searching...
No Matches
parse_perf_metrics.py
Go to the documentation of this file.
1# ===========================================
2# parse_perf_metrics.py
3# ===========================================
4
5
43
44
45from pipeline.utils import safe_div
46import polars as pl
47import sys
48
49trials = int(sys.argv[2])
50
51df = pl.read_csv(sys.argv[1], has_header=False)
52df.columns = ["value", "col1", "event", "timestamp", "cpu%", "derived", "label"]
53
54field_map = {
55 "cycles": "cycles:u",
56 "instr": "instructions:u",
57 "cache_loads": "cache-references:u",
58 "cache_miss": "cache-misses:u",
59 "l1_loads": "L1-dcache-loads:u",
60 "l1_misses": "L1-dcache-load-misses:u",
61 "l2_loads": "NA",
62 "l2_misses": "NA",
63 "l3_loads": "NA",
64 "l3_misses": "NA",
65 "tlb_loads": "dTLB-loads:u",
66 "tlb_misses": "dTLB-load-misses:u",
67 "branch_instr": "branch-instructions:u",
68 "branch_misses": "branch-misses:u",
69}
70
71event_to_key = {v: k for k, v in field_map.items() if v != "NA"}
72filtered = df.filter(pl.col("event").is_in(event_to_key.keys()))
73
74# Detect non-numeric values (e.g. "<not supported>", "N/A")
75to_clean = (
76 pl.when(pl.col("value").cast(pl.Float64, strict=False).is_null())
77 .then(pl.lit("NA"))
78 .otherwise(pl.col("value").cast(pl.Utf8)) # stringify numeric
79)
80
81filtered = filtered.with_columns([to_clean.alias("clean_value")])
82
83values = {key: "NA" for key in field_map}
84
85for row in filtered.iter_rows(named=True):
86 cli_key = event_to_key[row["event"]]
87 values[cli_key] = row["clean_value"]
88
89values["ipc"] = safe_div(values["instr"], values["cycles"])
90values["miss_per_trial"] = safe_div(values["cache_miss"], trials)
91values["cycles_per_trial"] = safe_div(values["cycles"], trials)
92
93# Ordered output for clean downstream piping
94ordered_keys = [
95 "cycles", "instr", "ipc",
96 "cache_loads", "cache_miss",
97 "l1_loads", "l1_misses",
98 "l2_loads", "l2_misses",
99 "l3_loads", "l3_misses",
100 "tlb_loads", "tlb_misses",
101 "branch_instr", "branch_misses",
102 "miss_per_trial", "cycles_per_trial"
103]
104
105# Debugging output
106def debug_print(values: dict):
107 for k in ordered_keys:
108 print(f"[DEBUG] {k} = {values.get(k)}", file=sys.stderr)
109
110
111print(" ".join([
112 f"{k.upper()}={values[k]}"
113 for k in ordered_keys
114]))