Home | History | Annotate | Download | only in workloads
      1 # print summary of output generated by pwrtest.sh
      2 #
      3 # default results directories are <device>-<date>[-experiment]. By default
      4 # match any device and the year 201*.
      5 #
      6 # Examples:
      7 #
      8 # - show output for all bullhead tests in july 2015:
      9 #    ./pwrsummary.sh -r "bh-201507*"
     10 #
     11 # - generate CSV file for import into spreadsheet:
     12 #    ./pwrsummary.sh -o csv
     13 #
     14 
     15 CMDDIR=$(dirname $0 2>/dev/null)
     16 CMDDIR=${CMDDIR:=.}
     17 cd $CMDDIR
     18 CMDDIR=$(pwd)
     19 cd -
     20 POWERAVE="python $CMDDIR/powerave.py"
     21 
     22 defaultPattern="*-201*"
     23 defaultVoltage=4.3
     24 defaultFrequency=5
     25 
     26 function Usage {
     27 	echo "$0 [-o format] [-v voltage] [-h freq] [-f resultsDirectories]"
     28 }
     29 
     30 while [ $# -gt 0 ]
     31 do
     32 	case "$1" in
     33 	(-o) format=$2; shift;;
     34 	(-v) voltage=$2; shift;;
     35 	(-h) hz=$2; shift;;
     36 	(-r) testResults="$2"; shift;;
     37 	(--help) Usage; exit 0;;
     38 	(--) shift; break;;
     39 	(*)
     40 		echo Unknown option: $1
     41 		Usage
     42 		exit 1;;
     43 	esac
     44 	shift
     45 done
     46 
     47 testResults=${testResults:=$defaultPattern}
     48 voltage=${voltage:=$defaultVoltage}
     49 hz=${hz:=$defaultFrequency}
     50 
     51 function printHeader {
     52 	workload=$1
     53 	units="unknown"
     54 	case $workload in
     55 	(suntemple|shadowgrid2)
     56 		units="FPS";;
     57 	(recentfling|youtube|chrome)
     58 		units="FPS from app point of view: 1/(90th percentile render time)";;
     59 	(sysapps)
     60 		units="App start/switch per second";;
     61 	esac
     62 
     63 	echo "Performance unit for $workload is: $units"
     64 	if [ "$format" = csv ]; then
     65 		printf "%s,%s,%s,%s,%s,%s,%s,%s,%s\n" " " build min ave max net-mA@${voltage}v base-mW net-mW perf/W
     66 	else
     67 		printf "%-30s %-8s %12.12s %12.12s %12.12s %12.12s %12.12s %12.12s %12.12s\n" " " build min ave max net-mA@${voltage}v base-mW net-mW perf/W
     68 	fi
     69 }
     70 
     71 function average {
     72 	awk 'BEGIN { count=0; sum=0; max=-1000000000; min=1000000000; }
     73 	{
     74 		cur = $1;
     75 		sum = sum + cur; 
     76 		if (cur > max) max = cur;
     77 		if (cur < min) min = cur;
     78 		count++;
     79 	}
     80 
     81 	END {
     82 		if (count > 0) {
     83 			ave = sum / count;
     84 			printf "%.2f %.2f %.2f\n", min, ave, max; 
     85 		}
     86 	}'
     87 }
     88 
     89 function hwuiOutputParser {
     90 	# Stats since: 60659316905953ns
     91 	# Total frames rendered: 150
     92 	# Janky frames: 89 (59.33%)
     93 	# 90th percentile: 23ms
     94 	# 95th percentile: 27ms
     95 	# 99th percentile: 32ms
     96 	# Number Missed Vsync: 0
     97 	# Number High input latency: 0
     98 	# Number Slow UI thread: 0
     99 	# Number Slow bitmap uploads: 12
    100 	# Number Slow draw: 89
    101 	# use with "stdbuf -o0 " to disable pipe buffering
    102 	# stdbuf -o0 adb shell /data/local/tmp/hwuimacro shadowgrid2 400 | stdbuf -o0 ./hwuitestfilter.sh  | tee t.csv
    103 	sed -e 's/ns//' -e 's/[\(\)%]/ /g' | awk '
    104 	BEGIN { startTime=0; lastTime=0; }
    105 	/^Stats since:/ {
    106 		curTime = $3;
    107 		if (startTime == 0) {
    108 			startTime = curTime;
    109 		}
    110 		if (lastTime) {
    111 			interval = curTime - lastTime;
    112 			fps = totalFrames*1000000000 / interval;
    113 			diffTime = curTime - startTime;
    114 			printf "%.2f, %.2f, ",diffTime/1000000, fps;
    115 		}
    116 	}
    117 	/^Total frames/ { totalFrames=$4; }
    118 	/^Janky frames:/ {
    119 		if (lastTime) {
    120 			printf "%.2f\n",$4; lastTime=curTime;
    121 		}
    122 		lastTime = curTime;
    123 	}'
    124 }
    125 
    126 function sysappOutputParser {
    127 	awk '
    128 	BEGIN { fmt=0; count=0; sum=0; }
    129 	/^App/ {
    130 		if (count != 0) {
    131 			if (fmt > 2) printf "Ave: %0.2fms\n", sum/count;
    132 			else printf " %0.2f\n", sum/count;
    133 			count = 0;
    134 			sum = 0;
    135 		}
    136 	}
    137 	/^[a-z]/ { val=$2; if (val != 0) { count++; sum+=val; } }
    138 	/^Iteration/ { if (fmt > 2) printf "%s : ", $0; else if (fmt) printf "%d ", $2; }
    139 	'
    140 }
    141 
    142 function calcPerfData {
    143 	testdir=$1
    144 	workload=$2
    145 	baselineCurrent=$3
    146 	baselinePower=$4
    147 
    148 	file=${workload}.out
    149 	powerfile=${workload}-power.out
    150 	build="$(cat build 2>/dev/null)"
    151 	build=${build:="Unknown"}
    152 
    153 	lines=$(wc -l $file 2>/dev/null | cut -f1 -d\ )
    154 
    155 	if [ ${lines:=0} -eq -0 ]; then
    156 		# No performance data captured
    157 		if [ "$format" = csv ]; then
    158 			printf "%s,%s,%s\n" $testdir "$build" "no data"
    159 		else
    160 			printf "%-30s %-8s %12.12s\n" $testdir "$build" "no data"
    161 		fi
    162 		return 1
    163 	fi
    164 
    165 	set -- $($POWERAVE $hz $voltage $powerfile)
    166 	current=$(echo $1 $baselineCurrent | awk '{ printf "%.2f", $1-$2; }')
    167 	power=$(echo $2 $baselinePower | awk '{ printf "%.2f", $1-$2; }')
    168 
    169 	case $workload in
    170 	(idle)
    171 		set -- 0 0 0
    172 		;;
    173 	(suntemple)
    174 		# units are fps
    175 		set -- $(grep "FPS average" $file  | sed 's/^.*seconds for a //' | awk '{ print $1; }' | average)
    176 		;;
    177 	(recentfling|youtube|chrome)
    178 		# units are ms, so need to convert to app/ms
    179 		set -- $(grep ^Frames:  $file | tr "/" " " | awk '{ print $4; }' | average | awk '{ printf "%.3f %.3f %.3f\n", 1000/$3, 1000/$2, 1000/$1;}'  )
    180 		;;
    181 	(sysapps)
    182 		# units are ms, so need to convert to app/ms
    183 		set -- $(cat $file | sysappOutputParser | average | awk '{ printf "%.3f %.3f %.3f\n", 1000/$3, 1000/$2, 1000/$1;}'  )
    184 		;;
    185 	(shadowgrid2)
    186 		# units are fps
    187 		set -- $(cat $file | hwuiOutputParser | tr ',' ' ' | awk '{print $2;}' | average)
    188 		;;
    189 	esac
    190 
    191 	minperf=$1
    192 	aveperf=$2
    193 	maxperf=$3
    194 	perfPerWatt=$(echo $aveperf $power | awk '{ if ($2) { val=$1*1000/$2; printf "%.3f\n", val; } else print "unknown"; }')
    195 	if [ "$format" = csv ]; then
    196 		printf "%s,%s,%f,%f,%f,%f,%f,%f," $testdir "$build" $minperf $aveperf $maxperf $current $baselinePower $power
    197 		printf "%s\n" $perfPerWatt
    198 	else
    199 		printf "%-30s %-8s %12.2f %12.2f %12.2f %12.2f %12.2f %12.2f " $testdir "$build" $minperf $aveperf $maxperf $current $baselinePower $power
    200 		printf "%12s\n" $perfPerWatt
    201 	fi
    202 }
    203 
    204 function calcBaselinePower {
    205 	workload=$1
    206 	defaultPowerFile="idle-display-power.out"
    207 	powerFile=$defaultPowerFile
    208 	case $workload in
    209 	(shadowgrid2|suntemple|recentfling)
    210 		powerFile="idle-airplane-display-power.out"
    211 		if [ ! -f  $powerFile ]; then
    212 			powerFile=$defaultPowerFile
    213 		fi;;
    214 	esac
    215 	if [ -f  $powerFile ]; then
    216 		$POWERAVE 5 4.3 $powerFile
    217 	fi
    218 }
    219 
    220 for t in $(cat tests)
    221 do
    222 	echo .======================= $t ================================
    223 	printHeader $t
    224 	for i in $testResults
    225 	do
    226 		cd $i
    227 		baseline="$(calcBaselinePower $t)"
    228 		if [ "$baseline" != "" ]; then
    229 	       		calcPerfData $i $t $baseline
    230 		else
    231 			echo "$i : no baseline current"
    232 		fi
    233 		cd - > /dev/null
    234 	done
    235 done
    236