This commit is contained in:
2026-03-17 11:21:20 +03:00
parent 6f718668c8
commit bbb1b91e95
10 changed files with 627 additions and 0 deletions

View File

@@ -0,0 +1,73 @@
#!/usr/bin/env python3
"""
Строит график зависимости времени вычисления от размера полигона
для MPI (1, 2, 4 узла) и CUDA.
Использование:
python3 plot_task2_results.py \
--mpi1 results/task2-mpi-1n-XXXXX.csv \
--mpi2 results/task2-mpi-2n-XXXXX.csv \
--mpi4 results/task2-mpi-4n-XXXXX.csv \
--cuda results/task2-cuda-XXXXX.csv \
-o report/img/task2-time-comparison.png
"""
import argparse
import csv
from pathlib import Path
import matplotlib.pyplot as plt
def read_mpi_csv(path: str) -> tuple[list[int], list[float]]:
sizes, times = [], []
with open(path) as f:
reader = csv.DictReader(f)
for row in reader:
sizes.append(int(row["n"]))
times.append(float(row["time_ms"]))
return sizes, times
def read_cuda_csv(path: str) -> tuple[list[int], list[float]]:
sizes, times = [], []
with open(path) as f:
reader = csv.DictReader(f)
for row in reader:
sizes.append(int(row["n"]))
times.append(float(row["time_ms"]))
return sizes, times
def main() -> None:
parser = argparse.ArgumentParser()
parser.add_argument("--mpi1", required=True, help="CSV for MPI 1 node")
parser.add_argument("--mpi2", required=True, help="CSV for MPI 2 nodes")
parser.add_argument("--mpi4", required=True, help="CSV for MPI 4 nodes")
parser.add_argument("--cuda", required=True, help="CSV for CUDA")
parser.add_argument("-o", "--output", default="task2-time-comparison.png")
args = parser.parse_args()
fig, ax = plt.subplots(figsize=(10, 6))
for label, path in [
("MPI 1 node", args.mpi1),
("MPI 2 nodes", args.mpi2),
("MPI 4 nodes", args.mpi4),
("CUDA", args.cuda),
]:
sizes, times = read_mpi_csv(path) if "mpi" in label.lower() else read_cuda_csv(path)
ax.plot(sizes, times, marker="o", label=label)
ax.set_xlabel("Размер полигона n")
ax.set_ylabel("Время, мс")
ax.set_title("Зависимость времени вычисления от размера полигона")
ax.legend()
ax.grid(True, alpha=0.3)
Path(args.output).parent.mkdir(parents=True, exist_ok=True)
fig.savefig(args.output, dpi=150, bbox_inches="tight")
print(f"Saved: {args.output}")
if __name__ == "__main__":
main()