about summary refs log tree commit diff stats
path: root/archive/2024/winter/bsc_dichler/scripts/plot/malloc.py
diff options
context:
space:
mode:
Diffstat (limited to 'archive/2024/winter/bsc_dichler/scripts/plot/malloc.py')
-rw-r--r--archive/2024/winter/bsc_dichler/scripts/plot/malloc.py122
1 files changed, 122 insertions, 0 deletions
diff --git a/archive/2024/winter/bsc_dichler/scripts/plot/malloc.py b/archive/2024/winter/bsc_dichler/scripts/plot/malloc.py
new file mode 100644
index 000000000..50a21aa18
--- /dev/null
+++ b/archive/2024/winter/bsc_dichler/scripts/plot/malloc.py
@@ -0,0 +1,122 @@
+from pathlib import Path
+import pandas as pd
+import matplotlib.pyplot as plt
+import numpy as np
+
+
+def run(csv_file1, csv_file2, duration_type, output, format):
+    df1 = pd.read_csv(csv_file1, sep=";")
+    df2 = pd.read_csv(csv_file2, sep=";")
+
+    def norm(df):
+        df["duration_allocation"] = df["duration_allocation"] / df["allocation"] / 1000
+        df["duration_deallocation"] = (
+            df["duration_deallocation"] / df["allocation"] / 1000
+        )
+
+    norm(df1)
+    norm(df2)
+
+    grouped1 = (
+        df1.groupby("size")[["duration_allocation", "duration_deallocation"]]
+        .agg(["mean", "std"])
+        .reset_index()
+    )
+    grouped2 = (
+        df2.groupby("size")[["duration_allocation", "duration_deallocation"]]
+        .agg(["mean", "std"])
+        .reset_index()
+    )
+
+    _, ax1 = plt.subplots(figsize=(12, 6))
+
+    library = [
+        "16 Bytes",
+        "128 Bytes",
+        "256 Bytes",
+        "1024 Bytes",
+        "2048 Bytes",
+        "4096 Bytes",
+        "8192 Bytes",
+    ]
+    x = np.arange(len(library))
+    bar_width = 0.35
+
+    bars1 = ax1.bar(
+        x - bar_width / 2,
+        grouped1[duration_type]["mean"],
+        yerr=grouped1[duration_type]["std"],
+        width=bar_width,
+        capsize=5,
+        label="MTE disabled",
+        color="#a6bddb",
+        edgecolor="black",
+        linewidth=2,
+    )
+    bars2 = ax1.bar(
+        x + bar_width / 2,
+        grouped2[duration_type]["mean"],
+        yerr=grouped2[duration_type]["std"],
+        width=bar_width,
+        capsize=5,
+        label="MTE enabled",
+        color="#fc9272",
+        edgecolor="black",
+        linewidth=2,
+    )
+
+    for i in range(len(bars1)):
+        height2 = bars2[i].get_height()
+        height1 = bars1[i].get_height()
+
+        ax1.annotate(
+            "",
+            xy=(x[i] - bar_width / 2, height2),
+            xytext=(x[i] - bar_width / 2, height1),
+            arrowprops=dict(arrowstyle="->", color="red", lw=2),
+            color="red",
+            ha="center",
+        )
+
+        difference = height2 / height1
+        ax1.text(
+            i - bar_width / 2 - 0.04,
+            height1 + ((height2 - height1) / 2) - 0.08,
+            f"{difference:.2f}×",
+            color="red",
+            fontweight="bold",
+            bbox=dict(facecolor="white", alpha=1.0, edgecolor="none"),
+            ha="center",
+        )
+
+    plt.ylabel("Time (µs)")
+    ax1.set_xlabel("Batch size")
+    ax1.legend(loc="upper left")
+    plt.title("Lower is better ↓", color="navy")
+
+    ax1.spines["top"].set_visible(False)
+    ax1.spines["right"].set_visible(False)
+    plt.tight_layout()
+
+    plt.xticks(x, library)
+    plt.tight_layout()
+    plt.savefig(output, format=format)
+
+
+def plot(output_root: Path, format):
+    output_root = output_root / Path("malloc")
+
+    run(
+        output_root / Path("malloc.csv"),
+        output_root / Path("malloc_mte.csv"),
+        "duration_allocation",
+        output_root / Path(f"result-alloc.{format}"),
+        format,
+    )
+    run(
+        output_root / Path("malloc.csv"),
+        output_root / Path("malloc_mte.csv"),
+        "duration_deallocation",
+        output_root / Path(f"result-dealloc.{format}"),
+        format,
+    )