blob: 7365fe6365dc60e4da1a8946d9c35260e1ee4abd [file] [log] [blame]
# Utility functions for use with bash.
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# Copyright (C) Facebook, 2020
#
# Authors: Paul E. McKenney <paulmck@kernel.org>
# There are about five buckets per 64-byte cache line, and up to about
# 448 CPUs. Giving each CPU its own cache line in a deterministic workload
# requires 448*5=2240 cache lines. But in this case, there is a very high
# probability of cacheline collision. Multiplying the number of buckets
# by 100 (22400) reduces the per-access chance of cacheline collision to
# roughly 1% (computing the exact value is left as an exercise). Rounding
# to the next power of two gets 262,144. So use this and 524,288.
#
# But use the actual maximum number of CPUs instead of hard-coding 448.
# Also round down because laziness.
# Power of two, rounding down and up, respectively.
power2down() {
echo $1 |
awk '
{
x = $1;
logx = log(x) / log(2);
ilogx = int(logx);
print 2^ilogx;
}'
}
power2up() {
echo $1 |
awk '
{
x = $1;
logx = log(x) / log(2);
ilogx = int(logx);
if (x == 2^ilogx)
print 2^ilogx;
else
print 2 * 2^ilogx;
}'
}
# Iteration increment given last number used and divisor (which should
# be a power of two). If the result would be fractional, it is rounded up
# to 1. So "power2inc 64 1" will give 64 (one sample per power of two),
# and "power2inc 64 8" will give 8 (eight samples per power of two).
power2inc() {
awk -v iter=$1 -v p2div=$2 -v p2raw="`power2down $1`" < /dev/null '
BEGIN {
if (p2raw <= p2div)
print 1;
else
print p2raw / p2div;
}'
}
# Get CPU numbers
maxcpu="`grep '^processor' /proc/cpuinfo | tail -1 | awk '{ print $3 }'`"
maxcpu=$((maxcpu + 1))
lastcpu=${1-$maxcpu}
if test $lastcpu -gt $maxcpu
then
echo $0: Specified $lastcpu CPUs, only $maxcpu available!!!
exit
fi
cpusperpwr2=8