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