From 8ba84587be38b12833a72db2eaa8203c144d6730 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Constantin=20F=C3=BCrst?= Date: Tue, 5 Dec 2023 23:33:21 +0100 Subject: [PATCH] add plotter for submit method with logscale to show optimal --- .../plot-opt-submitmethod.py | 96 ++++++++++++++++++ .../plot-opt-submitmethod.png | Bin 0 -> 35459 bytes 2 files changed, 96 insertions(+) create mode 100644 benchmarks/benchmark-plotters/plot-opt-submitmethod.py create mode 100644 benchmarks/benchmark-results/plot-opt-submitmethod.png diff --git a/benchmarks/benchmark-plotters/plot-opt-submitmethod.py b/benchmarks/benchmark-plotters/plot-opt-submitmethod.py new file mode 100644 index 0000000..c3e2430 --- /dev/null +++ b/benchmarks/benchmark-plotters/plot-opt-submitmethod.py @@ -0,0 +1,96 @@ +import os +import json +import pandas as pd +from pandas.core.ops import methods +from typing import List +import seaborn as sns +import matplotlib.pyplot as plt + +runid = "Run ID" +x_label = "Size of Submitted Task" +y_label = "Throughput in GiB/s, LogScale" +var_label = "Submission Type" +sizes = ["1kib", "4kib", "1mib", "32mib"] +sizes_nice = ["1 KiB", "4 KiB", "1 MiB", "32 MiB"] +types = ["bs10", "bs50", "ms10", "ms50", "ssaw"] +types_nice = ["Batch, Size 10", "Batch, Size 50", "Multi-Submit, Count 10", "Multi-Submit, Count 50", "Single Submit"] +title = "Optimal Submission Method - Copy Operation tested Intra-Node on DDR" + +index = [runid, x_label, var_label] +data = [] + +def calc_throughput(size_bytes,time_microseconds): + time_seconds = time_microseconds * 1e-9 + size_gib = size_bytes / (1024 ** 3) + throughput_gibs = size_gib / time_seconds + return throughput_gibs + + +def index_from_element(value,array): + for (idx,val) in enumerate(array): + if val == value: return idx + return 0 + + +def load_and_process_submit_json(file_path): + with open(file_path, 'r') as file: + data = json.load(file) + return data["list"][0]["report"]["time"] + + +# Function to plot the graph for the new benchmark +def create_submit_dataset(file_paths, type_label): + times = [] + + type_index = index_from_element(type_label,types) + type_nice = types_nice[type_index] + + idx = 0 + for file_path in file_paths: + time = load_and_process_submit_json(file_path) + times.append(time["combined"]) + idx = idx + 1 + + # Adjust time measurements based on type + # which can contain multiple submissions + if type_label in {"bs10", "ms10"}: + times = [[t / 10 for t in time] for time in times] + elif type_label in {"ms50", "bs50"}: + times = [[t / 50 for t in time] for time in times] + + times[0] = [t / 1 for t in times[0]] + times[1] = [t / 4 for t in times[1]] + times[2] = [t / (1024) for t in times[2]] + times[3] = [t / (32*1024) for t in times[3]] + + throughput = [[calc_throughput(1024,time) for time in t] for t in times] + + idx = 0 + for run_set in throughput: + run_idx = 0 + for run in run_set: + data.append({ runid : run_idx, x_label: sizes_nice[idx], var_label : type_nice, y_label : throughput[idx][run_idx]}) + run_idx = run_idx + 1 + idx = idx + 1 + + +# Main function to iterate over files and create plots for the new benchmark +def main(): + folder_path = "benchmark-results/" # Replace with the actual path to your folder + + for type_label in types: + file_paths = [os.path.join(folder_path, f"submit-{type_label}-{size}-1e.json") for size in sizes] + create_submit_dataset(file_paths, type_label) + + df = pd.DataFrame(data) + df.set_index(index, inplace=True) + df = df.sort_values(y_label) + + sns.barplot(x=x_label, y=y_label, hue=var_label, data=df, palette="rocket", errorbar="sd").set(yscale="log") + + plt.title(title) + plt.savefig(os.path.join(folder_path, "plot-opt-submitmethod.png"), bbox_inches='tight') + plt.show() + +if __name__ == "__main__": + main() \ No newline at end of file diff --git a/benchmarks/benchmark-results/plot-opt-submitmethod.png b/benchmarks/benchmark-results/plot-opt-submitmethod.png new file mode 100644 index 0000000000000000000000000000000000000000..00b0499493478e1f6256f71a78da4401f0847153 GIT binary patch literal 35459 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