105 lines
2.6 KiB
Python
105 lines
2.6 KiB
Python
import subprocess
|
|
import dataclasses
|
|
import json
|
|
import pandas as pd
|
|
|
|
from tqdm import tqdm
|
|
from dataclasses import dataclass
|
|
from threading import Thread
|
|
from multiprocessing.pool import ThreadPool
|
|
from pathlib import Path
|
|
from configs.pim_config import Configuration, Statistics
|
|
|
|
gem5 = Path("build/ARM/gem5.opt")
|
|
out_dir_base = Path("pim_out")
|
|
pim_simulation = Path("configs/pim_simulation.py")
|
|
|
|
|
|
@dataclass
|
|
class WorkItem:
|
|
configuration: Configuration
|
|
statistics: Statistics | None = None
|
|
|
|
def run_gem5_process(work_item: WorkItem):
|
|
serialized_configuration = json.dumps(
|
|
dataclasses.asdict(work_item.configuration)
|
|
)
|
|
|
|
out_dir = out_dir_base / work_item.configuration.name
|
|
|
|
out = subprocess.run(
|
|
[
|
|
gem5,
|
|
"-d" + out_dir.as_posix(),
|
|
pim_simulation,
|
|
serialized_configuration,
|
|
],
|
|
capture_output=True,
|
|
)
|
|
|
|
output = out.stdout.splitlines()[-1]
|
|
work_item.statistics = Statistics(**json.loads(output))
|
|
|
|
workload_base_directory = Path("kernels")
|
|
workload_sub_directory = Path("aarch64-unknown-none/release")
|
|
|
|
workloads = [
|
|
"vadd",
|
|
"vmul",
|
|
"haxpy",
|
|
"gemv",
|
|
"gemv_layers",
|
|
]
|
|
|
|
systems = [
|
|
"HBM",
|
|
"PIM-HBM",
|
|
]
|
|
|
|
configurations: list[Configuration] = []
|
|
|
|
for frequency in ["3GHz", "100GHz"]:
|
|
# for frequency in ["100GHz"]:
|
|
for level in ["X1", "X2", "X3", "X4"]:
|
|
# for level in ["X3"]:
|
|
for system in systems:
|
|
for workload in workloads:
|
|
executable = workload
|
|
|
|
if system == "HBM":
|
|
executable = f"classic_{workload}"
|
|
|
|
executable = (
|
|
workload_base_directory
|
|
/ level
|
|
/ workload_sub_directory
|
|
/ executable
|
|
)
|
|
|
|
configurations.append(
|
|
Configuration(
|
|
f"{workload}_{level}_{system}_{frequency}",
|
|
workload,
|
|
executable.as_posix(),
|
|
level,
|
|
system,
|
|
frequency,
|
|
)
|
|
)
|
|
|
|
work_items = [WorkItem(configuration) for configuration in configurations]
|
|
|
|
with ThreadPool() as pool:
|
|
for _ in tqdm(pool.imap_unordered(run_gem5_process, work_items), total=len(work_items)):
|
|
pass
|
|
|
|
|
|
results: list[dict] = []
|
|
|
|
for work_item in work_items:
|
|
result = dataclasses.asdict(work_item.configuration) | dataclasses.asdict(work_item.statistics)
|
|
results.append(result)
|
|
|
|
dataframe = pd.DataFrame(results)
|
|
dataframe.to_csv("pim_results.csv", index=False)
|