From: Steven Sistare <steven.sistare@oracle.com>
To: mingo@redhat.com, peterz@infradead.org
Cc: subhra.mazumdar@oracle.com, dhaval.giani@oracle.com,
daniel.m.jordan@oracle.com, pavel.tatashin@microsoft.com,
matt@codeblueprint.co.uk, umgwanakikbuti@gmail.com,
riel@redhat.com, jbacik@fb.com, juri.lelli@redhat.com,
valentin.schneider@arm.com, vincent.guittot@linaro.org,
quentin.perret@arm.com, linux-kernel@vger.kernel.org
Subject: hackbench run scripts
Date: Fri, 9 Nov 2018 10:02:37 -0500 [thread overview]
Message-ID: <0eaa3ee9-64d6-4739-eec9-e28befa0e97f@oracle.com> (raw)
In-Reply-To: <1541767840-93588-1-git-send-email-steven.sistare@oracle.com>
[-- Attachment #1: Type: text/plain, Size: 1935 bytes --]
Hi folks,
I am attaching the bash helper scripts I used to run and post-process hackbench
in case you find them useful. They compute the statistics and print a nicely
formatted result:
feat - Enable/disable one or more sched_features.
runmany - run a command many times and print average time and stdev.
hackdiff - Print difference between 2 identical series of runmany hackbench runs.
You supply the top level script that runs a series of groups. Example:
---- hackseries ---------------
#!/bin/sh
iters=50000
groups="1 2 3 4"
runs=5
tmpfile=temp$$.out
rm -f $tmpfile
runall() {
for g in $groups ; do
echo hackbench $g process $iters | tee -a $tmpfile
runmany $runs hackbench $g process $iters | tee -a $tmpfile
done
}
sudo feat NO_STEAL ; runall ; echo
sudo feat STEAL ; runall ; echo
hackdiff < $tmpfile
rm -f $tmpfile
--------------------------------
$ hackseries
hackbench 1 process 50000
4.096 4.090 4.073 4.129 4.092 Average 4.096 stdev 0.5%
hackbench 2 process 50000
7.215 7.214 7.242 7.208 7.224 Average 7.220 stdev 0.2%
hackbench 3 process 50000
10.082 10.035 10.049 10.068 10.082 Average 10.063 stdev 0.2%
hackbench 4 process 50000
12.851 12.948 12.905 12.916 12.994 Average 12.922 stdev 0.4%
hackbench 1 process 50000
3.193 3.261 3.257 3.223 3.247 Average 3.236 stdev 0.9%
hackbench 2 process 50000
6.020 5.960 6.003 6.008 5.998 Average 5.997 stdev 0.4%
hackbench 3 process 50000
8.598 8.692 8.536 8.661 8.468 Average 8.591 stdev 1.1%
hackbench 4 process 50000
11.201 11.148 11.053 11.174 11.127 Average 11.140 stdev 0.5%
--- base -- --- new ---
groups time %stdev time %stdev %speedup
1 4.096 0.5 3.236 0.9 26.5
2 7.220 0.2 5.997 0.4 20.3
3 10.063 0.2 8.591 1.1 17.1
4 12.922 0.4 11.140 0.5 15.9
- Steve
[-- Attachment #2: feat --]
[-- Type: text/plain, Size: 836 bytes --]
#!/bin/sh
# SPDX-License-Identifier: GPL-2.0
#
# Author: Steve Sistare <steven.sistare@oracle.com>
#
# Usage: feat [feature1] [feature2] ...
# Enable/disable one or more sched_features.
# With no arguments, print the currently enabled features.
if [[ ! -r /sys/kernel/debug ]]; then
echo "Permission denied. You must be root."
exit 1
elif [[ ! -r /sys/kernel/debug/sched_features ]]; then
echo "debugfs not mounted. Please run as root:"
echo " mount -t debugfs none /sys/kernel/debug"
exit 1
fi
if [ $# == 0 ] ; then
cat /sys/kernel/debug/sched_features | sed 's/ /\n/g'
else
for feat in $* ; do
if ! echo $feat > /sys/kernel/debug/sched_features ; then
echo Unrecognized feature $feat
fi
done
fi
exit 0
[-- Attachment #3: runmany --]
[-- Type: text/plain, Size: 1574 bytes --]
#!/bin/sh
# SPDX-License-Identifier: GPL-2.0
#
# Author: Steve Sistare <steven.sistare@oracle.com>
#
# Usage: runmany <repeat> command args ...
# Run command <repeat> times, extract time, and print average and stdev.
#
# Command must print a line of the form "Time %f" (eg, like hackbench).
# Convert float $1 to integral fixed-point value with $2 decimal places.
#
ftoi()
{
declare -i tens=10**$2
echo $(echo "scale=0; ($tens * $1) / 1" | bc -q)
}
# Convert integral fixed-point $1 with $2 decimal places to floating
# point string.
#
itof()
{
declare -i i frac tens x=$1
[[ $x -lt 0 ]] && sign='-' x=(-$x)
tens=10**$2
i=$x/tens
frac=$x%tens
printf "%s%d.%0${2}d" "$sign" $i $frac
}
# Return the average of all arguments.
#
average()
{
declare -i x avg=0
for x in $* ; do
avg=avg+x
done
avg=avg/$#
echo $avg
}
# Return the stdev of all args, as a percent of the average, as a float with
# 6 decimal places.
#
stdev()
{
declare -i x var=0
declare -i avg=$(average $@)
for x in $* ; do
x=x-avg
var=var+x*x
done
echo "scale=6; sqrt($var / ($# - 1)) * 100 / $avg" | bc -q
}
declare -i n=$1
declare -a -i t
if [[ $n -eq 0 ]] ; then
echo "usage: runmany num command args ..."
exit 1
fi
cmd="${@:2:$#}"
for ((i=0; i<$n; i=i+1)) ; do
t1=$($cmd | grep Time | awk '{print $2}')
t[$i]=$(ftoi $t1 3)
printf "%6.3f " $t1
done
avg=$(average ${t[*]})
favg=$(itof avg 3)
std=$(stdev ${t[*]})
printf " Average %.3f stdev %.1f%%\n" $favg $std
[-- Attachment #4: hackdiff --]
[-- Type: text/plain, Size: 2161 bytes --]
#!/bin/sh
# SPDX-License-Identifier: GPL-2.0
#
# Author: Steve Sistare <steven.sistare@oracle.com>
#
# Usage: hackdiff
# Print difference between 2 identical series of hackbench runs
#
# Reads lines from stdin of this form (eg, from runmany):
# hackbench 1 process 100000
# 5.753 5.421 5.254 6.044 5.989 Average 5.692 stdev 6.1%
#
# The first occurrence of a hackbench group line is the base series, and the
# next occurrence with identical parameters is the new series.
# Convert float $1 to integral fixed-point value with $2 decimal places
#
ftoi()
{
declare -i tens=10**$2
echo $(echo "scale=0; ($tens * $1) / 1" | bc -q)
}
# Convert integral fixed-point $1 with $2 decimal places to floating point
# string
#
itof()
{
declare -i i frac tens x=$1
tens=10**$2
[[ $x -lt 0 ]] && sign='-' x=(-$x)
i=$x/tens
frac=$x%tens
printf "%s%d.%0${2}d" "$sign" $i $frac
}
declare -a t1 t2 t3 groups
declare -a words
declare -a t1 t2 d1 d2 words groups seen_group
declare -i i t1d t2d t3 n=0
after=false
while read buf ; do
if [[ ${buf:0:9} == "hackbench" ]]; then
words=($buf)
group=${words[1]}
if [[ ${seen_group[$group]} == true ]]; then
if [[ $after == false ]]; then
n=0
after=true
fi
if [[ ${groups[$n]} != $group ]]; then
echo "expected group ${groups[$n]} " \
"but found $group"
exit 1
fi
fi
seen_group[$group]=true
groups[$n]=$group
elif $(echo $buf | grep -q Average) ; then
words=($(echo $buf | sed ' s/^.*Average *//'))
if [[ $after == true ]]; then
t2[$n]=${words[0]}
d=${words[2]}
d2[$n]=${d%\%}
else
t1[$n]=${words[0]}
d=${words[2]}
d1[$n]=${d%\%}
fi
n=($n+1)
fi
done
printf "%21s %13s\n" "--- base --" "--- new ---"
printf "%6s %6s %6s %6s %6s %8s\n" \
groups time \%stdev time \%stdev \%speedup
for ((i=0; i<$n; i++)) ; do
t1d=$(ftoi ${t1[$i]} 3)
t2d=$(ftoi ${t2[$i]} 3)
t3=($t1d*1000/$t2d-1000)
t3=($t3*100)
speedup=$(itof $t3 3)
printf "%6d %6.3f %6.1f %6.3f %6.1f %8.1f\n" \
${groups[$i]} ${t1[$i]} ${d1[$i]} ${t2[$i]} ${d2[$i]} $speedup
done
prev parent reply other threads:[~2018-11-09 15:03 UTC|newest]
Thread overview: 30+ messages / expand[flat|nested] mbox.gz Atom feed top
2018-11-09 12:50 [PATCH v3 00/10] steal tasks to improve CPU utilization Steve Sistare
2018-11-09 12:50 ` [PATCH v3 01/10] sched: Provide sparsemask, a reduced contention bitmap Steve Sistare
2018-11-27 15:16 ` Steven Sistare
2018-11-28 1:19 ` Omar Sandoval
2018-12-06 16:07 ` Steven Sistare
2018-12-06 18:19 ` Omar Sandoval
2018-11-09 12:50 ` [PATCH v3 02/10] sched/topology: Provide hooks to allocate data shared per LLC Steve Sistare
2018-11-09 12:50 ` [PATCH v3 03/10] sched/topology: Provide cfs_overload_cpus bitmap Steve Sistare
2018-11-09 17:38 ` Valentin Schneider
2018-11-19 17:32 ` Steven Sistare
2018-11-20 12:52 ` Valentin Schneider
2018-11-12 16:42 ` Valentin Schneider
2018-11-19 17:33 ` Steven Sistare
2018-11-20 12:42 ` Valentin Schneider
2018-11-26 19:06 ` Steven Sistare
2018-12-03 16:56 ` Valentin Schneider
2018-12-06 16:40 ` Steven Sistare
2018-12-06 17:28 ` Valentin Schneider
2018-11-09 12:50 ` [PATCH v3 04/10] sched/fair: Dynamically update cfs_overload_cpus Steve Sistare
2018-11-09 12:50 ` [PATCH v3 05/10] sched/fair: Hoist idle_stamp up from idle_balance Steve Sistare
2018-11-09 19:07 ` Valentin Schneider
2018-11-19 17:31 ` Steven Sistare
2018-11-20 10:24 ` Valentin Schneider
2018-11-09 12:50 ` [PATCH v3 06/10] sched/fair: Generalize the detach_task interface Steve Sistare
2018-11-09 12:50 ` [PATCH v3 07/10] sched/fair: Provide can_migrate_task_llc Steve Sistare
2018-11-09 12:50 ` [PATCH v3 08/10] sched/fair: Steal work from an overloaded CPU when CPU goes idle Steve Sistare
2018-11-09 12:50 ` [PATCH v3 09/10] sched/fair: disable stealing if too many NUMA nodes Steve Sistare
2018-11-09 12:50 ` [PATCH v3 10/10] sched/fair: Provide idle search schedstats Steve Sistare
2018-11-10 17:08 ` kbuild test robot
2018-11-09 15:02 ` Steven Sistare [this message]
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=0eaa3ee9-64d6-4739-eec9-e28befa0e97f@oracle.com \
--to=steven.sistare@oracle.com \
--cc=daniel.m.jordan@oracle.com \
--cc=dhaval.giani@oracle.com \
--cc=jbacik@fb.com \
--cc=juri.lelli@redhat.com \
--cc=linux-kernel@vger.kernel.org \
--cc=matt@codeblueprint.co.uk \
--cc=mingo@redhat.com \
--cc=pavel.tatashin@microsoft.com \
--cc=peterz@infradead.org \
--cc=quentin.perret@arm.com \
--cc=riel@redhat.com \
--cc=subhra.mazumdar@oracle.com \
--cc=umgwanakikbuti@gmail.com \
--cc=valentin.schneider@arm.com \
--cc=vincent.guittot@linaro.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.