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