Skip to content
Snippets Groups Projects
combine.py 3.04 KiB
Newer Older
#!/usr/bin/env python3

from __future__ import annotations

import statistics
import sys
from csv import DictReader, DictWriter
from dataclasses import asdict, dataclass, fields
from pathlib import Path

MAPPING: dict[str, str] = {
	"ca-c-clang": "clang",
	"ca-c-gcc": "gcc",
	"ca-cpp-clang": "clang++",
	"ca-cpp-gcc": "g++",
	"ca-fortran-gcc": "gfortran",
	"ca-fortran-llvm-flang": "flang-new",
	"ca-julia": "julia",
	"rodinia-srad-c-clang": "clang",
	"rodinia-srad-c-gcc": "gcc",
	"rodinia-srad-cpp-clang": "clang++",
	"rodinia-srad-cpp-gcc": "g++",
	"rodinia-srad-fortran-gcc": "gfortran",
	"rodinia-srad-fortran-llvm-flang": "flang-new",
	"rodinia-srad-julia": "julia",
}


@dataclass
class Input(object):
	thread: str
	region_idf: str
	file: str
	line: str
	function: str
	visits: str
	device_name: str
	energy: str
	time: str


@dataclass
class Result(object):
	name: str

	energy_min: float
	energy_avg: float
	energy_max: float
	energy_std: float
	energy_var: float

	time_min: float
	time_avg: float
	time_max: float
	time_std: float
	time_var: float

	memory_min: float
	memory_avg: float
	memory_max: float
	memory_std: float
	memory_var: float


def main(args: list[str]) -> int:
	path: Path = Path(args[0])
	programs: list[Path] = [x for x in path.glob("*") if x.is_dir()]

	with (path / "combined.csv").open("w") as f:
		combined: DictWriter = DictWriter(
			f, [x.name for x in fields(Result)], delimiter=" "
		)
		combined.writeheader()

		for program in sorted(programs):
			energy: list[float] = []
			time: list[float] = []
			memory: list[float] = []

			name: str = MAPPING[program.name]

			with (path / f"{name}.csv").open("w") as r:
				runs: DictWriter = DictWriter(
					r, ["run", "energy", "time", "memory"], delimiter=" "
				)
				runs.writeheader()

				for run in sorted(program.glob("*")):
					m: float = int((run / "memory_usage.txt").read_text()) / 1024
					memory.append(m)

					ema: Path = next(run.glob("output.EMA.*"))
					with ema.open() as f:
						reader: DictReader = DictReader(f)

						for line in reader:
							input: Input = Input(**line)

							if input.device_name != args[1]:
								continue

							e: float = int(input.energy) / 1000 / 1000 / 1000
							t: float = int(input.time) / 1000 / 1000

							runs.writerow(
								{"run": run.name, "energy": e, "time": t, "memory": m}
							)

							energy.append(e)
							time.append(t)

				result: Result = Result(
					name=MAPPING[program.name],
					energy_min=min(energy),
					energy_avg=statistics.mean(energy),
					energy_max=max(energy),
					energy_std=statistics.stdev(energy),
					energy_var=statistics.variance(energy),
					time_min=min(time),
					time_avg=statistics.mean(time),
					time_max=max(time),
					time_std=statistics.stdev(time),
					time_var=statistics.variance(time),
					memory_min=min(memory),
					memory_avg=statistics.mean(memory),
					memory_max=max(memory),
					memory_std=statistics.stdev(memory),
					memory_var=statistics.variance(memory),
				)

				combined.writerow(asdict(result))

	return 0


if __name__ == "__main__":
	sys.exit(main(sys.argv[1:]))