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 19bench=$1 20settings_file=$2 21 22if [[ "$*" =~ '-up' ]]; then 23 update=true 24else 25 update=false 26fi 27 28if [[ "$*" =~ '-s' ]]; then 29 selected=true 30else 31 selected=false 32fi 33 34if [[ "$*" =~ '-np' ]]; then 35 do_plot=false 36else 37 do_plot=true 38fi 39 40 41WORKING_DIR=${PREFIX:?"default"} 42 43if [ -z "$PREFIX" ]; then 44 WORKING_DIR_PREFIX="$WORKING_DIR/" 45else 46 WORKING_DIR_PREFIX="$WORKING_DIR/$PREFIX-" 47fi 48echo "WORKING_DIR_PREFIX=$WORKING_DIR_PREFIX" 49mkdir -p $WORKING_DIR 50 51global_args="$*" 52 53if $selected ; then 54 echo "Recompute selected changesets only and keep bests" 55elif $update ; then 56 echo "(Re-)Compute all changesets and keep bests" 57else 58 echo "Skip previously computed changesets" 59fi 60 61 62 63if [ ! -d "eigen_src" ]; then 64 git clone https://gitlab.com/libeigen/eigen.git eigen_src 65else 66 cd eigen_src 67 git pull 68 cd .. 69fi 70 71if [ -z "$CXX" ]; then 72 CXX=g++ 73fi 74 75function make_backup 76{ 77 if [ -f "$1.out" ]; then 78 mv "$1.out" "$1.backup" 79 fi 80} 81 82function 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 102function 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 144make_backup $WORKING_DIR_PREFIX"s"$bench 145make_backup $WORKING_DIR_PREFIX"d"$bench 146make_backup $WORKING_DIR_PREFIX"c"$bench 147 148cut -f1 -d"#" < changesets.txt | grep -E '[[:alnum:]]' | while read rev 149do 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 163done 164 165echo "Float:" 166cat $WORKING_DIR_PREFIX"s""$bench.out" 167echo " " 168 169echo "Double:" 170cat $WORKING_DIR_PREFIX"d""$bench.out" 171echo "" 172 173echo "Complex:" 174cat $WORKING_DIR_PREFIX"c""$bench.out" 175echo "" 176 177if $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 183fi 184