cart-elc

Source code for CART-ELC
git clone git://git.laack.co/cart-elc.git
Log | Files | Refs | README | LICENSE

run.sh (4090B)


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