% Figure: speedup decomposition — three panels (one per algorithm), log y-axis. % Data: paper/figures/data/decomp_{mlkem512,768,1024}.csv \begin{tikzpicture} \begin{groupplot}[ group style={group size=3 by 1, horizontal sep=1.6cm, ylabels at=edge left}, pqc bar, ybar, ymode=log, ymin=1, ymax=500, ytick={1,2,5,10,20,50,100,200}, yticklabels={$1\times$,$2\times$,$5\times$,$10\times$,$20\times$,$50\times$,$100\times$,$200\times$}, yminorticks=true, width=5.2cm, height=6.5cm, symbolic x coords={INVNTT,basemul,frommsg,NTT,iDec,iEnc,iKeypair,gena,noise}, xticklabels={INVNTT,basemul,frommsg,NTT,iDec,iEnc,iKeypair,gen\_a,noise}, ylabel={Speedup over \texttt{-O0} ($\times$)}, ] %% ML-KEM-512 \nextgroupplot[title={\mlkemk{512}}, bar width=3.5pt] \addplot+[fill=colRefnv, draw=colRefnv!70!black, opacity=0.85, error bars/.cd, y dir=both, y explicit] table[x=op, y=refnv_sp, y error plus=refnv_ehi, y error minus=refnv_elo, col sep=comma]{figures/data/decomp_mlkem512.csv}; \addplot+[fill=colRef, draw=colRef!70!black, opacity=0.85, error bars/.cd, y dir=both, y explicit] table[x=op, y=ref_sp, y error plus=ref_ehi, y error minus=ref_elo, col sep=comma]{figures/data/decomp_mlkem512.csv}; \addplot+[fill=colAvx, draw=colAvx!70!black, opacity=0.85, error bars/.cd, y dir=both, y explicit] table[x=op, y=avx2_sp, y error plus=avx2_ehi, y error minus=avx2_elo, col sep=comma]{figures/data/decomp_mlkem512.csv}; %% ML-KEM-768 \nextgroupplot[title={\mlkemk{768}}, ylabel={}, bar width=3.5pt] \addplot+[fill=colRefnv, draw=colRefnv!70!black, opacity=0.85, error bars/.cd, y dir=both, y explicit] table[x=op, y=refnv_sp, y error plus=refnv_ehi, y error minus=refnv_elo, col sep=comma]{figures/data/decomp_mlkem768.csv}; \addplot+[fill=colRef, draw=colRef!70!black, opacity=0.85, error bars/.cd, y dir=both, y explicit] table[x=op, y=ref_sp, y error plus=ref_ehi, y error minus=ref_elo, col sep=comma]{figures/data/decomp_mlkem768.csv}; \addplot+[fill=colAvx, draw=colAvx!70!black, opacity=0.85, error bars/.cd, y dir=both, y explicit] table[x=op, y=avx2_sp, y error plus=avx2_ehi, y error minus=avx2_elo, col sep=comma]{figures/data/decomp_mlkem768.csv}; %% ML-KEM-1024 \nextgroupplot[title={\mlkemk{1024}}, ylabel={}, bar width=3.5pt, legend style={at={(1.0,0.99)}, anchor=north east, font=\scriptsize}, legend entries={O3 (no auto-vec), O3 + auto-vec, O3 + hand SIMD}] \addplot+[fill=colRefnv, draw=colRefnv!70!black, opacity=0.85, error bars/.cd, y dir=both, y explicit] table[x=op, y=refnv_sp, y error plus=refnv_ehi, y error minus=refnv_elo, col sep=comma]{figures/data/decomp_mlkem1024.csv}; \addplot+[fill=colRef, draw=colRef!70!black, opacity=0.85, error bars/.cd, y dir=both, y explicit] table[x=op, y=ref_sp, y error plus=ref_ehi, y error minus=ref_elo, col sep=comma]{figures/data/decomp_mlkem1024.csv}; \addplot+[fill=colAvx, draw=colAvx!70!black, opacity=0.85, error bars/.cd, y dir=both, y explicit] table[x=op, y=avx2_sp, y error plus=avx2_ehi, y error minus=avx2_elo, col sep=comma]{figures/data/decomp_mlkem1024.csv}; \end{groupplot} \end{tikzpicture}