| #!/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; |
| # } |
| } |
| } |
| } |