Home | History | Annotate | Download | only in gemm
      1 #!/bin/bash
      2 
      3 # ./run.sh gemm
      4 # ./run.sh lazy_gemm
      5 
      6 # Examples of environment variables to be set:
      7 #   PREFIX="haswell-fma-"
      8 #   CXX_FLAGS="-mfma"
      9 
     10 # Options:
     11 #   -up : enforce the recomputation of existing data, and keep best results as a merging strategy
     12 #   -s  : recompute selected changesets only and keep bests
     13 
     14 bench=$1
     15 
     16 if echo "$*" | grep '\-up' > /dev/null; then
     17   update=true
     18 else
     19   update=false
     20 fi
     21 
     22 if echo "$*" | grep '\-s' > /dev/null; then
     23   selected=true
     24 else
     25   selected=false
     26 fi
     27 
     28 global_args="$*"
     29 
     30 if [ $selected == true ]; then
     31  echo "Recompute selected changesets only and keep bests"
     32 elif [ $update == true ]; then
     33  echo "(Re-)Compute all changesets and keep bests"
     34 else
     35  echo "Skip previously computed changesets"
     36 fi
     37 
     38 
     39 
     40 if [ ! -d "eigen_src" ]; then
     41   hg clone https://bitbucket.org/eigen/eigen eigen_src
     42 else
     43   cd eigen_src
     44   hg pull -u
     45   cd ..
     46 fi
     47 
     48 if [ ! -z '$CXX' ]; then
     49   CXX=g++
     50 fi
     51 
     52 function make_backup
     53 {
     54   if [ -f "$1.out" ]; then
     55     mv "$1.out" "$1.backup"
     56   fi
     57 }
     58 
     59 function merge
     60 {
     61   count1=`echo $1 |  wc -w`
     62   count2=`echo $2 |  wc -w`
     63   
     64   if [ $count1 == $count2 ]; then
     65     a=( $1 ); b=( $2 )
     66     res=""
     67     for (( i=0 ; i<$count1 ; i++ )); do
     68       ai=${a[$i]}; bi=${b[$i]}
     69       tmp=`echo "if ($ai > $bi) $ai else $bi " | bc -l`
     70       res="$res $tmp"
     71     done
     72     echo $res
     73 
     74   else
     75     echo $1
     76   fi
     77 }
     78 
     79 function test_current 
     80 {
     81   rev=$1
     82   scalar=$2
     83   name=$3
     84   
     85   prev=""
     86   if [ -e "$name.backup" ]; then
     87     prev=`grep $rev "$name.backup" | cut -c 14-`
     88   fi
     89   res=$prev
     90   count_rev=`echo $prev |  wc -w`
     91   count_ref=`cat $bench"_settings.txt" |  wc -l`
     92   if echo "$global_args" | grep "$rev" > /dev/null; then
     93     rev_found=true
     94   else
     95     rev_found=false
     96   fi
     97 #  echo $update et $selected et $rev_found because $rev et "$global_args"
     98 #  echo $count_rev et $count_ref
     99   if [ $update == true ] || [ $count_rev != $count_ref ] || ([ $selected == true ] &&  [ $rev_found == true ]); then
    100     if $CXX -O2 -DNDEBUG -march=native $CXX_FLAGS -I eigen_src $bench.cpp -DSCALAR=$scalar -o $name; then
    101       curr=`./$name`
    102       if [ $count_rev == $count_ref ]; then
    103         echo "merge previous $prev"
    104         echo "with new       $curr"
    105       else
    106         echo "got            $curr"
    107       fi
    108       res=`merge "$curr" "$prev"`
    109 #       echo $res
    110       echo "$rev $res" >> $name.out
    111     else
    112       echo "Compilation failed, skip rev $rev"
    113     fi
    114   else
    115     echo "Skip existing results for $rev / $name"
    116     echo "$rev $res" >> $name.out
    117   fi
    118 }
    119 
    120 make_backup $PREFIX"s"$bench
    121 make_backup $PREFIX"d"$bench
    122 make_backup $PREFIX"c"$bench
    123 
    124 cut -f1 -d"#" < changesets.txt | grep -E '[[:alnum:]]' | while read rev
    125 do
    126   if [ ! -z '$rev' ]; then
    127     echo "Testing rev $rev"
    128     cd eigen_src
    129     hg up -C $rev > /dev/null
    130     actual_rev=`hg identify | cut -f1 -d' '`
    131     cd ..
    132     
    133     test_current $actual_rev float                  $PREFIX"s"$bench
    134     test_current $actual_rev double                 $PREFIX"d"$bench
    135     test_current $actual_rev "std::complex<double>" $PREFIX"c"$bench
    136   fi
    137   
    138 done
    139 
    140 echo "Float:"
    141 cat $PREFIX"s""$bench.out"
    142 echo " "
    143 
    144 echo "Double:"
    145 cat $PREFIX"d""$bench.out"
    146 echo ""
    147 
    148 echo "Complex:"
    149 cat $PREFIX"c""$bench.out"
    150 echo ""
    151 
    152 ./make_plot.sh $PREFIX"s"$bench $bench
    153 ./make_plot.sh $PREFIX"d"$bench $bench
    154 ./make_plot.sh $PREFIX"c"$bench $bench
    155 
    156 
    157