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