123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330 |
- #!/usr/bin/env bash
- # shellcheck disable=SC2043 # noise. fine for a loop to run only once.
- #
- # SPDX-License-Identifier: GPL-2.0-or-later
- #
- # Parametrisation to this script is as follows:
- # * none yet
- ###
- # Preamble
- ###
- my_path="$(dirname $(readlink -f $0))" || exit $?
- readonly my_path
- readonly csv_path="$my_path/data"
- readonly log_path="$csv_path/logs"
- readonly img_path="$csv_path/images"
- readonly gnuplot_terminal="svg enhanced background rgb 'white' size 800 600"
- mkdir -p "$log_path"
- mkdir -p "$img_path"
- function cleanup() {
- echo OK
- }
- trap cleanup EXIT
- function error_out() {
- exit 1
- }
- trap error_out INT TERM
- ###
- # Functions
- ###
- function cg() {
- csvgrep -c $1 -r $2 $3
- }
- ###
- # Implementation
- ###
- readonly desc_block_ciphers="Benchmarks were done with growing sample size and averaging over\nprocessing of 128 samples of said sample size"
- readonly desc_asymmetric="Benchmarks were done with averaging over\nas many repetitions possible of the benchmarked operation in 1s"
- readonly desc_others="Benchmarks were done with 1MiB block size and averaging over\nas many repetitions possible of processing 5MiB data in 1s"
- configs=$(find $csv_path -type d -name '*results*' | sed 's@.*results_@@g') || exit $?
- readonly configs
- ###
- # Symmetric crypto
- readonly sym="cbc ccm gcm"
- declare -A directions
- directions["dec"]="decryption"
- directions["enc"]="encryption"
- declare -A aad_sizes
- aad_sizes["no_AAD"]="0 Bytes"
- aad_sizes["custom"]="13 Bytes"
- aad_sizes["default"]="16 Bytes"
- # not pretty but works for me :)
- # CBC&GCM encryption is in software a lot faster than decryption,
- # therefore use the same Range on the Y-Axis to also have a visual indication.
- # This will break if something changes, so let the user override the value
- cbc_yrange="${cbc_yrange:=1400}"
- gcm_yrange="${gcm_yrange:=500}"
- for mode in $sym
- do
- infile="$csv_path/combined_${mode}.csv"
- for dir in "${!directions[@]}"
- do
- plotstring=
- more_style=
- for cfg in $configs
- do
- for bsize in $(csvcut -c blocksize $infile | tail -n +2 | sort -u)
- do
- if [ "$mode" == "cbc" ]; then
- outfile=$log_path/${mode}${bsize}_${cfg}_${dir}.log
- val="$(cg config $cfg $infile | cg blocksize $bsize | cg direction $dir | csvcut -c chunksize,MiB/s | tail -n +2 | tr ',' ' ')"
- if [ "$val" != "" ]; then
- echo "$val" > $outfile
- [ -z "$plotstring" ] && plotstring="plot" || plotstring="${plotstring},"
- plotstring="${plotstring} '$outfile' smooth bezier title \"$cfg AES$bsize\""
- fi
- [ "$mode" == "cbc" -a "$cbc_yrange" != "" ] && more_style="set yrange [ 0 : $cbc_yrange ]"
- else
- for aad in "${!aad_sizes[@]}"
- do
- outfile=$log_path/${mode}${bsize}_${cfg}_${dir}_${aad}.log
- val="$(cg config $cfg $infile | cg blocksize $bsize | cg direction $dir | cg AAD $aad | csvcut -c chunksize,MiB/s | tail -n +2 | tr ',' ' ')"
- if [ "$val" != "" ]; then
- echo "$val" > $outfile
- [ -z "$plotstring" ] && plotstring="plot" || plotstring="${plotstring},"
- plotstring="${plotstring} '$outfile' smooth bezier title \"$cfg AES$bsize ${aad_sizes[$aad]} AAD\""
- fi
- done
- [ "$mode" == "gcm" -a "$gcm_yrange" != "" ] && more_style="set yrange [ 0 : $gcm_yrange ]"
- fi
- done
- done
- modep=${mode^^}
- gnuplot << EOF
- set terminal $gnuplot_terminal
- set title "${modep} ${directions[${dir}]} on Xilinx Versal"
- set x2label "${desc_block_ciphers}"
- set xlabel "Sample size"
- set ylabel "MiB/s"
- set style data lines
- $more_style
- set output "${img_path}/${mode}_${dir}.${gnuplot_terminal%% *}"
- $plotstring
- EOF
- done
- done
- ###
- # Also create separate graphs for AES-GCM-128 and -256 since that's too many lines in one image
- for mode in gcm
- do
- infile="$csv_path/combined_${mode}.csv"
- for dir in "${!directions[@]}"
- do
- for bsize in $(csvcut -c blocksize $infile | tail -n +2 | sort -u)
- do
- plotstring=
- more_style="set yrange [ 0 : $gcm_yrange ]"
- for cfg in $configs
- do
- for aad in "${!aad_sizes[@]}"
- do
- outfile=$log_path/${mode}${bsize}_${cfg}_${dir}_${aad}.log
- val="$(cg config $cfg $infile | cg blocksize $bsize | cg direction $dir | cg AAD $aad | csvcut -c chunksize,MiB/s | tail -n +2 | tr ',' ' ')"
- if [ "$val" != "" ]; then
- echo "$val" > $outfile
- [ -z "$plotstring" ] && plotstring="plot" || plotstring="${plotstring},"
- plotstring="${plotstring} '$outfile' smooth bezier title \"$cfg AES$bsize ${aad_sizes[$aad]} AAD\""
- fi
- done
- done
- modep=${mode^^}
- gnuplot << EOF
- set terminal $gnuplot_terminal
- set title "${modep}-${bsize} ${directions[${dir}]} on Xilinx Versal"
- set x2label "${desc_block_ciphers}"
- set xlabel "Sample size"
- set ylabel "MiB/s"
- set style data lines
- $more_style
- set output "${img_path}/${mode}${bsize}_${dir}.${gnuplot_terminal%% *}"
- $plotstring
- EOF
- done
- done
- done
- ###
- # Asymmetric crypto
- declare -A asym_operations
- asym_operations["ecc"]="keygen agree sign verify"
- asym_operations["rsa"]="keygen public private"
- for algo in "${!asym_operations[@]}"
- do
- infile="$csv_path/combined_${algo}.csv"
- for op in ${asym_operations[$algo]}
- do
- outfile=$log_path/${algo}_${op}.log
- echo -n "" > $outfile
- for ksize in $(csvcut -c keysize $infile | tail -n +2 | sort -u)
- do
- for cfg in $configs
- do
- h="${algo^^}-$ksize"
- v=$(cg config $cfg $infile | cg operation $op | cg keysize $ksize | csvcut -c "avg ms" | tail -n +2 | tr ',' ' ')
- [ "$v" != "" ] && echo "$h\n$cfg $v" >> $outfile
- done
- done
- algop=${algo^^}
- gnuplot << EOF
- set terminal $gnuplot_terminal
- set title "${algop} ${op} on Xilinx Versal"
- set x2label "${desc_asymmetric}"
- set xlabel 'Configurations' offset 0,-1
- set ylabel "ms per op"
- set style fill solid
- set style line 1 lc rgb "grey50"
- set boxwidth 0.5
- unset key
- set output "${img_path}/${algo}_${op}.${gnuplot_terminal%% *}"
- plot "$outfile" using :2:xtic(1) with boxes ls 1, \
- '' using :2:2 w labels offset 0,0.7
- EOF
- done
- done
- ###
- # Hashes
- declare -A hash_sizes
- hash_sizes["sha2"]="224 256 384 512"
- hash_sizes["sha3"]="384"
- plotstring=
- outfile=$log_path/sha.log
- echo -n "" > $outfile
- for algo in "${!hash_sizes[@]}"
- do
- infile="$csv_path/combined_${algo}.csv"
- for hsize in ${hash_sizes[$algo]}
- do
- for cfg in $configs
- do
- h="${algo^^}-$hsize"
- v=$(cg config $cfg $infile | cg algorithm $h | csvcut -c MiB/s | tail -n +2 | sed 's@\..*$@@')
- [ "$v" != "" ] && echo "$h\n$cfg $v" >> $outfile
- done
- echo >> $outfile
- done
- done
- gnuplot << EOF
- set terminal $gnuplot_terminal
- set title "SHA2/SHA3 on Xilinx Versal"
- set x2label "${desc_others}"
- set xlabel 'Configurations' offset 0,-1
- set ylabel "MiB/s"
- set style fill solid
- set style line 1 lc rgb "grey50"
- set boxwidth 0.5
- unset key
- set output "${img_path}/sha.${gnuplot_terminal%% *}"
- plot "$outfile" using :2:xtic(1) with boxes ls 1, \
- '' using :2:2 w labels offset 0,0.7
- EOF
- ###
- # MACs
- declare -A macs
- macs["cmac"]="128 256"
- plotstring=
- outfile=$log_path/mac.log
- echo -n "" > $outfile
- for algo in "${!macs[@]}"
- do
- infile="$csv_path/combined_${algo}.csv"
- for hsize in ${macs[$algo]}
- do
- for cfg in $configs
- do
- h="${algo^^}-$hsize"
- v=$(cg config $cfg $infile | cg keysize $hsize | csvcut -c MiB/s | tail -n +2 | sed 's@\..*$@@')
- [ "$v" != "" ] && echo "$h\n$cfg $v" >> $outfile
- done
- echo >> $outfile
- done
- done
- gnuplot << EOF
- set terminal $gnuplot_terminal
- set title "MAC's on Xilinx Versal"
- set x2label "${desc_others}"
- set xlabel 'Configurations' offset 0,-1
- set ylabel "MiB/s"
- set style fill solid
- set style line 1 lc rgb "grey50"
- set boxwidth 0.5
- unset key
- set yrange [ 0 : 500 ]
- set output "${img_path}/mac.${gnuplot_terminal%% *}"
- plot "$outfile" using :2:xtic(1) with boxes ls 1, \
- '' using :2:2 w labels offset 0,0.7
- EOF
- ###
- # RNG
- plotstring=
- outfile=$log_path/rng.log
- echo -n "" > $outfile
- for algo in rng
- do
- infile="$csv_path/combined_${algo}.csv"
- for cfg in $configs
- do
- h="${algo^^}"
- v=$(cg config $cfg $infile | csvcut -c MiB/s | tail -n +2 | sed 's@\..*$@@')
- [ "$v" != "" ] && echo "$h\n$cfg $v" >> $outfile
- done
- echo >> $outfile
- done
- gnuplot << EOF
- set terminal $gnuplot_terminal
- set title "RNG on Xilinx Versal"
- set x2label "${desc_others}"
- set xlabel 'Configurations' offset 0,-1
- set ylabel "MiB/s"
- set style fill solid
- set style line 1 lc rgb "grey50"
- set boxwidth 0.5
- unset key
- set yrange [ 0 : 50 ]
- with_unit(Value,Unit) = sprintf("%d %s", Value, Unit)
- set output "${img_path}/rng.${gnuplot_terminal%% *}"
- plot "$outfile" using :2:xtic(1) with boxes ls 1, \
- '' using :2:2 w labels offset 0,0.7
- EOF
- #eof
|