2010-05-17 17:34:26 +02:00
#!/bin/sh
2013-04-22 18:30:08 +02:00
#
# Copyright (C) 2009-2012 Thomas Preud'homme <thomas.preud-homme@lip6.fr>
#
# Permission is hereby granted, free of charge, to any person obtaining a copy
# of this software and associated documentation files (the "Software"), to deal
# in the Software without restriction, including without limitation the rights
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
# copies of the Software, and to permit persons to whom the Software is
# furnished to do so, subject to the following conditions:
#
# The above copyright notice and this permission notice shall be included in
# all copies or substantial portions of the Software.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
# SOFTWARE.
2009-06-23 12:45:15 +02:00
set -u
2010-05-18 09:34:25 +02:00
init_bench_vars ( )
{
2010-09-22 18:15:57 +02:00
local ourBenchs onlyWBBenchs comList com -
2010-05-18 09:34:25 +02:00
2011-03-02 12:11:22 +01:00
ourBenchs = "batch_queue"
2010-09-22 18:15:57 +02:00
onlyWBBenchs = "jikes_barrier"
comList = ` ls *.log | perl -ni -e '/-([^-]+)_comm/; $a{$1}=""; END { foreach ( sort keys %a ) {print "$_ "}}' `
if [ -z " ${ barriereList :- } " ]
then
for com in $comList
do
2012-03-26 13:20:18 +02:00
if echo $com | grep " $ourBenchs " > /dev/null 2>& 1
2010-09-22 18:15:57 +02:00
then
barriereList = " ${ barriereList :- } ${ barriereList : + } $com "
fi
2012-03-26 13:20:18 +02:00
if echo $com | grep " $onlyWBBenchs " > /dev/null 2>& 1
2010-09-22 18:15:57 +02:00
then
barriereList = " ${ barriereList :- } ${ barriereList : + } $com "
fi
done
fi
if [ -z " ${ communicationList :- } " ]
then
for com in $comList
do
if echo $onlyWBBenchs | grep -v " $com " > /dev/null 2>& 1
then
communicationList = " ${ communicationList :- } ${ communicationList : + } $com "
fi
done
fi
2010-05-18 09:34:25 +02:00
}
2009-06-23 12:45:15 +02:00
2010-05-18 09:34:25 +02:00
init_log_vars ( )
{
local firstBarriereComm -
2011-02-24 20:58:37 +01:00
cacheList = ` ls *log | perl -ni -e '/cache_([^-]+)-/; $a{$1}=""; END { foreach ( sort keys %a ) {print "$_ "}}' | sed -r "s/ +\$//" `
2010-05-18 09:34:25 +02:00
prodList = ` ls *.log | perl -ni -e '/typeProd_([^-]+)-/; $a{$1}=""; END { foreach ( sort keys %a ) {print "$_ "}}' `
metriqueList = "cache_hits cache_miss cycles total_time"
2010-09-22 18:15:57 +02:00
nbIter = ` ls -1 *.log | head -1 | sed -r " s/^.*nbIter_([[:digit:]]+).* $/\1/ " `
2012-03-26 16:04:31 +02:00
valuePerCacheLine = $( grep "^buf size: " *.log | head -1 | sed -r " s/^.*:buf size: ([[:digit:]]+)[^[:digit:]+] $/\1/ " )
2010-05-18 09:34:25 +02:00
}
parse_args ( )
{
local opt optNum -
2010-08-12 05:11:46 +02:00
logDir = $( pwd )
optNum = 0
while [ $# -gt $optNum ]
do
optNum = $(( optNum + 1 ))
eval opt = \$ $optNum
case $opt in
"-e" )
if [ $# -gt $optNum ]
then
optNum = $(( optNum + 1 ))
eval opt = \$ $optNum
eval " $opt "
else
echo "Missing argument after \"-e\""
return 1
fi ; ;
*)
logDir = " $opt " ; ;
esac
done
2010-05-18 09:34:25 +02:00
return 0
}
2009-06-23 12:45:15 +02:00
2010-02-25 17:21:45 +01:00
use_histo ( )
{
2010-05-17 17:34:26 +02:00
local prod bench -
2010-02-25 17:21:45 +01:00
prod = " $1 "
bench = " $2 "
2012-03-26 16:07:50 +02:00
[ " $prod " != "useless_loop" -a " $prod " != "line" ]
2010-02-25 17:21:45 +01:00
return $?
}
2010-05-15 22:32:35 +02:00
contains_zero( )
{
2010-05-17 17:34:26 +02:00
local prod bench datFile lineNum commTechs nbCommTechs nbArg iMin iMax -
2010-05-15 22:32:35 +02:00
prod = " $1 "
bench = " $2 "
datFile = " $3 "
lineNum = " $4 "
2012-03-26 16:04:31 +02:00
numCacheConfigs = " $5 "
2010-05-15 22:32:35 +02:00
if use_histo " $prod " " $bench "
then
eval commTechs = \$ ${ bench } List
# Count the number of spaces in the list + the line feed
nbCommTechs = $( echo $commTechs | sed -r "s/[^ ]//g" | wc -c)
iMin = $(( lineNum + 4 ))
iMax = $(( lineNum + 1 + nbCommTechs * 3 ))
for i in $( seq $iMin 3 $iMax )
do
2010-10-14 00:01:32 +02:00
if head -$i $datFile | tail -1 | grep -E " \.0+([^[:digit:]])? $" > /dev/null
2010-05-15 22:32:35 +02:00
then
return 0
fi
done
else
2012-03-26 16:04:31 +02:00
iMin = $(( lineNum + numCacheConfigs * 4 + 1 ))
2012-03-26 16:07:50 +02:00
# Number of lines in the file
nbArg = $( wc -l $datFile | cut -d ' ' -f 1)
nbArg = $(( nbArg + 1 )) # Last line doesn't contain a newline
nbArg = $(( nbArg - 4 * numCacheConfigs + 1 ))
nbArg = $(( nbArg / numCacheConfigs / 4 ))
2012-03-26 16:04:31 +02:00
iMax = $(( iMin + nbArg * numCacheConfigs * 4 - 4 ))
2010-05-15 22:32:35 +02:00
for i in $( seq $iMin 4 $iMax )
do
2010-10-14 00:01:32 +02:00
if head -$i $datFile | tail -1 | grep -E " \.0+([^[:digit:]])? $" > /dev/null
2010-05-15 22:32:35 +02:00
then
return 0
fi
done
fi
return 1
}
2010-02-25 17:21:45 +01:00
create_dat_header ( )
{
2011-02-24 20:58:37 +01:00
local prod bench metrique numCacheConfigs -
2010-02-25 17:21:45 +01:00
prod = " $1 "
bench = " $2 "
metrique = " $3 "
2011-02-24 20:58:37 +01:00
numCacheConfigs = " $4 "
2010-02-25 17:21:45 +01:00
# 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
2010-05-17 17:34:26 +02:00
echo -n "Method\t\t" >> bench_$bench -prod_$prod -metrique_$metrique .dat
2010-02-25 17:21:45 +01:00
for cache in $cacheList
do
2010-05-17 17:34:26 +02:00
echo -n " \t $cache " >> bench_$bench -prod_$prod -metrique_$metrique .dat
2010-02-25 17:21:45 +01:00
done
done
# Several points per com and cache (one per calc argument)
else
2011-02-24 20:58:37 +01:00
for i in $( seq " $numCacheConfigs " )
2010-02-25 17:21:45 +01:00
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
2010-05-17 17:34:26 +02:00
echo -n "argTypeProd\t\t" >> bench_$bench -prod_$prod -metrique_$metrique .dat
2012-03-26 16:04:31 +02:00
for com in ` eval echo \\ \$ \$ { bench} List`
2010-02-25 17:21:45 +01:00
do
2010-05-17 17:34:26 +02:00
echo -n " \t $com " >> bench_$bench -prod_$prod -metrique_$metrique .dat
2009-06-24 20:14:50 +02:00
done
2010-02-25 17:21:45 +01:00
echo >> bench_$bench -prod_$prod -metrique_$metrique .dat
done
2009-07-28 01:16:11 +02:00
done
2010-02-25 17:21:45 +01:00
fi
}
get_metric_values ( )
{
2010-09-22 18:15:57 +02:00
local prod com cache argTypeProd logFile metricValues totalValue metricValue loopValue stepValue -
2010-02-25 17:21:45 +01:00
prod = " $1 "
com = " $2 "
cache = " $3 "
argTypeProd = " $4 "
metriquePattern = " $5 "
logFile = cache_$cache -*-typeProd_$prod -argTypeProd_$argTypeProd -*-${ com } _comm.log
2012-02-21 18:02:40 +01:00
metricValues = $( grep -E " $metriquePattern " $logFile | sed -r " s/^ *( $metriquePattern ).* $/\1/;s/^ *([[:digit:]., ]+).* $/\1/;s/[,.]/./ " | tr -d ' ' )
2010-09-22 18:15:57 +02:00
totalValue = 0
for metricValue in $metricValues
do
totalValue = $( echo " $totalValue + $metricValue " | bc)
done
echo -n " $totalValue "
loopValue = " $( echo " $totalValue / $nbIter " | bc -l) "
echo -n " $loopValue "
stepValue = $( echo " $totalValue / $nbIter / $valuePerCacheLine " | bc -l)
echo -n " $stepValue "
2010-02-25 17:21:45 +01:00
}
create_simple_dat_body ( )
{
2010-05-17 17:34:26 +02:00
local prod bench metrique argTypeProd -
2010-02-25 17:21:45 +01:00
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
2010-05-17 17:34:26 +02:00
echo -n " \n $com \t\t " >> bench_$bench -prod_$prod -metrique_$metrique .dat
2010-02-25 17:21:45 +01:00
for cache in $cacheList
do
if [ $i -eq 1 ]
then
valuetmp = ` get_metric_values " $prod " " $com " " $cache " " $argTypeProd " " $metriquePattern " `
eval value$cache = \" $valuetmp \"
fi
2010-05-17 17:34:26 +02:00
eval echo -n " \${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
2010-02-25 17:21:45 +01:00
done
done
}
create_complex_dat_body ( )
{
2012-03-26 16:07:50 +02:00
local prod bench metrique firstComm argTypeProdList argTypeProd -
2010-02-25 17:21:45 +01:00
prod = " $1 "
bench = " $2 "
metrique = " $3 "
2012-03-26 16:07:50 +02:00
metriquePattern = " $4 "
firstComm = $( ls -1 *typeProd_$prod *.log | head -1 | sed -r " s/^.*nbIter_[^-]+-([^.]+)\.log $/\1/ " )
argTypeProdList = ` eval ls *typeProd_$prod *${ firstComm } .log | perl -ni -e '/argTypeProd_([\d]+)-/; $a{$1}=""; END { foreach ( sort { $a <=> $b } keys %a ) {print "$_ "}}' `
2010-02-25 17:21:45 +01:00
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
2010-05-17 17:34:26 +02:00
echo -n " \n $argTypeProd \t\t " >> bench_$bench -prod_$prod -metrique_$metrique .dat
2010-02-25 17:21:45 +01:00
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
2010-05-17 17:34:26 +02:00
eval echo -n " \${value $com } " | sed -r " s/^([^ ]+ ){ $(( i-1)) }([^ ]+).*/\t\2/ " >> bench_$bench -prod_$prod -metrique_$metrique .dat
2009-06-24 20:14:50 +02:00
done
done
2010-02-25 17:21:45 +01:00
done
done
}
create_dat_body ( )
{
2010-05-17 17:34:26 +02:00
local prod bench metrique argTypeProd -
2010-02-25 17:21:45 +01:00
prod = " $1 "
bench = " $2 "
metrique = " $3 "
argTypeProd = " $4 "
if use_histo " $prod " " $bench "
then
create_simple_dat_body " $prod " " $bench " " $metrique " " $argTypeProd " " $metriquePattern "
else
2012-03-26 16:07:50 +02:00
create_complex_dat_body " $prod " " $bench " " $metrique " " $metriquePattern "
2010-02-25 17:21:45 +01:00
fi
}
create_gnuplot_header ( )
{
2010-05-17 17:34:26 +02:00
local prod bench gnuplotFile -
2010-02-25 17:21:45 +01:00
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
2010-05-15 16:38:42 +02:00
echo "set key autotitle columnhead" >> $gnuplotFile
2010-02-25 17:21:45 +01:00
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 ( )
{
2011-03-02 12:44:00 +01:00
local metrique ylabel yscale patternPlotFile datFile numCacheConfigs i -
2010-02-25 17:21:45 +01:00
ylabel = " $1 "
lineNum = " $2 "
datFile = " $3 "
patternPlotFile = " $4 "
2011-02-24 20:58:37 +01:00
numCacheConfigs = " $5 "
2010-02-25 17:21:45 +01:00
echo " set ylabel \" $ylabel \" " >> $patternPlotFile .gnuplot
2010-05-15 17:09:41 +02:00
echo " set output 'images/ $patternPlotFile .ps' " >> $patternPlotFile .gnuplot
2011-02-24 20:58:37 +01:00
echo -n " plot ' $datFile ' every 3:: $lineNum using 2:xtic(1) " >> $patternPlotFile .gnuplot
2011-03-02 12:44:00 +01:00
if [ $numCacheConfigs -ge 2 ]
2011-02-24 20:58:37 +01:00
then
2011-03-02 12:44:00 +01:00
i = 2
while [ $i -le $numCacheConfigs ]
do
echo -n " , '' every 3:: $lineNum u $(( i+1)) " >> $patternPlotFile .gnuplot
i = $(( i+1))
done
2011-02-24 20:58:37 +01:00
fi
2012-02-21 18:02:17 +01:00
echo "" >> $patternPlotFile .gnuplot
2010-02-25 17:21:45 +01:00
}
create_complex_gnuplot_body ( )
{
2011-02-24 20:58:37 +01:00
local bench ylabel lineNum datFile patternPlotFile columnNo baseTitle numCacheConfigs -
2010-02-25 17:21:45 +01:00
bench = " $1 "
ylabel = " $2 "
lineNum = " $3 "
datFile = " $4 "
patternPlotFile = " $5 "
2011-02-24 20:58:37 +01:00
numCacheConfigs = " $6 "
2010-02-25 17:21:45 +01:00
columnNo = 2
echo " set ylabel \" $ylabel \" " >> $patternPlotFile .gnuplot
2010-05-15 17:09:41 +02:00
echo " set output 'images/ $patternPlotFile .ps' " >> $patternPlotFile .gnuplot
2010-02-25 17:21:45 +01:00
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
2010-02-23 11:35:25 +01:00
else
2010-02-25 17:21:45 +01:00
echo -n " plot ' $datFile ' " >> $patternPlotFile .gnuplot
2010-02-23 11:35:25 +01:00
fi
2012-03-26 16:04:31 +02:00
echo -n " every : $numCacheConfigs : $lineNum : $(( numCacheConfigs)) : $lineNum using 1: $columnNo :xtic(1) title ' $baseTitle (L2)' " >> $patternPlotFile .gnuplot
2011-02-24 20:58:37 +01:00
if [ $numCacheConfigs -gt 2 ]
then
2012-03-26 16:04:31 +02:00
echo -n " , '' every : $numCacheConfigs : $lineNum : $(( numCacheConfigs * 2 )) : $lineNum using 1: $columnNo :xtic(1) title ' $baseTitle (mem)' " >> $patternPlotFile .gnuplot
2011-02-24 20:58:37 +01:00
fi
2010-02-25 17:21:45 +01:00
columnNo = $(( columnNo + 1 ))
done
echo >> $patternPlotFile .gnuplot
}
create_gnuplot_body ( )
{
2011-02-24 20:58:37 +01:00
local prod bench yscale ylabel lineNum datFile patternPlotFile numCacheConfigs -
2010-02-25 17:21:45 +01:00
prod = " $1 "
bench = " $2 "
yscale = " $3 "
ylabel = " $4 "
lineNum = " $5 "
datFile = " $6 "
patternPlotFile = " $7 "
2011-02-24 20:58:37 +01:00
numCacheConfigs = " $8 "
2010-02-25 17:21:45 +01:00
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
2011-02-24 20:58:37 +01:00
create_simple_gnuplot_body " $ylabel " " $lineNum " " $datFile " " $patternPlotFile " " $numCacheConfigs "
2010-02-25 17:21:45 +01:00
else
2011-02-24 20:58:37 +01:00
create_complex_gnuplot_body " $bench " " $ylabel " " $lineNum " " $datFile " " $patternPlotFile " " $numCacheConfigs "
2010-02-25 17:21:45 +01:00
fi
}
create_gnuplot_file ( )
{
2011-02-24 20:58:37 +01:00
local prod bench metrique ylabel yscale avg lineNum numCacheConfigs -
2010-02-25 17:21:45 +01:00
prod = " $1 "
bench = " $2 "
metrique = " $3 "
baseYlabel = " $4 "
2011-02-24 20:58:37 +01:00
numCacheConfigs = " $5 "
2010-02-25 17:21:45 +01:00
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
2012-03-26 16:04:31 +02:00
if [ $yscale != "logscale" ] || ! contains_zero " $prod " " $bench " " $datFile " " $lineNum " " $numCacheConfigs "
2010-02-25 17:21:45 +01:00
then
2010-05-15 19:46:08 +02:00
create_gnuplot_header " $prod " " $bench " " $patternPlotFile .gnuplot "
2011-02-24 20:58:37 +01:00
create_gnuplot_body " $prod " " $bench " " $yscale " " $ylabel " " $lineNum " " $datFile " " $patternPlotFile " " $numCacheConfigs "
2010-02-25 17:21:45 +01:00
fi
done
done
}
2010-05-15 19:56:26 +02:00
main( )
{
2011-05-04 15:27:35 +02:00
local logDir benchName -
2010-05-17 17:34:26 +02:00
2010-05-18 09:34:25 +02:00
parse_args " $@ "
cd $logDir
2010-09-22 18:15:57 +02:00
init_bench_vars
2010-05-18 09:34:25 +02:00
init_log_vars
2010-05-17 17:35:35 +02:00
2010-05-15 19:56:26 +02:00
for prod in $prodList ; do
case " $prod " in
2012-03-26 16:04:31 +02:00
matrice) argTypeProd = \* ; ;
*) argTypeProd = \* ; ;
2010-05-15 19:56:26 +02:00
esac
for bench in "communication" "barriere" ; do
2011-05-04 15:27:35 +02:00
eval benchName = " \${ ${ bench } List:-} "
if [ -n " ${ benchName } " ]
then
# Create dat headers
for metrique in $metriqueList ; do
case " $metrique " in
cache_hits)
2012-02-21 18:02:40 +01:00
metriquePattern = "[[:digit:] ]+(L1-dcache-loads|L1-dcache-stores|L1-dcache-prefetches|LLC-loads|LLC-stores|LLC-prefetches) "
2011-05-04 15:27:35 +02:00
ylabel = "Nb cache hit" ; ;
cache_miss)
2012-02-21 18:02:40 +01:00
metriquePattern = "[[:digit:] ]+(L1-dcache-load-misses|L1-dcache-store-misses|L1-dcache-prefetch-misses|LLC-load-misses|LLC-store-misses|LLC-prefetch-misses) "
2011-05-04 15:27:35 +02:00
ylabel = "Nb cache miss" ; ;
cycles)
2012-02-21 18:02:40 +01:00
metriquePattern = "[[:digit:] ]+cycles "
2011-05-04 15:27:35 +02:00
ylabel = "Nb cycles" ; ;
total_time)
2012-02-21 18:02:40 +01:00
metriquePattern = "[[:digit:]., ]+seconds time elapsed "
2011-05-04 15:27:35 +02:00
ylabel = "Secondes" ; ;
*)
echo " Pas de pattern pour cette métrique : $metrique "
echo " Pas de label pour cette métrique : $metrique "
exit 1 ; ;
esac
numCacheConfigs = $( echo " $cacheList " | wc -w)
create_dat_header " $prod " " $bench " " $metrique " " $numCacheConfigs "
create_dat_body " $prod " " $bench " " $metrique " " $argTypeProd " " $metriquePattern "
create_gnuplot_file " $prod " " $bench " " $metrique " " $ylabel " " $numCacheConfigs "
done
fi
2009-06-24 00:53:13 +02:00
done
2009-06-23 12:45:15 +02:00
done
2010-05-15 19:56:26 +02:00
if [ ! -d images ]
then
mkdir images
fi
2010-05-15 17:09:41 +02:00
2010-05-15 19:56:26 +02:00
for gnuplotFile in *.gnuplot
do
gnuplot " $gnuplotFile "
done
cd images
2009-06-23 12:45:15 +02:00
2010-05-15 19:56:26 +02:00
for psFile in *.ps
do
ps2pdf $psFile
done
}
2010-05-15 19:57:38 +02:00
2010-05-17 17:35:35 +02:00
main " $@ "