#! /bin/bash set -u #barriereList="jikes_barrier asm_cache c_cache fake" barriereList="jikes_barrier asm_cache c_cache" communicationList="asm_cache c_cache shared_mem shared_mem_opt pipe" comList=`ls *.log | perl -ni -e '/-([^-]+)_comm/; $a{$1}=""; END { foreach ( sort keys %a ) {print "$_ "}}'` cacheList=`ls *log | perl -ni -e '/cache_([^-]+)-/; $a{$1}=""; END { foreach ( sort keys %a ) {print "$_ "}}'` prodList=`ls *.log | perl -ni -e '/typeProd_([^-]+)-/; $a{$1}=""; END { foreach ( sort keys %a ) {print "$_ "}}'` barriereCommaList=`echo $barriereList | sed "s/ /,/g"` argTypeProdList=`eval ls *typeProd_useless_loop*{$barriereCommaList}_comm.log | perl -ni -e '/argTypeProd_([\d]+)-/; $a{$1}=""; END { foreach ( sort { $a <=> $b } keys %a ) {print "$_ "}}'` metriqueList="cache_hits cache_miss cycles total_time" echo "set style data histogram" > multicores.gnuplot echo "set style histogram cluster gap 1" >> multicores.gnuplot echo "set style fill solid border -1" >> multicores.gnuplot echo "set boxwidth 0.9" >> multicores.gnuplot 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 key autotitle columnhead" >> $gnuplotFile 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) , '' every 3::$lineNum u 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 ;; *) argTypeProd=1 ;; esac for bench in "communication" "barriere" ; do # Create dat headers for metrique in $metriqueList ; do case "$metrique" in 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 create_dat_header "$prod" "$bench" "$metrique" create_dat_body "$prod" "$bench" "$metrique" "$argTypeProd" "$metriquePattern" create_gnuplot_file "$prod" "$bench" "$metrique" "$ylabel" done done done for gnuplotFile in *.gnuplot do gnuplot "$gnuplotFile" done for psFile in *.ps do ps2pdf $psFile done