From aba782a19d3acedff8c81e91839235f2fc6ff404 Mon Sep 17 00:00:00 2001
From: Florian Fischer <florian.fischer@muhq.space>
Date: Fri, 8 Apr 2022 09:57:33 +0200
Subject: [PATCH] update plots

---
 gen_boxplots.py  | 91 ++++++++++++++++++++++++++++++++++++++++++++----
 muhq-ma-plots.sh | 23 ++++++++----
 plots/common.tex |  7 ++++
 3 files changed, 108 insertions(+), 13 deletions(-)
 create mode 100644 plots/common.tex

diff --git a/gen_boxplots.py b/gen_boxplots.py
index c61df66..0b9c23f 100755
--- a/gen_boxplots.py
+++ b/gen_boxplots.py
@@ -1,6 +1,7 @@
 #!/usr/bin/env python3
 """generate boxplots from descriptive stats in yaml"""
 
+import os
 import sys
 import typing as T
 
@@ -8,6 +9,72 @@ import yaml
 
 Data = dict[str, T.Any]
 
+PLOT_SPECIFICS = {
+    'hints': {
+        'ylabel': '{latency [us]}',
+        'ymax': '300',
+        'xmax': '3',
+        'xtick': '{1,2}',
+        'xticklabels': '{pipe, pipe-no-hints}',
+        'title': 'Wakeup Hints',
+    },
+    'latency': {
+        'ymax': '1500',
+        'xtick': '{1,2,3}',
+        'xticklabels': '{pipe-steal-nc, pipe, pipe-nc}',
+        'title': 'Pipe Latency Variants'
+    },
+    'contention': {
+        'ymax': '1100',
+        'xtick': '{1,2,3}',
+        'xticklabels': '{no-sleep, vanilla}',
+        'title': 'Global queue contention'
+    },
+    'l-vs-ll': {
+        'ymax': '1500',
+        'xtick': '{1,2,3,4}',
+        'xticklabels': '{ll-n-nc, n-nc\\vertPhantom{}, ll-s-nc, s-nc\\vertPhantom{}}',
+        'title': ' Lockless vs Locked'
+    },
+    'n-s-c': {
+        'ylabel': '{latency [us]}',
+        'ymax': '1300',
+        'xtick': '{1,2,3,4}',
+        'xticklabels': '{n, n-nc, s, s-nc}',
+        'title': 'Additional Completer'
+    },
+    'n-vs-ns': {
+        'ylabel': '{latency [us]}',
+        'ymax': '150',
+        'xtick': '{1,2,3}',
+        'xticklabels': '{ll-n-nc, s-ns, ll-s-ns}',
+        'title': 'Notifications vs No Sleep'
+    },
+    'strategies': {
+        'ymax': '250',
+        'xtick': '{1,2,3}',
+        'xticklabels': '{vanilla, pipe, \\waitfd{}}',
+        'title': 'Sleep Strategies'
+    },
+}
+
+
+def generate_plot_specifics() -> str:
+    """Generate plot specifics for the plot passed via the environment"""
+    plot = os.environ['BOXPLOT']
+    if not plot:
+        return ''
+
+    if plot not in PLOT_SPECIFICS:
+        print(f'ERROR: specified plot "{plot}" unknown', file=sys.stderr)
+        sys.exit(1)
+
+    tikz_lines = []
+    for key, value in PLOT_SPECIFICS[plot].items():
+        tikz_lines.append(f'{key}={value}')
+
+    return ',\n'.join(tikz_lines)
+
 
 def parse_data(stream) -> T.Optional[Data]:
     """Convert yamls string to dict"""
@@ -15,22 +82,27 @@ def parse_data(stream) -> T.Optional[Data]:
 
 TIKZ_TEMPLATE = \
 """\\documentclass[]{standalone}
-\\usepackage{pgfplots}
-\\pgfplotsset{compat=1.17}
-\\usepgfplotslibrary{statistics}
+\\input{common.tex}
 \\begin{document}
 \\begin{tikzpicture}
 \\begin{axis}[
+    mark=x,
     boxplot/draw direction=y,
     legend columns=2,
     area legend,
-    ylabel="latency [us]",
+    xmin=0,
+    xtick pos=bottom,
+    ytick pos=left,
+    xminorticks=false,
+    yminorticks=false,
+    ymajorgrids=true,
     legend style={
         draw=none,
         fill=none,
         at={(0.5,-0.1)},
         anchor=north
     },
+    $PLOT_SPECIFICS$
 ]
 $PLOTS$
 \\end{axis}
@@ -40,6 +112,7 @@ $PLOTS$
 
 PLOT_TEMPLATE = \
 """\\addplot+[
+    mark=x,
     boxplot prepared={{
           lower whisker={lower_whisker},
           lower quartile={lower_quartile},
@@ -49,13 +122,15 @@ PLOT_TEMPLATE = \
           upper whisker={upper_whisker},
       }},
 ] coordinates{{{outlier_cords}}};
-\\addlegendentry{{{variant}}}
+%\\addlegendentry{{{variant}}}
 """
 
 
 def generate_boxplot(data: Data) -> str:
     """generate a tikzboxplot"""
+
     plots = ''
+
     for variant, stats in data.items():
         outlier_cords = ''
         for outlier in stats['outliers']:
@@ -64,7 +139,11 @@ def generate_boxplot(data: Data) -> str:
                                       outlier_cords=outlier_cords,
                                       **stats)
 
-    return TIKZ_TEMPLATE.replace('$PLOTS$', plots)
+    tikz = TIKZ_TEMPLATE.replace('$PLOTS$', plots)
+
+    plot_specifics = generate_plot_specifics()
+    tikz = tikz.replace('$PLOT_SPECIFICS$', plot_specifics)
+    return tikz
 
 
 def main():
diff --git a/muhq-ma-plots.sh b/muhq-ma-plots.sh
index 64dc6e0..b51a7c5 100755
--- a/muhq-ma-plots.sh
+++ b/muhq-ma-plots.sh
@@ -6,6 +6,7 @@ SUM=./summarize.py
 PLOT=./gen_boxplots.py
 
 PLOT_DIR=plots/
+PLOT_PREFIX=iol
 
 RESULTS=$1
 shift
@@ -15,20 +16,28 @@ if [[ -z "${RESULTS}" ]]; then
 	exit 1
 fi
 
-${SUM} --yaml -i emper-pipe emper-pipe-no-hint -- "${RESULTS}" | ${PLOT} > ${PLOT_DIR}/io-latency-hints.tex
+${SUM} --yaml -i emper-pipe emper-pipe-no-hint -- "${RESULTS}" \
+	| BOXPLOT="hints" ${PLOT} > ${PLOT_DIR}/${PLOT_PREFIX}-hints.tex
 
 ${SUM} --yaml -i emper-pipe emper-pipe-no-comp emper-io-stealing-pipe-no-comp -- "${RESULTS}" \
-	| ${PLOT} > ${PLOT_DIR}/io-latency.tex
+	| BOXPLOT="latency" ${PLOT} > ${PLOT_DIR}/${PLOT_PREFIX}-latency.tex
 
-${SUM} --yaml -i emper-pipe emper-waitfd -- "${RESULTS}" | ${PLOT} > ${PLOT_DIR}/pipe-vs-waitfd.tex
+${SUM} --yaml -i emper-vanilla emper-no-sleep -- "${RESULTS}" \
+    | BOXPLOT="contention" ${PLOT} > ${PLOT_DIR}/${PLOT_PREFIX}-contention.tex
+
+${SUM} --yaml -i emper-vanilla emper-pipe emper-waitfd -- "${RESULTS}" \
+	| BOXPLOT="strategies" ${PLOT} > ${PLOT_DIR}/${PLOT_PREFIX}-strategies.tex
 
 ${SUM} --yaml -i emper-io-notification-waitfd-no-comp emper-io-notification-waitfd \
                  emper-io-stealing-waitfd-no-comp emper-io-stealing-waitfd -- "${RESULTS}" \
-    | ${PLOT} > ${PLOT_DIR}/notification-stealing-completer.tex
+    | BOXPLOT="n-s-c" ${PLOT} > ${PLOT_DIR}/${PLOT_PREFIX}-notification-stealing-completer.tex
 
 ${SUM} --yaml -i emper-io-notification-lockless-waitfd-no-comp emper-io-notification-waitfd-no-comp \
                  emper-io-stealing-lockless-waitfd-no-comp emper-io-stealing-waitfd-no-comp -- "${RESULTS}" \
-    | ${PLOT} > ${PLOT_DIR}/lockless-vs-locked.tex
+    | BOXPLOT="l-vs-ll" ${PLOT} > ${PLOT_DIR}/${PLOT_PREFIX}-lockless-vs-locked.tex
+
+${SUM} --yaml -i emper-io-notification-lockless-waitfd-no-comp \
+                 emper-stealing-no-sleep emper-stealing-lockless-no-sleep -- "${RESULTS}" \
+    | BOXPLOT="n-vs-ns" ${PLOT} > ${PLOT_DIR}/${PLOT_PREFIX}-notification-vs-nosleep.tex
+
 
-${SUM} --yaml -i emper-io-notification-lockless-waitfd-no-comp emper-no-sleep -- "${RESULTS}" \
-    | ${PLOT} > ${PLOT_DIR}/notification-vs-nosleep.tex
diff --git a/plots/common.tex b/plots/common.tex
new file mode 100644
index 0000000..07c23b1
--- /dev/null
+++ b/plots/common.tex
@@ -0,0 +1,7 @@
+\usepackage{pgfplots}
+\pgfplotsset{compat=1.17}
+\usepgfplotslibrary{statistics}
+
+\NewDocumentCommand \Waitfd{}{\texttt{Suspendfd}}
+\NewDocumentCommand \waitfd{}{\texttt{suspendfd}}
+\NewDocumentCommand \vertPhantom {}{\vphantom{gG}}
-- 
GitLab