Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
24 commits
Select commit Hold shift + click to select a range
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
499 changes: 499 additions & 0 deletions benchmark-qgpu/benchmark_correctness.py

Large diffs are not rendered by default.

533 changes: 533 additions & 0 deletions benchmark-qgpu/benchmark_nsday.py

Large diffs are not rendered by default.

10 changes: 5 additions & 5 deletions benchmark-qgpu/benchmark_report.html.j2
Original file line number Diff line number Diff line change
Expand Up @@ -23,9 +23,9 @@
<small>Logs root: {{ logs_root }}</small>

<div class="chart">
<h2>Simulation performance (ns/day)</h2>
<h2>Simulation throughput (total ns/day)</h2>
<div id="nsday-chart"></div>
<div class="note">Simulated nanoseconds per wall-clock day.</div>
<div class="note">Total simulated nanoseconds per wall-clock day across all concurrent processes.</div>
</div>

<div class="chart">
Expand Down Expand Up @@ -209,8 +209,8 @@ function lineChart(containerId, cfg) {
});

lineChart("nsday-chart", {
xLabel: "Processes", yLabel: "ns/day", xs: payload.procs,
series: [{ label: "Performance (ns/day)", ys: payload.ns_per_day }]
xLabel: "Processes", yLabel: "total ns/day", xs: payload.procs,
series: [{ label: "Total throughput (ns/day)", ys: payload.ns_per_day }]
});


Expand All @@ -233,7 +233,7 @@ function lineChart(containerId, cfg) {
<th>GPU util mean (%)</th><th>GPU util peak (%)</th>
<th>VRAM util mean (%)</th><th>VRAM util peak (%)</th>
<th>Speedup (×)</th>
<th>ns/day</th>
<th>Total ns/day</th>
</tr>`;
table.appendChild(thead);

Expand Down
6 changes: 3 additions & 3 deletions benchmark-qgpu/benchmark_report.py
Original file line number Diff line number Diff line change
Expand Up @@ -85,6 +85,7 @@ def fget(k):
mem_means = [v["mem_util_mean"] for v in vals if math.isfinite(v["mem_util_mean"])]
mem_peaks = [v["mem_util_peak"] for v in vals if math.isfinite(v["mem_util_peak"])]
tmp_ns_per_day = [v["ns_per_day"] for v in vals if math.isfinite(v["ns_per_day"])]
total_ns_per_day = statistics.mean(tmp_ns_per_day) * p if tmp_ns_per_day else float("nan")


rc_bad = sum(1 for v in vals if v["rc"] != 0)
Expand All @@ -99,7 +100,7 @@ def fget(k):
gpu_util_peak.append(statistics.mean(util_peak) if util_peak else float("nan"))
util_mem_mean.append(statistics.mean(mem_means) if mem_means else float("nan"))
util_mem_peak.append(statistics.mean(mem_peaks) if mem_peaks else float("nan"))
ns_per_day.append(statistics.mean(tmp_ns_per_day) if tmp_ns_per_day else float("nan"))
ns_per_day.append(total_ns_per_day)


Tn = max(walls) if walls else float("nan")
Expand All @@ -126,7 +127,7 @@ def fget(k):
"vram_util_peak": statistics.mean(mem_peaks) if mem_peaks else float("nan"),
"Tn": Tn,
"speedup": speedup,
"ns_per_day": statistics.mean(tmp_ns_per_day) if tmp_ns_per_day else float("nan"),
"ns_per_day": total_ns_per_day,
})


Expand Down Expand Up @@ -156,4 +157,3 @@ def fget(k):
with open(out_html, "w", encoding="utf-8") as f:
f.write(html_out)
print(f"Report written to: {out_html}")

10 changes: 7 additions & 3 deletions benchmark-qgpu/benchmark_run.py
Original file line number Diff line number Diff line change
Expand Up @@ -350,7 +350,12 @@ def _get(d, dotted, default=None):
def run(args):
data_dir = os.path.expanduser(args.data_dir) # e.g., TEST/water
bin_path = os.path.expanduser(args.bin) # e.g., /path/to/qdyn
max_procs = int(args.max_processes)
if getattr(args, "concurrency", None):
concurrency = sorted(dict.fromkeys(int(value) for value in args.concurrency))
elif args.max_processes is not None:
concurrency = list(range(1, int(args.max_processes) + 1))
else:
raise ValueError("Pass --concurrency or --max_processes.")

if not os.path.isdir(data_dir):
raise FileNotFoundError(f"data_dir not found: {data_dir}")
Expand Down Expand Up @@ -386,7 +391,7 @@ def run(args):
os.makedirs(logs_dir, exist_ok=True)
work(1, logs_dir, f'"{bin_path}" "{data_dir}"', steps)

for process_num in range(1, max_procs + 1):
for process_num in concurrency:
print(f"Will run {process_num} processes in parallel:")
logs_dir = os.path.join(current_dir, f"benchmark_logs/{process_num:02d}_procs")
os.makedirs(logs_dir, exist_ok=True)
Expand All @@ -405,4 +410,3 @@ def run(args):
# generate report
out_html = os.path.join(current_dir, "benchmark_report.html")
make_html_report(logs_root, out_html)

Loading