rt_benchs/communication_techniques/parsing.sh

329 lines
8.5 KiB
Bash
Raw Normal View History

2009-06-23 12:45:15 +02:00
#! /bin/bash
set -u
2009-07-28 01:16:11 +02:00
#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"
2009-06-23 12:45:15 +02:00
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 "$_ "}}'`
2009-07-28 01:16:11 +02:00
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 "$_ "}}'`
2009-06-23 12:45:15 +02:00
2009-06-23 13:10:04 +02:00
metriqueList="cache_hits cache_miss cycles total_time"
2009-06-23 12:45:15 +02:00
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
2009-07-28 01:16:11 +02:00
echo -ne "argTypeProd\t\t" >> bench_$bench-prod_$prod-metrique_$metrique.dat
for com in $barriereList
do
2009-07-28 01:16:11 +02:00
echo -ne "\t$com" >> bench_$bench-prod_$prod-metrique_$metrique.dat
done
echo >> bench_$bench-prod_$prod-metrique_$metrique.dat
done
2009-07-28 01:16:11 +02:00
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
2009-07-28 01:16:11 +02:00
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
2010-05-15 17:09:41 +02:00
echo "set output 'images/$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
2010-05-15 17:09:41 +02:00
echo "set output 'images/$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"
2009-06-24 00:53:13 +02:00
done
2009-06-23 12:45:15 +02:00
done
done
2009-06-23 12:45:15 +02:00
2010-05-15 17:09:41 +02:00
if [ ! -d images ]
then
mkdir images
fi
for gnuplotFile in *.gnuplot
do
gnuplot "$gnuplotFile"
done
2009-06-23 12:45:15 +02:00
2010-05-15 17:09:41 +02:00
for psFile in images/*.ps
do
ps2pdf $psFile
2009-06-23 12:45:15 +02:00
done