run.sh 4.0 KB

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