blob: 373c2530717af23ef729d67490a945d1ee70469a [file] [log] [blame]
#!/bin/bash
#
# Reduce data gathered by perf.sh.
#
# Usage: bash reduce.sh [ tag ] < perf.sh.out
#
# If present, the "tag" will be included in the output filenames,
# for example, count_nonatomic:r.<tag>.dat. The output files are
# formatted for use as gnuplot data files.
#
# 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.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, you can access it online at
# http://www.gnu.org/licenses/gpl-2.0.html.
#
# Copyright (C) IBM Corporation, 2008-2019
# Copyright (C) Facebook, 2019
#
# Authors: Paul E. McKenney <paulmck@kernel.org>
tag="$1"
# Gather data from each program into a separate .raw file.
# Each line has the number of CPUs followed by read data points followed
# by write data points.
grep -v '^!!!' | grep -v "^n_reads:" |
awk '
BEGIN {
tag = "'"$tag"'";
progname = "";
}
{
if ($1 != "ns/read:") {
progname = $1;
ncpus = $2;
} else if ($1 == "ns/read:" && progname != "") {
if ($2 != "nan") {
datasets["" progname ":r"] = 1;
key = "" progname ":r:" ncpus;
data[key] = data[key] " " $2;
}
if ($4 != "nan") {
datasets["" progname ":u"] = 1;
key = "" progname ":u:" ncpus;
data[key] = data[key] " " $4;
}
if ($2 != "nan" || $4 != "nan") {
if (mincpu == "" || mincpu > ncpus)
mincpu = ncpus;
if (maxcpu == "" || maxcpu < ncpus)
maxcpu = ncpus;
}
progname = "";
} else {
progname = "";
}
}
END {
for (i in datasets) {
split(i, a, ":");
progname = a[1];
uflag = a[2];
for (ncpus = mincpu; ncpus <= maxcpu; ncpus++) {
key = i ":" ncpus;
if (data[key] != "") {
print(ncpus, data[key]) > "" i "." tag ".raw"
}
}
}
}'
# Extract the read-side data into a .dat file formatted for gnuplot
# (average then minimum then maximum).
for i in `ls *.raw | grep '^[a-zA-Z0-9_]*:r'`
do
bn=`echo $i | sed -e 's/\.raw//'`
awk < $i > $bn.dat '
{
cpus = $1;
min = $2;
max = $2;
sum = 0;
n = 0;
for (i = 2; i <= NF; i += 2) {
sum += $i;
n++;
if ($i < min)
min = $i;
if ($i > max)
max = $i;
}
print cpus, sum / n, min, max;
}'
done
# Extract the write-side data into a .dat file formatted for gnuplot
# (again, average then minimum then maximum).
for i in `ls *.raw | grep '^[a-zA-Z0-9_]*:u'`
do
bn=`echo $i | sed -e 's/\.raw//'`
awk < $i > $bn.dat '
{
cpus = $1;
first = 3;
min = $first;
max = $first;
sum = 0;
n = 0;
for (i = first; i <= NF; i += 2) {
sum += $i;
n++;
if ($i < min)
min = $i;
if ($i > max)
max = $i;
}
print cpus, sum / n, min, max;
}'
done