You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
236 lines
5.7 KiB
236 lines
5.7 KiB
# print summary of output generated by pwrtest.sh
|
|
#
|
|
# default results directories are <device>-<date>[-experiment]. By default
|
|
# match any device and the year 201*.
|
|
#
|
|
# Examples:
|
|
#
|
|
# - show output for all bullhead tests in july 2015:
|
|
# ./pwrsummary.sh -r "bh-201507*"
|
|
#
|
|
# - generate CSV file for import into spreadsheet:
|
|
# ./pwrsummary.sh -o csv
|
|
#
|
|
|
|
CMDDIR=$(dirname $0 2>/dev/null)
|
|
CMDDIR=${CMDDIR:=.}
|
|
cd $CMDDIR
|
|
CMDDIR=$(pwd)
|
|
cd -
|
|
POWERAVE="python $CMDDIR/powerave.py"
|
|
|
|
defaultPattern="*-201*"
|
|
defaultVoltage=4.3
|
|
defaultFrequency=5
|
|
|
|
function Usage {
|
|
echo "$0 [-o format] [-v voltage] [-h freq] [-f resultsDirectories]"
|
|
}
|
|
|
|
while [ $# -gt 0 ]
|
|
do
|
|
case "$1" in
|
|
(-o) format=$2; shift;;
|
|
(-v) voltage=$2; shift;;
|
|
(-h) hz=$2; shift;;
|
|
(-r) testResults="$2"; shift;;
|
|
(--help) Usage; exit 0;;
|
|
(--) shift; break;;
|
|
(*)
|
|
echo Unknown option: $1
|
|
Usage
|
|
exit 1;;
|
|
esac
|
|
shift
|
|
done
|
|
|
|
testResults=${testResults:=$defaultPattern}
|
|
voltage=${voltage:=$defaultVoltage}
|
|
hz=${hz:=$defaultFrequency}
|
|
|
|
function printHeader {
|
|
workload=$1
|
|
units="unknown"
|
|
case $workload in
|
|
(suntemple|shadowgrid2)
|
|
units="FPS";;
|
|
(recentfling|youtube|chrome)
|
|
units="FPS from app point of view: 1/(90th percentile render time)";;
|
|
(sysapps)
|
|
units="App start/switch per second";;
|
|
esac
|
|
|
|
echo "Performance unit for $workload is: $units"
|
|
if [ "$format" = csv ]; then
|
|
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
|
|
else
|
|
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
|
|
fi
|
|
}
|
|
|
|
function average {
|
|
awk 'BEGIN { count=0; sum=0; max=-1000000000; min=1000000000; }
|
|
{
|
|
cur = $1;
|
|
sum = sum + cur;
|
|
if (cur > max) max = cur;
|
|
if (cur < min) min = cur;
|
|
count++;
|
|
}
|
|
|
|
END {
|
|
if (count > 0) {
|
|
ave = sum / count;
|
|
printf "%.2f %.2f %.2f\n", min, ave, max;
|
|
}
|
|
}'
|
|
}
|
|
|
|
function hwuiOutputParser {
|
|
# Stats since: 60659316905953ns
|
|
# Total frames rendered: 150
|
|
# Janky frames: 89 (59.33%)
|
|
# 90th percentile: 23ms
|
|
# 95th percentile: 27ms
|
|
# 99th percentile: 32ms
|
|
# Number Missed Vsync: 0
|
|
# Number High input latency: 0
|
|
# Number Slow UI thread: 0
|
|
# Number Slow bitmap uploads: 12
|
|
# Number Slow draw: 89
|
|
# use with "stdbuf -o0 " to disable pipe buffering
|
|
# stdbuf -o0 adb shell /data/local/tmp/hwuimacro shadowgrid2 400 | stdbuf -o0 ./hwuitestfilter.sh | tee t.csv
|
|
sed -e 's/ns//' -e 's/[\(\)%]/ /g' | awk '
|
|
BEGIN { startTime=0; lastTime=0; }
|
|
/^Stats since:/ {
|
|
curTime = $3;
|
|
if (startTime == 0) {
|
|
startTime = curTime;
|
|
}
|
|
if (lastTime) {
|
|
interval = curTime - lastTime;
|
|
fps = totalFrames*1000000000 / interval;
|
|
diffTime = curTime - startTime;
|
|
printf "%.2f, %.2f, ",diffTime/1000000, fps;
|
|
}
|
|
}
|
|
/^Total frames/ { totalFrames=$4; }
|
|
/^Janky frames:/ {
|
|
if (lastTime) {
|
|
printf "%.2f\n",$4; lastTime=curTime;
|
|
}
|
|
lastTime = curTime;
|
|
}'
|
|
}
|
|
|
|
function sysappOutputParser {
|
|
awk '
|
|
BEGIN { fmt=0; count=0; sum=0; }
|
|
/^App/ {
|
|
if (count != 0) {
|
|
if (fmt > 2) printf "Ave: %0.2fms\n", sum/count;
|
|
else printf " %0.2f\n", sum/count;
|
|
count = 0;
|
|
sum = 0;
|
|
}
|
|
}
|
|
/^[a-z]/ { val=$2; if (val != 0) { count++; sum+=val; } }
|
|
/^Iteration/ { if (fmt > 2) printf "%s : ", $0; else if (fmt) printf "%d ", $2; }
|
|
'
|
|
}
|
|
|
|
function calcPerfData {
|
|
testdir=$1
|
|
workload=$2
|
|
baselineCurrent=$3
|
|
baselinePower=$4
|
|
|
|
file=${workload}.out
|
|
powerfile=${workload}-power.out
|
|
build="$(cat build 2>/dev/null)"
|
|
build=${build:="Unknown"}
|
|
|
|
lines=$(wc -l $file 2>/dev/null | cut -f1 -d\ )
|
|
|
|
if [ ${lines:=0} -eq -0 ]; then
|
|
# No performance data captured
|
|
if [ "$format" = csv ]; then
|
|
printf "%s,%s,%s\n" $testdir "$build" "no data"
|
|
else
|
|
printf "%-30s %-8s %12.12s\n" $testdir "$build" "no data"
|
|
fi
|
|
return 1
|
|
fi
|
|
|
|
set -- $($POWERAVE $hz $voltage $powerfile)
|
|
current=$(echo $1 $baselineCurrent | awk '{ printf "%.2f", $1-$2; }')
|
|
power=$(echo $2 $baselinePower | awk '{ printf "%.2f", $1-$2; }')
|
|
|
|
case $workload in
|
|
(idle)
|
|
set -- 0 0 0
|
|
;;
|
|
(suntemple)
|
|
# units are fps
|
|
set -- $(grep "FPS average" $file | sed 's/^.*seconds for a //' | awk '{ print $1; }' | average)
|
|
;;
|
|
(recentfling|youtube|chrome)
|
|
# units are ms, so need to convert to app/ms
|
|
set -- $(grep ^Frames: $file | tr "/" " " | awk '{ print $4; }' | average | awk '{ printf "%.3f %.3f %.3f\n", 1000/$3, 1000/$2, 1000/$1;}' )
|
|
;;
|
|
(sysapps)
|
|
# units are ms, so need to convert to app/ms
|
|
set -- $(cat $file | sysappOutputParser | average | awk '{ printf "%.3f %.3f %.3f\n", 1000/$3, 1000/$2, 1000/$1;}' )
|
|
;;
|
|
(shadowgrid2)
|
|
# units are fps
|
|
set -- $(cat $file | hwuiOutputParser | tr ',' ' ' | awk '{print $2;}' | average)
|
|
;;
|
|
esac
|
|
|
|
minperf=$1
|
|
aveperf=$2
|
|
maxperf=$3
|
|
perfPerWatt=$(echo $aveperf $power | awk '{ if ($2) { val=$1*1000/$2; printf "%.3f\n", val; } else print "unknown"; }')
|
|
if [ "$format" = csv ]; then
|
|
printf "%s,%s,%f,%f,%f,%f,%f,%f," $testdir "$build" $minperf $aveperf $maxperf $current $baselinePower $power
|
|
printf "%s\n" $perfPerWatt
|
|
else
|
|
printf "%-30s %-8s %12.2f %12.2f %12.2f %12.2f %12.2f %12.2f " $testdir "$build" $minperf $aveperf $maxperf $current $baselinePower $power
|
|
printf "%12s\n" $perfPerWatt
|
|
fi
|
|
}
|
|
|
|
function calcBaselinePower {
|
|
workload=$1
|
|
defaultPowerFile="idle-display-power.out"
|
|
powerFile=$defaultPowerFile
|
|
case $workload in
|
|
(shadowgrid2|suntemple|recentfling)
|
|
powerFile="idle-airplane-display-power.out"
|
|
if [ ! -f $powerFile ]; then
|
|
powerFile=$defaultPowerFile
|
|
fi;;
|
|
esac
|
|
if [ -f $powerFile ]; then
|
|
$POWERAVE 5 4.3 $powerFile
|
|
fi
|
|
}
|
|
|
|
for t in $(cat tests)
|
|
do
|
|
echo .======================= $t ================================
|
|
printHeader $t
|
|
for i in $testResults
|
|
do
|
|
cd $i
|
|
baseline="$(calcBaselinePower $t)"
|
|
if [ "$baseline" != "" ]; then
|
|
calcPerfData $i $t $baseline
|
|
else
|
|
echo "$i : no baseline current"
|
|
fi
|
|
cd - > /dev/null
|
|
done
|
|
done
|