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