diff --git a/communication_techniques/parsing.sh b/communication_techniques/parsing.sh index e1d9820..1da8dbb 100755 --- a/communication_techniques/parsing.sh +++ b/communication_techniques/parsing.sh @@ -21,6 +21,271 @@ echo "set xtic rotate by -45" >> multicores.gnuplot echo "set bmargin 5" >> multicores.gnuplot echo "set terminal postscript landscape color" >> multicores.gnuplot +use_histo () +{ + local prod bench + prod="$1" + bench="$2" + + [ "$bench" = "communication" -o "$prod" != "useless_loop" ] + return $? +} + +create_dat_header () +{ + local prod bench metrique + prod="$1" + bench="$2" + metrique="$3" + + # Create file + > bench_$bench-prod_$prod-metrique_$metrique.dat + + # Only one point per com and cache + if use_histo "$prod" "$bench" + then + for i in 1 2 3 # 1: total, 2: by loop, 3: by write + do + if [ $i -ne 1 ] + then + echo >> bench_$bench-prod_$prod-metrique_$metrique.dat + fi + echo -ne "Method\t\t" >> bench_$bench-prod_$prod-metrique_$metrique.dat + for cache in $cacheList + do + echo -ne "\t$cache" >> bench_$bench-prod_$prod-metrique_$metrique.dat + done + done + # Several points per com and cache (one per calc argument) + else + for i in 1 2 + do + if [ $i -ne 1 ] + then + echo >> bench_$bench-prod_$prod-metrique_$metrique.dat + fi + for j in 1 2 3 # 1: total, 2: by loop, 3: by write + do + echo -ne "argTypeProd\t\t" >> bench_$bench-prod_$prod-metrique_$metrique.dat + for com in $barriereList + do + echo -ne "\t$com" >> bench_$bench-prod_$prod-metrique_$metrique.dat + done + echo >> bench_$bench-prod_$prod-metrique_$metrique.dat + done + done + fi +} + +get_metric_values () +{ + local prod com cache argTypeProd logFile + prod="$1" + com="$2" + cache="$3" + argTypeProd="$4" + metriquePattern="$5" + + logFile=cache_$cache-*-typeProd_$prod-argTypeProd_$argTypeProd-*-${com}_comm.log + perl -n -e "print \"\$1 \$2 \$3 \" if /$metriquePattern.* (\S+) \/ (\S+) \/ (\S+)/" $logFile +} + +create_simple_dat_body () +{ + local prod bench metrique argTypeProd + prod="$1" + bench="$2" + metrique="$3" + argTypeProd="$4" + + for com in `eval echo \\\$\${bench}List` + do + for i in 1 2 3 # 1: total, 2: by loop, 3: by write + do + echo -ne "\n$com\t\t" >> bench_$bench-prod_$prod-metrique_$metrique.dat + for cache in $cacheList + do + if [ $i -eq 1 ] + then + valuetmp=`get_metric_values "$prod" "$com" "$cache" "$argTypeProd" "$metriquePattern"` + eval value$cache=\"$valuetmp\" + fi + eval echo -ne "\${value$cache}" | sed -r "s/^([^ ]+ ){$((i-1))}([^ ]+).*/\t\2/" >> bench_$bench-prod_$prod-metrique_$metrique.dat + done + done + done +} + +create_complex_dat_body () +{ + local prod bench metrique + prod="$1" + bench="$2" + metrique="$3" + + for argTypeProd in $argTypeProdList + do + for cache in $cacheList + do + if [ $cache != ${cacheList%% *} -o $argTypeProd != ${argTypeProdList%% *} ] + then + echo "" >> bench_$bench-prod_$prod-metrique_$metrique.dat + fi + for i in 1 2 3 # 1: total, 2: by loop, 3: by write + do + echo -ne "\n$argTypeProd\t\t" >> bench_$bench-prod_$prod-metrique_$metrique.dat + for com in `eval echo \\\$\${bench}List` + do + if [ $i -eq 1 ] + then + valuetmp=`get_metric_values "$prod" "$com" "$cache" "$argTypeProd" "$metriquePattern"` + eval value$com=\"$valuetmp\" + fi + eval echo -ne "\${value$com}" | sed -r "s/^([^ ]+ ){$((i-1))}([^ ]+).*/\t\2/" >> bench_$bench-prod_$prod-metrique_$metrique.dat + done + done + done + done +} + +create_dat_body () +{ + local prod bench metrique argTypeProd + prod="$1" + bench="$2" + metrique="$3" + argTypeProd="$4" + + if use_histo "$prod" "$bench" + then + create_simple_dat_body "$prod" "$bench" "$metrique" "$argTypeProd" "$metriquePattern" + else + create_complex_dat_body "$prod" "$bench" "$metrique" "$argTypeProd" "$metriquePattern" + fi +} + +create_gnuplot_header () +{ + local prod bench gnuplotFile + prod="$1" + bench="$2" + gnuplotFile="$3" + + echo "set style fill solid border -1" > $gnuplotFile + echo "set boxwidth 0.9" >> $gnuplotFile + echo "set xtic rotate by -45" >> $gnuplotFile + echo "set bmargin 5" >> $gnuplotFile + echo "set terminal postscript landscape color" >> $gnuplotFile + if use_histo "$prod" "$bench" + then + echo "set style data histogram" >> $gnuplotFile + echo "set style histogram cluster gap 1" >> $gnuplotFile + else + echo "set style data linespoints" >> $gnuplotFile + fi +} + +create_simple_gnuplot_body () +{ + local metrique ylabel yscale patternPlotFile datFile + ylabel="$1" + lineNum="$2" + datFile="$3" + patternPlotFile="$4" + + echo "set ylabel \"$ylabel\"" >> $patternPlotFile.gnuplot + echo "set output '$patternPlotFile.ps'" >> $patternPlotFile.gnuplot + echo "plot '$datFile' every 3::$lineNum using 2:xtic(1) title 2 , '' every 3::$lineNum u 3 ti 3" >> $patternPlotFile.gnuplot +} + +create_complex_gnuplot_body () +{ + local bench ylabel lineNum datFile patternPlotFile columnNo baseTitle + bench="$1" + ylabel="$2" + lineNum="$3" + datFile="$4" + patternPlotFile="$5" + columnNo=2 + + echo "set ylabel \"$ylabel\"" >> $patternPlotFile.gnuplot + echo "set output '$patternPlotFile.ps'" >> $patternPlotFile.gnuplot + for com in `eval echo \\\$\${bench}List` ; do + baseTitle=`head -1 $datFile | cut -f $((columnNo + 2))` + if [ $columnNo -ne 2 ] + then + echo -n ", '' " >> $patternPlotFile.gnuplot + else + echo -n "plot '$datFile' " >> $patternPlotFile.gnuplot + fi + echo -n "every :2:$lineNum:0:$lineNum using 1:$columnNo:xtic(1) title '$baseTitle (L2)'" >> $patternPlotFile.gnuplot + echo -n ", '' every :2:$lineNum:1:$lineNum using 1:$columnNo:xtic(1) title '$baseTitle (mem)'" >> $patternPlotFile.gnuplot + columnNo=$((columnNo + 1)) + done + echo >> $patternPlotFile.gnuplot +} + +create_gnuplot_body () +{ + local prod bench yscale ylabel lineNum datFile patternPlotFile + prod="$1" + bench="$2" + yscale="$3" + ylabel="$4" + lineNum="$5" + datFile="$6" + patternPlotFile="$7" + + echo "set $yscale y" >> $patternPlotFile.gnuplot + if [ "$yscale" = "nologscale" ] + then + echo "set yrange [0:*]" >> $patternPlotFile.gnuplot + else + echo "set yrange [*:*]" >> $patternPlotFile.gnuplot + fi + echo "set title \"Producteur : $prod\"" >> $patternPlotFile.gnuplot + if use_histo "$prod" "$bench" + then + create_simple_gnuplot_body "$ylabel" "$lineNum" "$datFile" "$patternPlotFile" + else + create_complex_gnuplot_body "$bench" "$ylabel" "$lineNum" "$datFile" "$patternPlotFile" + fi +} + +create_gnuplot_file () +{ + local prod bench metrique ylabel yscale avg lineNum + prod="$1" + bench="$2" + metrique="$3" + baseYlabel="$4" + + for yscale in "nologscale" "logscale" + do + for avg in total byLoop byWrite + do + case $avg in + total) + lineNum=0 + ylabel="$baseYlabel" ;; + byLoop) + lineNum=1 + ylabel="$baseYlabel par boucle" ;; + byWrite) + lineNum=2 + ylabel="$baseYlabel par ecriture" ;; + esac + datFile=bench_$bench-prod_$prod-metrique_$metrique.dat + patternPlotFile="bench_$bench-prod_$prod-$metrique-$avg-$yscale" # Name without extension of plot and ps files + create_gnuplot_header "$prod" "$bench" "$patternPlotFile.gnuplot" + if [ $metrique != "total_time" -o $yscale != "logscale" ] + then + create_gnuplot_body "$prod" "$bench" "$yscale" "$ylabel" "$lineNum" "$datFile" "$patternPlotFile" + fi + done + done +} + for prod in $prodList ; do case "$prod" in matrice) argTypeProd=16 ;; @@ -28,129 +293,38 @@ for prod in $prodList ; do esac for bench in "communication" "barriere" ; do # Create dat headers - for metrique in $metriqueList ; do - > bench_$bench-prod_$prod-metrique_$metrique.dat - # Compare shared L2 to shared mem - if [ $bench = "communication" -o $prod != "useless_loop" ] ; then - echo -ne "Method\t\t" >> bench_$bench-prod_$prod-metrique_$metrique.dat - for cache in $cacheList ; do - echo -ne "\t$cache" >> bench_$bench-prod_$prod-metrique_$metrique.dat - done - # Compare barrier type - else - echo -ne "argTypeProd\t\t" >> bench_$bench-prod_$prod-metrique_$metrique.dat - for com in $barriereList ; do - echo -ne "\t$com" >> bench_$bench-prod_$prod-metrique_$metrique.dat - done - fi - done - if [ $bench = "communication" -o $prod != "useless_loop" ] ; then - for com in `eval echo \\\$\${bench}List` ; do - for metrique in $metriqueList ; do - case "$metrique" in - cache_hits) metriquePattern="cache hits" ;; - cache_miss) metriquePattern="cache miss" ;; - cycles) metriquePattern="cycles" ;; - total_time) metriquePattern="total_time" ;; - *) echo "Pas de pattern pour cette métrique : $metrique" ; exit 1 ;; - esac - for i in 1 2 3 ; do # 1: total, 2: by loop, 3: by write - echo -ne "\n$com\t\t" >> bench_$bench-prod_$prod-metrique_$metrique.dat - for cache in $cacheList ; do - if [ $i -eq 1 ] - then - eval value$cache=\"`perl -n -e "print \"\\$1 \\$2 \\$3 \" if /$metriquePattern.* (\S+) \/ (\S+) \/ (\S+)/" cache_$cache-*-typeProd_$prod-argTypeProd_$argTypeProd-*-${com}_comm.log`\" - fi - eval echo -ne "\${value$cache}" | cut -d ' ' -f $i | sed -r 's/(.*)/\t\1/' | tr -d '\n' >> bench_$bench-prod_$prod-metrique_$metrique.dat - done - done - done - done - else - for metrique in $metriqueList ; do - case "$metrique" in - cache_hits) metriquePattern="cache hits" ;; - cache_miss) metriquePattern="cache miss" ;; - cycles) metriquePattern="cycles" ;; - total_time) metriquePattern="total_time" ;; - *) echo "Pas de pattern pour cette métrique : $metrique" ; exit 1 ;; - esac - for argTypeProd in $argTypeProdList ; do - for cache in $cacheList ; do - if [ $cache != ${cacheList%% *} -o $argTypeProd != ${argTypeProdList%% *} ] ; then - echo "" >> bench_$bench-prod_$prod-metrique_$metrique.dat - fi - for i in 1 2 3 ; do # 1: total, 2: by loop, 3: by write - echo -ne "\n$argTypeProd\t\t" >> bench_$bench-prod_$prod-metrique_$metrique.dat - for com in `eval echo \\\$\${bench}List` ; do - if [ $i -eq 1 ] - then - eval value$com=\"`perl -n -e "print \"\\$1 \\$2 \\$3 \" if /$metriquePattern.* (\S+) \/ (\S+) \/ (\S+)/" cache_$cache-*-typeProd_$prod-argTypeProd_$argTypeProd-*-${com}_comm.log`\" - fi - eval echo -ne "\${value$com}" | cut -d ' ' -f $i | sed -r 's/(.*)/\t\1/' | tr -d '\n' >> bench_$bench-prod_$prod-metrique_$metrique.dat - done - done - done - done - done - fi - if [ $bench = "communication" -o $prod != "useless_loop" ] ; then - echo "set style data histogram" >> multicores.gnuplot - else - echo "set style data lines" >> multicores.gnuplot - fi for metrique in $metriqueList ; do case "$metrique" in - cache_hits) ylabel="Nb cache hit" ;; - cache_miss) ylabel="Nb cache miss" ;; - cycles) ylabel="Nb cycles" ;; - total_time) ylabel="Secondes" ;; - *) echo "Pas de label pour cette métrique : $metrique" ; exit 1 ;; + cache_hits) + metriquePattern="cache hits" + ylabel="Nb cache hit" ;; + cache_miss) + metriquePattern="cache miss" + ylabel="Nb cache miss" ;; + cycles) + metriquePattern="cycles" + ylabel="Nb cycles" ;; + total_time) + metriquePattern="total_time" + ylabel="Secondes" ;; + *) + echo "Pas de pattern pour cette métrique : $metrique" + echo "Pas de label pour cette métrique : $metrique" + exit 1 ;; esac - - for yscale in "nologscale" "logscale" ; do - echo "set $yscale y" >> multicores.gnuplot - [ "$yscale" = "nologscale" ] && echo "set yrange [0:*]" >> multicores.gnuplot \ - || echo "set yrange [*:*]" >> multicores.gnuplot - echo "set title \"Producteur : $prod\"" >> multicores.gnuplot - if [ $bench = "communication" -o $prod != "useless_loop" ] ; then - echo "set ylabel \"$ylabel\"" >> multicores.gnuplot - echo "set output 'bench_$bench-prod_$prod-$metrique-total-$yscale.ps'" >> multicores.gnuplot - echo "plot 'bench_$bench-prod_$prod-metrique_$metrique.dat' every 3::1 using 2:xtic(1) title 2 , '' every 3::1 u 3 ti 3" >> multicores.gnuplot - if [ $metrique != "total_time" -o $yscale != "logscale" ] ; then - echo "set ylabel \"$ylabel par boucle\"" >> multicores.gnuplot - echo "set output 'bench_$bench-prod_$prod-$metrique-byLoop-$yscale.ps'" >> multicores.gnuplot - echo "plot 'bench_$bench-prod_$prod-metrique_$metrique.dat' every 3::2 using 2:xtic(1) title 2 , '' every 3::2 u 3 ti 3" >> multicores.gnuplot - echo "set ylabel \"$ylabel par ecriture\"" >> multicores.gnuplot - echo "set output 'bench_$bench-prod_$prod-$metrique-byWrite-$yscale.ps'" >> multicores.gnuplot - echo "plot 'bench_$bench-prod_$prod-metrique_$metrique.dat' every 3::3 using 2:xtic(1) title 2 , '' every 3::3 u 3 ti 3" >> multicores.gnuplot - fi - else - columnNo=2 - for com in `eval echo \\\$\${bench}List` ; do - baseTitle=`head -1 bench_$bench-prod_$prod-metrique_$metrique.dat | cut -f $((columnNo + 2))` - echo "set xtics" >> multicores.gnuplot - echo "set ylabel \"$ylabel\"" >> multicores.gnuplot - echo "set output 'bench_$bench-prod_$prod-$metrique-total-$yscale.ps'" >> multicores.gnuplot - echo "plot 'bench_$bench-prod_$prod-metrique_$metrique.dat' every :2:0:0:0 using 1:$columnNo:xtic(1) title '$baseTitle (L2)', '' every :2:0:1:0 using 1:$columnNo:xtic(1) title '$baseTitle (mem)'" >> multicores.gnuplot - if [ $metrique != "total_time" -o $yscale != "logscale" ] ; then - echo "set ylabel \"$ylabel par boucle\"" >> multicores.gnuplot - echo "set output 'bench_$bench-prod_$prod-$metrique-byLoop-$yscale.ps'" >> multicores.gnuplot - echo "plot 'bench_$bench-prod_$prod-metrique_$metrique.dat' every :2:1:0:1 using 1:$columnNo:xtic(1) title '$baseTitle (L2)', '' every :2:1:1:1 using 1:$columnNo:xtic(1) title '$baseTitle (mem)'" >> multicores.gnuplot - echo "set ylabel \"$ylabel par ecriture\"" >> multicores.gnuplot - echo "set output 'bench_$bench-prod_$prod-$metrique-byWrite-$yscale.ps'" >> multicores.gnuplot - echo "plot 'bench_$bench-prod_$prod-metrique_$metrique.dat' every :2:2:0:2 using 1:$columnNo:xtic(1) title '$baseTitle (L2)', '' every :2:2:1:2 using 1:$columnNo:xtic(1) title '$baseTitle (mem)'" >> multicores.gnuplot - fi - columnNo=$((columnNo + 1)) - done - fi - done + create_dat_header "$prod" "$bench" "$metrique" + create_dat_body "$prod" "$bench" "$metrique" "$argTypeProd" "$metriquePattern" + create_gnuplot_file "$prod" "$bench" "$metrique" "$ylabel" done done done -gnuplot multicores.gnuplot - -for f in *.ps ; do - ps2pdf $f +for gnuplotFile in *.gnuplot +do + gnuplot "$gnuplotFile" +done + +for psFile in *.ps +do + ps2pdf $psFile done