xref: /aosp_15_r20/external/eigen/bench/perf_monitoring/run.sh (revision bf2c37156dfe67e5dfebd6d394bad8b2ab5804d4)
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