123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183 |
- #!/bin/bash
- # ./run.sh gemm gemm_settings.txt
- # ./run.sh lazy_gemm lazy_gemm_settings.txt
- # ./run.sh gemv gemv_settings.txt
- # ./run.sh trmv_up gemv_square_settings.txt
- # ...
- # Examples of environment variables to be set:
- # PREFIX="haswell-fma-"
- # CXX_FLAGS="-mfma"
- # CXX=clang++
- # Options:
- # -up : enforce the recomputation of existing data, and keep best results as a merging strategy
- # -s : recompute selected changesets only and keep bests
- # -np : no plotting of results, just generate the data
- bench=$1
- settings_file=$2
- if [[ "$*" =~ '-up' ]]; then
- update=true
- else
- update=false
- fi
- if [[ "$*" =~ '-s' ]]; then
- selected=true
- else
- selected=false
- fi
- if [[ "$*" =~ '-np' ]]; then
- do_plot=false
- else
- do_plot=true
- fi
- WORKING_DIR=${PREFIX:?"default"}
- if [ -z "$PREFIX" ]; then
- WORKING_DIR_PREFIX="$WORKING_DIR/"
- else
- WORKING_DIR_PREFIX="$WORKING_DIR/$PREFIX-"
- fi
- echo "WORKING_DIR_PREFIX=$WORKING_DIR_PREFIX"
- mkdir -p $WORKING_DIR
- global_args="$*"
- if $selected ; then
- echo "Recompute selected changesets only and keep bests"
- elif $update ; then
- echo "(Re-)Compute all changesets and keep bests"
- else
- echo "Skip previously computed changesets"
- fi
- if [ ! -d "eigen_src" ]; then
- git clone https://gitlab.com/libeigen/eigen.git eigen_src
- else
- cd eigen_src
- git pull
- cd ..
- fi
- if [ -z "$CXX" ]; then
- CXX=g++
- fi
- function make_backup
- {
- if [ -f "$1.out" ]; then
- mv "$1.out" "$1.backup"
- fi
- }
- function merge
- {
- count1=`echo $1 | wc -w`
- count2=`echo $2 | wc -w`
-
- if [ $count1 == $count2 ]; then
- a=( $1 ); b=( $2 )
- res=""
- for (( i=0 ; i<$count1 ; i++ )); do
- ai=${a[$i]}; bi=${b[$i]}
- tmp=`echo "if ($ai > $bi) $ai else $bi " | bc -l`
- res="$res $tmp"
- done
- echo $res
- else
- echo $1
- fi
- }
- function test_current
- {
- rev=$1
- scalar=$2
- name=$3
-
- prev=""
- if [ -e "$name.backup" ]; then
- prev=`grep $rev "$name.backup" | cut -d ' ' -f 2-`
- fi
- res=$prev
- count_rev=`echo $prev | wc -w`
- count_ref=`cat $settings_file | wc -l`
- if echo "$global_args" | grep "$rev" > /dev/null; then
- rev_found=true
- else
- rev_found=false
- fi
- # echo $update et $selected et $rev_found because $rev et "$global_args"
- # echo $count_rev et $count_ref
- if $update || [ $count_rev != $count_ref ] || ( $selected && $rev_found ); then
- echo "RUN: $CXX -O3 -DNDEBUG -march=native $CXX_FLAGS -I eigen_src $bench.cpp -DSCALAR=$scalar -o $name"
- if $CXX -O3 -DNDEBUG -march=native $CXX_FLAGS -I eigen_src $bench.cpp -DSCALAR=$scalar -o $name; then
- curr=`./$name $settings_file`
- if [ $count_rev == $count_ref ]; then
- echo "merge previous $prev"
- echo "with new $curr"
- else
- echo "got $curr"
- fi
- res=`merge "$curr" "$prev"`
- # echo $res
- echo "$rev $res" >> $name.out
- else
- echo "Compilation failed, skip rev $rev"
- fi
- else
- echo "Skip existing results for $rev / $name"
- echo "$rev $res" >> $name.out
- fi
- }
- make_backup $WORKING_DIR_PREFIX"s"$bench
- make_backup $WORKING_DIR_PREFIX"d"$bench
- make_backup $WORKING_DIR_PREFIX"c"$bench
- cut -f1 -d"#" < changesets.txt | grep -E '[[:alnum:]]' | while read rev
- do
- if [ ! -z '$rev' ]; then
- rev2=`echo $rev | cut -f 2 -d':'`
- echo "Testing rev $rev, $rev2"
- cd eigen_src
- git checkout $rev2 > /dev/null
- actual_rev=`git rev-parse --short HEAD`
- cd ..
-
- test_current $actual_rev float $WORKING_DIR_PREFIX"s"$bench
- test_current $actual_rev double $WORKING_DIR_PREFIX"d"$bench
- test_current $actual_rev "std::complex<double>" $WORKING_DIR_PREFIX"c"$bench
- fi
-
- done
- echo "Float:"
- cat $WORKING_DIR_PREFIX"s""$bench.out"
- echo " "
- echo "Double:"
- cat $WORKING_DIR_PREFIX"d""$bench.out"
- echo ""
- echo "Complex:"
- cat $WORKING_DIR_PREFIX"c""$bench.out"
- echo ""
- if $do_plot ; then
- ./make_plot.sh $WORKING_DIR_PREFIX"s"$bench $bench $settings_file
- ./make_plot.sh $WORKING_DIR_PREFIX"d"$bench $bench $settings_file
- ./make_plot.sh $WORKING_DIR_PREFIX"c"$bench $bench $settings_file
- fi
|