Files
TheRock/rocm-libraries/projects/hipblaslt/utilities/QuickTune/tuning_analysis.py
T
derek.holloway 7502bf64a4
CodeQL / Analyze (actions) (push) Canceled after 0s
CodeQL / Analyze (python) (push) Canceled after 0s
pre-commit / pre-commit (push) Canceled after 0s
Multi-Arch CI / setup (push) Canceled after 0s
Publish build_manylinux_x86_64 images / publish_build_manylinux_x86_64 (push) Canceled after 0s
Setup (Multi-Arch) / setup (push) Canceled after 0s
Multi-Arch CI / Linux::${{ fromJSON(needs.setup.outputs.linux_build_config || '{}').build_variant_label || 'skip' }} (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish no_rocm_image_ubi10 image / publish_no_rocm_image_ubi10 (push) Canceled after 0s
Multi-Arch CI / Windows::${{ fromJSON(needs.setup.outputs.windows_build_config || '{}').build_variant_label || 'skip' }} (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Multi-Arch CI / Manifest Diff (push) Canceled after 0s
TheRock Manifest Diff Report / Generate Manifest Diff Report (push) Canceled after 0s
Multi-Arch CI / CI Summary (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04 (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04_ocl_rt images / publish_no_rocm_image_ubuntu24_04_ocl_rt (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_rocgdb (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04_rocgdb images / publish_no_rocm_image_ubuntu24_04_rocgdb (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_ocl_rt (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Unit Tests / Unit Tests :: ubuntu-24.04 (push) Canceled after 0s
Unit Tests / Unit Tests :: windows-2022 (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_media (push) Canceled after 0s
Unit Tests / Unit Tests Summary (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_openmpi (push) Canceled after 0s
Flatten subprojects into a single base monorepo
2026-09-02 16:34:47 -07:00

160 lines
6.2 KiB
Python

# Copyright (C) Advanced Micro Devices, Inc., or its affiliates.
# SPDX-License-Identifier: MIT
import argparse
import re
import csv
from collections import Counter
def parse_mnksol(line):
"""parsing -m, -n, -k, --solution_index"""
m = re.search(r"-m\s+(\d+)", line)
n = re.search(r"-n\s+(\d+)", line)
k = re.search(r"-k\s+(\d+)", line)
if m and n and k:
return (int(m.group(1)), int(n.group(1)), int(k.group(1)))
return None
def load_tuning_results(csv_file):
"""loading tuned_solution_idx info"""
mapping = {}
with open(csv_file, "r") as f:
reader = csv.DictReader(f)
for row in reader:
try:
m = int(row["m"])
n = int(row["n"])
k = int(row["k"])
except Exception:
continue
mapping[(m, n, k)] = {
"baseline_latency(us)": row["baseline_latency(us)"],
"baseline_solution_idx": row["baseline_solution_idx"],
"tuned_latency(us)": row["tuned_latency(us)"],
"tuned_solution_idx": row["tuned_solution_idx"],
"baseline/tuned": row["baseline/tuned"],
}
return mapping
def count_mnksol(input_file, tuning_csv, output_csv):
combos = []
with open(input_file, "r") as f:
for line in f:
combo = parse_mnksol(line)
if combo:
combos.append(combo)
total_combos = len(combos)
counter = Counter(combos)
tuning_map = load_tuning_results(tuning_csv)
# compute total latency for each kernel
total_baseline_all = 0.0
total_tuned_all = 0.0
per_kernel_times = {}
for combo, cnt in counter.items():
tuning_info = tuning_map.get(combo, None)
if tuning_info:
baseline_latency = float(tuning_info["baseline_latency(us)"])
tuned_latency = float(tuning_info["tuned_latency(us)"])
# Skip failed benchmarks - don't count in aggregation
if baseline_latency < 0 or tuned_latency < 0:
per_kernel_times[combo] = (0.0, 0.0)
continue
else:
# Skip missing data - don't count in aggregation
per_kernel_times[combo] = (0.0, 0.0)
continue
total_baseline = baseline_latency * cnt
total_tuned = tuned_latency * cnt
per_kernel_times[combo] = (total_baseline, total_tuned)
total_baseline_all += total_baseline
total_tuned_all += total_tuned
# sort by total baseline latency
sorted_combos = sorted(counter.keys(), key=lambda c: per_kernel_times[c][0], reverse=True)
# print statistic info
header = f"{'(-m, -n, -k)':>30} {'count':>6} {'baseline/tuned':>12} " \
f"{'total_baseline(us)':>18} {'total_tuned(us)':>16} " \
f"{'baseline%':>10} {'tuned%':>8}"
print(f"Total -m -n -k combos: {total_combos}\n")
print(header)
print("-" * len(header))
fieldnames = [
"m", "n", "k", "count",
"baseline_latency(us)", "baseline_solution_idx",
"tuned_latency(us)", "tuned_solution_idx", "baseline/tuned",
"total_baseline_time(us)", "total_tuned_time(us)",
"baseline_time_percent", "tuned_time_percent"
]
with open(output_csv, "w", newline="") as csvfile:
writer = csv.DictWriter(csvfile, fieldnames=fieldnames)
writer.writeheader()
for combo in sorted_combos:
cnt = counter[combo]
m, n, k = combo
tuning_info = tuning_map.get(combo, None)
baseline_tuned = tuning_info.get("baseline/tuned") if tuning_info else "no_match"
total_baseline, total_tuned = per_kernel_times[combo]
baseline_percent = total_baseline / total_baseline_all * 100 if total_baseline_all else 0
tuned_percent = total_tuned / total_tuned_all * 100 if total_tuned_all else 0
print(f"{str(combo[:3]):>30} {cnt:6d} {baseline_tuned:>12} "
f"{total_baseline:18.3f} {total_tuned:16.3f} "
f"{baseline_percent:10.2f}% {tuned_percent:8.2f}%")
row = {
"m": m, "n": n, "k": k, "count": cnt,
"baseline_latency(us)": tuning_info.get("baseline_latency(us)") if tuning_info else "no_match",
"baseline_solution_idx": tuning_info.get("baseline_solution_idx") if tuning_info else "no_match",
"tuned_latency(us)": tuning_info.get("tuned_latency(us)") if tuning_info else "no_match",
"tuned_solution_idx": tuning_info.get("tuned_solution_idx") if tuning_info else "no_match",
"baseline/tuned": baseline_tuned,
"total_baseline_time(us)": f"{total_baseline:.3f}",
"total_tuned_time(us)": f"{total_tuned:.3f}",
"baseline_time_percent": f"{baseline_percent:.2f}",
"tuned_time_percent": f"{tuned_percent:.2f}"
}
writer.writerow(row)
# print Gemm Speedup
speedup = total_baseline_all / total_tuned_all if total_tuned_all else 0
print("-" * len(header))
print(f"Gemm Speedup: {speedup:.2f}x")
print(f"Total baseline time: {total_baseline_all:.3f} us, Total tuned time: {total_tuned_all:.3f} us")
# last line in CSV, TOTAL
total_row = {
"m": "-", "n": "-", "k": "-", "count": "-",
"baseline_latency(us)": "-", "baseline_solution_idx": "-",
"tuned_latency(us)": "-", "tuned_solution_idx": "-",
"baseline/tuned": "-",
"total_baseline_time(us)": f"{total_baseline_all:.3f}",
"total_tuned_time(us)": f"{total_tuned_all:.3f}",
"baseline_time_percent": "100.00",
"tuned_time_percent": "100.00"
}
writer.writerow(total_row)
print(f"\nOutput CSV: {output_csv}")
if __name__ == "__main__":
parser = argparse.ArgumentParser(
description="calculate weighted improvement rate for each kernel"
)
parser.add_argument("--input_log", help="input hipblaslt log")
parser.add_argument("--input_csv", help="tuning result csv file")
parser.add_argument("--output_csv", help="tuning analysis csv file")
args = parser.parse_args()
count_mnksol(args.input_log, args.input_csv, args.output_csv)