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