blob: 98a8f159b58f42f8bf42689c1e6fa833328b90b1 [file] [log] [blame] [edit]
#!/usr/bin/env perl
#
# Copyright 2017, Data61, CSIRO (ABN 41 687 119 230)
#
# SPDX-License-Identifier: BSD-2-Clause
#
use warnings;
use strict;
use Switch;
my $setcount = -1;
my @sets = [];
while(<>) {
if (m/^SB&#Sample, Cycles, PMC0, PMC1, FN Mode, FN Name, FN line, Extra\s*$/) {
$setcount++;
# printf "new dataset %d\n", $setcount;
$sets[$setcount] = [];
}
elsif(m/^SB&\s*(\d+)\/(\d+)\s+-\s+(\d+), (\d+), (\d+), (\w+), (\w+), (\d+), ([^[:cntrl:]]*)[[:cntrl:]]*$/) {
#apparently there are random control characters at the ends of lines. yay.
${$sets[$setcount]}[$1] = {
'Time' => $3,
'PMC0' => $4,
'PMC1' => $5,
'Mode' => $6,
'Func' => $7,
'Desc' => $8
};
# printf "datapoint %d/%d: %d %s-%s\n", $1 + 1, $2, $3, $4, $5;
}
}
#print "\nData aggregation complete.\n\n";
#
#printf "setcount = %d\n", $setcount + 1;
#print "sets = @sets\n";
#foreach (@sets) {
# print;
# print ":\n";
# foreach(@{$_}) {
# print "\t";
# print join("\t", %{$_});
# print "\n";
# }
#}
#
#print "\nBegin data processing.\n\n";
#datasets go: overhead, send/wait, send/replywait, send/reply+wait, [repeat in reverse]
#total dataset
my %phasedata = ();
for(my $set = 0; $set < (scalar @sets); $set++) {
print "Processing set $set...\n";
foreach(@{$sets[$set]}) {
my $datapoint = $_;
switch(${$datapoint}{'Mode'}) {
case "enter" {
my $starttime = ${$datapoint}{'Time'};
my $phase = ${$datapoint}{'Func'};
$phasedata{$phase} = \%{$datapoint};
#print "$phase $starttime\n";
}
case "exit" {
my $phase = ${$datapoint}{'Func'};
if(defined $phasedata{$phase}) {
#my $timetaken = ${$datapoint}{'Time'} - $phasedata{$phase}{'Time'};
#if($timetaken < 0) {
# $timetaken = $timetaken + (2 ** 32);
#}
#print "$phase: $timetaken\n";
my @perfdata = map { (${$datapoint}{$_} - $phasedata{$phase}{$_}) % (2 ** 32) } ('Time', 'PMC0', 'PMC1');
print "$phase: ";
print join ", ", @perfdata;
print "\n";
delete $phasedata{$phase};
} else {
print "phase $phase never started...\n";
print join("\t", %{$datapoint});
print "\n";
exit -1;
}
# print "$phase: ";
# print join(" ", %{$phasedata{$phase}});
# print "\n";
}
# case "none" {
# }
# else {
# print "invalid mode in datapoint: ";
# printf "\t%s\n", ${$datapoint}{'Mode'};
# printf "\t%s\n", ${$datapoint}{'Func'};
# printf "\t%s\n", ${$datapoint}{'Desc'};
# printf "\t%d\n", ${$datapoint}{'Time'};
# printf "\n";
# exit -1;
# }
}
}
}