blob: 7e2ea1264d52d3cac44bf1fc0901c54d4783f0e1 [file] [log] [blame]
Austin Schuhc55b0172022-02-20 17:52:35 -08001#!/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