96def update_parquet(args):
97 matches = sorted(glob(f"db/logs/batch_{args.batchid}_*"))
98 if not matches:
99 raise FileNotFoundError(f"No batch directory found for batch ID {args.batchid}")
100 batch_dir = Path(matches[-1])
101
102 parquet_path = batch_dir / f"perf_results_{args.method}_{args.timestamp}_{args.batchid}.parquet"
103
104
105 row = {
106 "Timestamp": args.timestamp,
107 "BatchID": args.batchid,
108 "Method": args.method,
109 "Trials": args.trials,
110 "Cycles": args.cycles,
111 "Instructions": args.instr,
112 "IPC": args.ipc,
113 "Wall Time (s)": args.wall_time_s,
114 "Wall Time (ns)": args.wall_time_ns,
115 "Cache Loads": args.cache_loads,
116 "Cache Misses": args.cache_miss,
117 "Cache Miss %": safe_div_percent(args.cache_miss, args.cache_loads),
118 "L1 Loads": args.l1_loads,
119 "L1 Misses": args.l1_misses,
120 "L1 Miss %": safe_div_percent(args.l1_misses, args.l1_loads),
121 "L2 Loads": args.l2_loads,
122 "L2 Misses": args.l2_misses,
123 "L2 Miss %": safe_div_percent(args.l2_misses, args.l2_loads),
124 "L3 Loads": args.l3_loads,
125 "L3 Misses": args.l3_misses,
126 "L3 Miss %": safe_div_percent(args.l3_misses, args.l3_loads),
127 "TLB Loads": args.tlb_loads,
128 "TLB Misses": args.tlb_misses,
129 "TLB Miss %": safe_div_percent(args.tlb_misses, args.tlb_loads),
130 "Branch Instructions": args.branch_instr,
131 "Branch Misses": args.branch_misses,
132 "Branch Miss %": safe_div_percent(args.branch_misses, args.branch_instr),
133 "Misses/Trial": args.miss_per_trial,
134 "Cycles/Trial": args.cycles_per_trial,
135 }
136
137 row = {k: (None if v == "NA" else v) for k, v in row.items()}
138
139
140 df = pl.DataFrame([row])
141
142
143 df = df.with_columns([
144 pl.col("Timestamp").str.strptime(pl.Datetime("ms"), "%Y-%m-%d %H:%M:%S", strict=False)
145 ])
146
147 df = safe_vector_cast(df, SCHEMA)
148
149 df.write_parquet(parquet_path, compression="zstd")
150
151 print(f"[INFO] Parquet saved: {parquet_path}")
152