|  | #!/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 |