Benchmarks/AMD/HBMBandwidth.py (94 lines of code) (raw):
import json
import os
import statistics
import time
import csv
from prettytable import PrettyTable
import subprocess
from Infra import tools
class HBMBandwidth:
def __init__(self, config_path: str, dir_path: str, machine: str):
self.name = "HBMBandwidth"
self.machine_name = machine
config = self.get_config(dir_path + '/' + config_path)
self.num_runs, self.interval = self.config_conversion(config)
self.dir_path = dir_path
self.container = None
self.buffer = []
def get_config(self, path: str):
file = open(path)
data = json.load(file)
file.close()
try:
return data[self.name]
except KeyError:
raise KeyError("no value found")
def parse_json(self, config):
return config["inputs"]["num_runs"], config["inputs"]["interval"]
def config_conversion(self, config) -> tuple[list, list, list]:
return self.parse_json(config)
def build(self):
path = "BabelStream"
isdir = os.path.isdir(path)
if not isdir:
clone_cmd = "git clone https://github.com/gitaumark/BabelStream " + self.dir_path + "/BabelStream"
results = subprocess.run(clone_cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
tools.write_log(tools.check_error(results))
results = subprocess.run('cd ' + self.dir_path + '/BabelStream && cmake -Bbuild -H. -DMODEL=hip -DRELEASE_FLAGS="-O3" -DCMAKE_CXX_COMPILER=hipcc && cmake --build build', shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
tools.write_log(tools.check_error(results))
def run(self):
print("Running HBM Bandwidth...")
runs_executed = 0
buffer = []
while runs_executed < self.num_runs:
run_cmd = "sudo " + self.dir_path + "/BabelStream/build/hip-stream"
results = subprocess.run(run_cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
tools.write_log(tools.check_error(results))
log = results.stdout.decode("utf-8").strip().split("\n")[13:18]
for i in range(len(log)):
temp = log[i].split()
log[i] = [temp[0], temp[1]]
buffer.append(log)
runs_executed += 1
time.sleep(int(self.interval))
self.buffer = buffer
self.save_results()
def process_stats(self, results):
mean = statistics.mean(results)/1000000
maximum = max(results)/1000000
minimum = min(results)/1000000
stdev = statistics.stdev(results)/1000
return [round(minimum, 2), round(maximum, 2), round(mean, 2)]
def save_results(self):
copy = ["Copy"]
mul = ["Mul"]
add = ["Add"]
triad = ["Triad"]
dot = ["Dot"]
for log in self.buffer:
copy.append(float(log[0][1]))
mul.append(float(log[1][1]))
add.append(float(log[2][1]))
triad.append(float(log[3][1]))
dot.append(float(log[4][1]))
copy[1:] = self.process_stats(copy[1:])
mul[1:] = self.process_stats(mul[1:])
add[1:] = self.process_stats(add[1:])
triad[1:] = self.process_stats(triad[1:])
dot[1:] = self.process_stats(dot[1:])
table1 = PrettyTable()
table1.field_names = ["Operation","Min (TB/s)", "Max (TB/s)", "Mean (TB/s)"]
table1.add_row(copy)
table1.add_row(mul)
table1.add_row(add)
table1.add_row(triad)
table1.add_row(dot)
print(table1)
with open(self.dir_path + '/Outputs/HBMBandwidth_Performance_results_' + self.machine_name +'.csv', 'w') as csvFile:
writer = csv.writer(csvFile, delimiter=',', quotechar='"', quoting=csv.QUOTE_MINIMAL)
writer.writerow(["Operation","Min (TB/s)", "Max (TB/s)", "Mean (TB/s)"])
writer.writerow(copy)
writer.writerow(mul)
writer.writerow(add)
writer.writerow(triad)
writer.writerow(dot)