Files
TheRock/rocm-libraries/projects/hipblaslt/utilities/QuickTune/utils.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

120 lines
4.8 KiB
Python

# Copyright (C) Advanced Micro Devices, Inc., or its affiliates.
# SPDX-License-Identifier: MIT
import os
import re
import csv
def parse_hipblaslt_output(output, line, tuning_info, mode):
outputs = output.split('\n')
print(output)
# Check if NO solution was found
if "NO solution found!" in output:
print(f"WARNING: No solution found for {mode} mode")
latency = -1
solution_idx = "NO_SOLUTION"
else:
try:
if mode == 'baseline':
latency = float(outputs[-5].split(',')[-1])
else:
latency = float(outputs[-5].split(',')[-2])
solution_idx = outputs[-4].split(':')[-1]
except (ValueError, IndexError) as e:
print(f"ERROR: Failed to parse output for {mode} mode: {e}")
latency = -1
solution_idx = "PARSE_ERROR"
if mode == 'baseline':
tuning_info[line].update({"baseline_latency(us)": latency})
tuning_info[line].update({"baseline_solution_idx": solution_idx})
# Set status if baseline failed
if latency == -1:
tuning_info[line].update({"status": "BASELINE_FAILED"})
elif mode == 'tuning':
tuning_info[line].update({"tuned_latency(us)": latency})
tuning_info[line].update({"tuned_solution_idx": solution_idx})
baseline_latency = tuning_info[line].get('baseline_latency(us)', -1)
if baseline_latency > 0 and latency > 0:
ratio = baseline_latency / latency * 100
ratio = round(ratio, 2)
tuning_info[line].update({"baseline/tuned": f"{ratio}%"})
tuning_info[line].update({"status": "SUCCESS"})
else:
tuning_info[line].update({"baseline/tuned": "N/A"})
# Set status based on what failed
if baseline_latency == -1 and latency == -1:
tuning_info[line].update({"status": "BOTH_FAILED"})
elif latency == -1:
tuning_info[line].update({"status": "TUNING_FAILED"})
# If only baseline failed, status is already "BASELINE_FAILED" from baseline mode
def export_csv(input_file, tuning_info, args):
fieldnames = ['m', 'n', 'k', 'lda', 'ldb', 'ldc', 'ldd', 'a_type', 'b_type', 'c_type', 'd_type', 'count', 'baseline_latency(us)', 'baseline_solution_idx', 'tuned_latency(us)', 'tuned_solution_idx', 'baseline/tuned', 'status']
tuning_info_list = []
success_count = 0
total_count = 0
with open(input_file, 'r') as f:
for line in f:
info = tuning_info[line]
status = info.get('status', 'UNKNOWN')
total_count += 1
if status == 'SUCCESS':
success_count += 1
tuning_info_list.append(info)
with open(args.output_path + '/tuning_result.csv', 'w') as file:
writer = csv.DictWriter(file, fieldnames=fieldnames)
writer.writeheader()
writer.writerows(tuning_info_list)
return success_count, total_count
def dynamic_iters(input_cmd, cold_iters, iters, tuning_info):
if cold_iters == -1 or iters == -1:
mnk = (float(tuning_info[input_cmd]['m']) * float(tuning_info[input_cmd]['n']) * float(tuning_info[input_cmd]['k'])) / (1024*1024)
if mnk <= 4000:
cold_iters, iters = 200, 100
elif mnk <= 80000:
cold_iters, iters = 50, 20
else:
cold_iters, iters = 10, 2
return cold_iters, iters
def convert_command(input_cmd, args, tuning_info, mode):
requested_solution = args.requested_solution
iters = args.iters
cold_iters = args.cold_iters
output_cmd = input_cmd.strip()
cold_iters, iters = dynamic_iters(input_cmd, cold_iters, iters, tuning_info)
output_cmd = re.sub(f'--algo_method\s+\S+', '', output_cmd)
output_cmd = re.sub(f'--solution_index\s+\S+', '', output_cmd)
output_cmd = re.sub(f'--requested_solution\s+\S+', '', output_cmd)
output_cmd = re.sub(f'--cold_iters\s+\S+', '', output_cmd)
output_cmd = re.sub(f'--iters\s+\S+', '', output_cmd)
output_cmd = re.sub(f'--rotating\s+\S+', '', output_cmd)
output_cmd = re.sub(f'--aux_type\s+\S+', '', output_cmd)
output_cmd = re.sub(f'\s{2,}', '', output_cmd)
output_cmd = output_cmd + f" --algo_method heuristic"
output_cmd = output_cmd + f" --cold_iters {cold_iters}"
output_cmd = output_cmd + f" --iters {iters}"
output_cmd = output_cmd + f" --rotating 512 --flush --print_kernel_info"
if mode == "baseline":
output_cmd = output_cmd + f" --requested_solution 1"
else:
output_cmd = output_cmd + f" --requested_solution {requested_solution}"
output_cmd = output_cmd + f" --skip_slow_solution_ratio 0.8"
if args.swizzleA == True:
output_cmd = re.sub("--transA\s+\S+", "--transA T", output_cmd)
output_cmd = output_cmd + f" --swizzleA"
return output_cmd