1f08c3bdfSopenharmony_ci#!/bin/bash 2f08c3bdfSopenharmony_ci# kernbench by Con Kolivas <kernbench@kolivas.org> 3f08c3bdfSopenharmony_ci# based on a benchmark by Martin J. Bligh 4f08c3bdfSopenharmony_citrap 'echo "ABORTING";exit' 1 2 15 5f08c3bdfSopenharmony_ci 6f08c3bdfSopenharmony_ciVERSION=0.42 7f08c3bdfSopenharmony_ci 8f08c3bdfSopenharmony_cinum_runs=5 9f08c3bdfSopenharmony_cisingle_runs=0 10f08c3bdfSopenharmony_cihalf_runs=1 11f08c3bdfSopenharmony_ciopti_runs=1 12f08c3bdfSopenharmony_cimax_runs=1 13f08c3bdfSopenharmony_cifast_run=0 14f08c3bdfSopenharmony_ci 15f08c3bdfSopenharmony_ciwhile getopts vsHOMn:o:hf i 16f08c3bdfSopenharmony_cido 17f08c3bdfSopenharmony_ci case $i in 18f08c3bdfSopenharmony_ci h) echo "kernbench v$VERSION by Con Kolivas <kernbench@kolivas.org>" 19f08c3bdfSopenharmony_ci echo "Usage:" 20f08c3bdfSopenharmony_ci echo "kernbench [-n runs] [-o jobs] [-s] [-H] [-O] [-M] [-h] [-v]" 21f08c3bdfSopenharmony_ci echo "n : number of times to perform benchmark (default 5)" 22f08c3bdfSopenharmony_ci echo "o : number of jobs for optimal run (default 4 * cpu)" 23f08c3bdfSopenharmony_ci echo "s : perform single threaded runs (default don't)" 24f08c3bdfSopenharmony_ci echo "H : don't perform half load runs (default do)" 25f08c3bdfSopenharmony_ci echo "O : don't perform optimal load runs (default do)" 26f08c3bdfSopenharmony_ci echo "M : don't perform maximal load runs (default do)" 27f08c3bdfSopenharmony_ci echo "f : fast run" 28f08c3bdfSopenharmony_ci echo "h : print this help" 29f08c3bdfSopenharmony_ci echo "v : print version number" 30f08c3bdfSopenharmony_ci exit ;; 31f08c3bdfSopenharmony_ci v) echo "kernbench Version $VERSION by Con Kolivas <kernbench@kolivas.org>" ; exit ;; 32f08c3bdfSopenharmony_ci n) nruns=$OPTARG ;; 33f08c3bdfSopenharmony_ci o) optijobs=$OPTARG ;; 34f08c3bdfSopenharmony_ci s) single_runs=1 ;; 35f08c3bdfSopenharmony_ci H) half_runs=0 ;; 36f08c3bdfSopenharmony_ci O) opti_runs=0 ;; 37f08c3bdfSopenharmony_ci M) max_runs=0 ;; 38f08c3bdfSopenharmony_ci f) fast_run=1 ;; 39f08c3bdfSopenharmony_ci esac 40f08c3bdfSopenharmony_cidone 41f08c3bdfSopenharmony_ci 42f08c3bdfSopenharmony_ciif [[ ! -f include/linux/kernel.h ]] ; then 43f08c3bdfSopenharmony_ci echo "No kernel source found; exiting" 44f08c3bdfSopenharmony_ci exit 45f08c3bdfSopenharmony_cifi 46f08c3bdfSopenharmony_ci 47f08c3bdfSopenharmony_cifor i in time awk yes date 48f08c3bdfSopenharmony_cido 49f08c3bdfSopenharmony_ci iname=`which $i` 50f08c3bdfSopenharmony_ci if [[ ! -a $iname ]] ; then 51f08c3bdfSopenharmony_ci echo "$i not found in path, please install it; exiting" 52f08c3bdfSopenharmony_ci exit 53f08c3bdfSopenharmony_ci fi 54f08c3bdfSopenharmony_cidone 55f08c3bdfSopenharmony_ci 56f08c3bdfSopenharmony_citime=`which time` 57f08c3bdfSopenharmony_ci 58f08c3bdfSopenharmony_ciif [[ $nruns -gt 0 ]] ; then 59f08c3bdfSopenharmony_ci num_runs=$nruns 60f08c3bdfSopenharmony_cielif [[ $fast_run -eq 1 ]]; then 61f08c3bdfSopenharmony_ci echo "Dropping to 3 runs for fast run" 62f08c3bdfSopenharmony_ci num_runs=3 63f08c3bdfSopenharmony_cifi 64f08c3bdfSopenharmony_ci 65f08c3bdfSopenharmony_ciif (($num_runs < 1)) ; then 66f08c3bdfSopenharmony_ci echo "Nothing to do; exiting" 67f08c3bdfSopenharmony_ci exit 68f08c3bdfSopenharmony_cifi 69f08c3bdfSopenharmony_ci 70f08c3bdfSopenharmony_ciif (($num_runs > 10)) ; then 71f08c3bdfSopenharmony_ci echo "Are you crazy? trimming number of runs to 10" 72f08c3bdfSopenharmony_ci num_runs=10 73f08c3bdfSopenharmony_cifi 74f08c3bdfSopenharmony_ci 75f08c3bdfSopenharmony_ciif [[ ! -d /proc ]] ; then 76f08c3bdfSopenharmony_ci echo "Can't find proc filesystem; exiting" 77f08c3bdfSopenharmony_ci exit 78f08c3bdfSopenharmony_cifi 79f08c3bdfSopenharmony_ci 80f08c3bdfSopenharmony_cimem=`awk '/MemTotal/ {print $2}' /proc/meminfo` 81f08c3bdfSopenharmony_ciif [[ $mem -lt 4000000 && $max_runs -gt 0 ]] ; then 82f08c3bdfSopenharmony_ci echo Less than 4Gb ram detected! 83f08c3bdfSopenharmony_ci echo Maximal loads will not measure cpu throughput and may cause a swapstorm! 84f08c3bdfSopenharmony_ci echo If you did not plan this, -M flag is recommended to bypass maximal load. 85f08c3bdfSopenharmony_cifi 86f08c3bdfSopenharmony_ci 87f08c3bdfSopenharmony_ci(( single_runs *= $num_runs )) 88f08c3bdfSopenharmony_ci(( half_runs *= $num_runs )) 89f08c3bdfSopenharmony_ci(( opti_runs *= $num_runs )) 90f08c3bdfSopenharmony_ci(( max_runs *= $num_runs )) 91f08c3bdfSopenharmony_ci 92f08c3bdfSopenharmony_cicpus=`grep -c ^processor /proc/cpuinfo` 93f08c3bdfSopenharmony_ciecho $cpus cpus found 94f08c3bdfSopenharmony_ciecho Cleaning source tree... 95f08c3bdfSopenharmony_cimake clean > /dev/null 2>&1 96f08c3bdfSopenharmony_ci 97f08c3bdfSopenharmony_ciif [[ $fast_run -eq 0 ]] ; then 98f08c3bdfSopenharmony_ci echo Caching kernel source in ram... 99f08c3bdfSopenharmony_ci for i in `find -type f` 100f08c3bdfSopenharmony_ci do 101f08c3bdfSopenharmony_ci cat $i > /dev/null 102f08c3bdfSopenharmony_ci done 103f08c3bdfSopenharmony_cifi 104f08c3bdfSopenharmony_ci 105f08c3bdfSopenharmony_ciif [[ ! -f .config ]] ; then 106f08c3bdfSopenharmony_ci echo No old config found, using defconfig 107f08c3bdfSopenharmony_ci echo Making mrproper 108f08c3bdfSopenharmony_ci make mrproper > /dev/null 2>&1 109f08c3bdfSopenharmony_ci echo Making defconfig... 110f08c3bdfSopenharmony_ci make defconfig > /dev/null 2>&1 111f08c3bdfSopenharmony_cielse 112f08c3bdfSopenharmony_ci echo Making oldconfig... 113f08c3bdfSopenharmony_ci yes "" | make oldconfig > /dev/null 2>&1 114f08c3bdfSopenharmony_cifi 115f08c3bdfSopenharmony_ci 116f08c3bdfSopenharmony_cihalfjobs=$(( $cpus / 2 )) 117f08c3bdfSopenharmony_cioptijobs=${optijobs:=$(( $cpus * 4 ))} 118f08c3bdfSopenharmony_ci 119f08c3bdfSopenharmony_ciif [[ $halfjobs -lt 2 ]] ; then 120f08c3bdfSopenharmony_ci echo "Half load is no greater than single; disabling" 121f08c3bdfSopenharmony_ci half_runs=0 122f08c3bdfSopenharmony_cielif [[ $halfjobs -eq 2 ]] ; then 123f08c3bdfSopenharmony_ci echo "Half load is 2 jobs, changing to 3 as a kernel compile won't guarantee 2 jobs" 124f08c3bdfSopenharmony_ci halfjobs=3 125f08c3bdfSopenharmony_cifi 126f08c3bdfSopenharmony_ci 127f08c3bdfSopenharmony_ciecho Kernel `uname -r` 128f08c3bdfSopenharmony_ciecho Performing $num_runs runs of 129f08c3bdfSopenharmony_ciif [[ $single_runs -gt 0 ]] ; then 130f08c3bdfSopenharmony_ci echo make 131f08c3bdfSopenharmony_cifi 132f08c3bdfSopenharmony_ciif [[ $half_runs -gt 0 ]] ; then 133f08c3bdfSopenharmony_ci echo make -j $halfjobs 134f08c3bdfSopenharmony_cifi 135f08c3bdfSopenharmony_ciif [[ $opti_runs -gt 0 ]] ; then 136f08c3bdfSopenharmony_ci echo make -j $optijobs 137f08c3bdfSopenharmony_cifi 138f08c3bdfSopenharmony_ciif [[ $max_runs -gt 0 ]] ; then 139f08c3bdfSopenharmony_ci echo make -j 140f08c3bdfSopenharmony_cifi 141f08c3bdfSopenharmony_ciecho 142f08c3bdfSopenharmony_ci 143f08c3bdfSopenharmony_ciecho All data logged to kernbench.log 144f08c3bdfSopenharmony_ci 145f08c3bdfSopenharmony_ciif [[ $fast_run -eq 0 ]] ; then 146f08c3bdfSopenharmony_ci echo Warmup run... 147f08c3bdfSopenharmony_ci make -j $optijobs > /dev/null 2>&1 148f08c3bdfSopenharmony_cifi 149f08c3bdfSopenharmony_ci 150f08c3bdfSopenharmony_cidate >> kernbench.log 151f08c3bdfSopenharmony_ciuname -r >> kernbench.log 152f08c3bdfSopenharmony_ci 153f08c3bdfSopenharmony_ciadd_data_point() 154f08c3bdfSopenharmony_ci{ 155f08c3bdfSopenharmony_ci echo $@ | awk '{printf "%.6f %.6f %d", $1 + $2, $1 * $1 + $3, $4 + 1}' 156f08c3bdfSopenharmony_ci} 157f08c3bdfSopenharmony_ci 158f08c3bdfSopenharmony_cishow_statistics() 159f08c3bdfSopenharmony_ci{ 160f08c3bdfSopenharmony_ci case $3 in 161f08c3bdfSopenharmony_ci 0) 162f08c3bdfSopenharmony_ci echo "No data" 163f08c3bdfSopenharmony_ci ;; 164f08c3bdfSopenharmony_ci 1) 165f08c3bdfSopenharmony_ci echo $1 166f08c3bdfSopenharmony_ci ;; 167f08c3bdfSopenharmony_ci *) 168f08c3bdfSopenharmony_ci avg=`echo $1 $3 | awk '{print $1 / $2}'` 169f08c3bdfSopenharmony_ci var=`echo $1 $2 $3 | awk '{print ($2 - ($1 * $1) / $3) / ($3 - 1)}'` 170f08c3bdfSopenharmony_ci sdev=`echo $var | awk '{print $1^0.5}'` 171f08c3bdfSopenharmony_ci echo "$avg ($sdev)" 172f08c3bdfSopenharmony_ci ;; 173f08c3bdfSopenharmony_ci esac 174f08c3bdfSopenharmony_ci} 175f08c3bdfSopenharmony_ci 176f08c3bdfSopenharmony_cido_log() 177f08c3bdfSopenharmony_ci{ 178f08c3bdfSopenharmony_ci echo "Average $runname Run (std deviation):" > templog 179f08c3bdfSopenharmony_ci echo Elapsed Time `show_statistics $temp_elapsed` >> templog 180f08c3bdfSopenharmony_ci echo User Time `show_statistics $temp_user` >> templog 181f08c3bdfSopenharmony_ci echo System Time `show_statistics $temp_sys` >> templog 182f08c3bdfSopenharmony_ci echo Percent CPU `show_statistics $temp_percent` >> templog 183f08c3bdfSopenharmony_ci echo Context Switches `show_statistics $temp_ctx` >> templog 184f08c3bdfSopenharmony_ci echo Sleeps `show_statistics $temp_sleeps` >> templog 185f08c3bdfSopenharmony_ci echo >> templog 186f08c3bdfSopenharmony_ci cat templog 187f08c3bdfSopenharmony_ci cat templog >> kernbench.log 188f08c3bdfSopenharmony_ci} 189f08c3bdfSopenharmony_ci 190f08c3bdfSopenharmony_cido_runs() 191f08c3bdfSopenharmony_ci{ 192f08c3bdfSopenharmony_ci temp_elapsed="a" 193f08c3bdfSopenharmony_ci for (( i=1 ; i <= temp_runs ; i++ )) 194f08c3bdfSopenharmony_ci do 195f08c3bdfSopenharmony_ci echo $runname run number $i... 196f08c3bdfSopenharmony_ci make clean > /dev/null 2>&1 197f08c3bdfSopenharmony_ci sync 198f08c3bdfSopenharmony_ci if [[ $fast_run -eq 0 ]] ; then 199f08c3bdfSopenharmony_ci sleep 5 200f08c3bdfSopenharmony_ci fi 201f08c3bdfSopenharmony_ci $time -f "%e %U %S %P %c %w" -o timelog make -j $tempjobs > /dev/null 2>&1 202f08c3bdfSopenharmony_ci read elapsed_time user_time sys_time percent ctx sleeps <timelog 203f08c3bdfSopenharmony_ci temp_elapsed=`add_data_point $elapsed_time $temp_elapsed` 204f08c3bdfSopenharmony_ci temp_user=`add_data_point $user_time $temp_user` 205f08c3bdfSopenharmony_ci temp_sys=`add_data_point $sys_time $temp_sys` 206f08c3bdfSopenharmony_ci temp_percent=`add_data_point $percent $temp_percent` 207f08c3bdfSopenharmony_ci temp_ctx=`add_data_point $ctx $temp_ctx` 208f08c3bdfSopenharmony_ci temp_sleeps=`add_data_point $sleeps $temp_sleeps` 209f08c3bdfSopenharmony_ci done 210f08c3bdfSopenharmony_ci if [[ $temp_runs -ne 0 ]] ; then 211f08c3bdfSopenharmony_ci do_log 212f08c3bdfSopenharmony_ci fi 213f08c3bdfSopenharmony_ci} 214f08c3bdfSopenharmony_ci 215f08c3bdfSopenharmony_citemp_runs=$single_runs 216f08c3bdfSopenharmony_citempjobs=1 217f08c3bdfSopenharmony_cirunname="Single threaded" 218f08c3bdfSopenharmony_cido_runs 219f08c3bdfSopenharmony_ci 220f08c3bdfSopenharmony_citemp_runs=$half_runs 221f08c3bdfSopenharmony_citempjobs=$halfjobs 222f08c3bdfSopenharmony_cirunname="Half load -j $halfjobs" 223f08c3bdfSopenharmony_cido_runs 224f08c3bdfSopenharmony_ci 225f08c3bdfSopenharmony_citemp_runs=$opti_runs 226f08c3bdfSopenharmony_citempjobs=$optijobs 227f08c3bdfSopenharmony_cirunname="Optimal load -j $optijobs" 228f08c3bdfSopenharmony_cido_runs 229f08c3bdfSopenharmony_ci 230f08c3bdfSopenharmony_citemp_runs=$max_runs 231f08c3bdfSopenharmony_citempjobs="" 232f08c3bdfSopenharmony_cirunname="Maximal load -j" 233f08c3bdfSopenharmony_cido_runs 234