X-Git-Url: http://git.megacz.com/?p=ghc-hetmet.git;a=blobdiff_plain;f=utils%2Frunstdtest%2Frunstdtest.prl;h=379c89564a3b8eb9a8cba207c43e11f13b432b14;hp=419e457c100db9d10dbe76a220e325a960991dc0;hb=03d716b3191301dad808d6ad861bc7343fc409d4;hpb=0b86bc9b022a5965d2b35f143ff4b919f784e676 diff --git a/utils/runstdtest/runstdtest.prl b/utils/runstdtest/runstdtest.prl index 419e457..379c895 100644 --- a/utils/runstdtest/runstdtest.prl +++ b/utils/runstdtest/runstdtest.prl @@ -43,6 +43,8 @@ $Verbose = 0; $SaveStderr = 0; $SaveStdout = 0; +$StdoutBinary = 0; +$StderrBinary = 0; $Status = 0; @PgmArgs = (); $PgmFail=0; @@ -72,7 +74,9 @@ $TimeCmd = 'time'; $StatsFile = "$TmpPrefix/stats$$"; $CachegrindStats = "cachegrind.out.summary"; $SysSpecificTiming = ''; +$SysCPUCounting = 0; # Use CPU counters $Cachegrind = 'no'; +$Counters = ""; die "$Pgm: program to run not given as first argument\n" if $#ARGV < 0; $ToRun = $ARGV[0]; shift(@ARGV); @@ -91,6 +95,9 @@ arg: while ($_ = $ARGV[0]) { /^-accept-output-stdout$/ && do { $SaveStdout = 1; next arg; }; /^-accept-output$/ && do { $SaveStdout = 1; $SaveStderr = 1; next arg; }; + /^-stdout-binary/ && do { $StdoutBinary=1; next arg; }; + /^-stdout-binary/ && do { $StderrBinary=1; next arg; }; + /^-O(.*)/ && do { push(@PgmArgs, &grab_arg_arg('-O',$1)); next arg; }; /^-i(.*)/ && do { $PgmStdinFile = &grab_arg_arg('-i',$1); $Status++, @@ -118,6 +125,8 @@ arg: while ($_ = $ARGV[0]) { next arg; }; /^-(ghc|hbc)-timing$/ && do { $SysSpecificTiming = $1; next arg; }; + /^-cpu-counting-(.)$/ && do { $SysCPUCounting = "$1"; + next arg; }; /^-cachegrind$/ && do { $SysSpecificTiming = 'ghc-instrs'; $Cachegrind = 'yes'; next arg }; @@ -166,7 +175,13 @@ foreach $a ( @PgmArgs ) { # deal with system-specific timing options $TimingMagic = ''; if ( $SysSpecificTiming =~ /^ghc/ ) { - $TimingMagic = "+RTS -S$StatsFile -RTS" + if ($SysCPUCounting) { + # Count specified CPU events + $cpu_counting_ghc = "-a$SysCPUCounting"; + } else { + $cpu_counting_ghc = ""; + } + $TimingMagic = "+RTS -S$StatsFile $cpu_counting_ghc -RTS" } elsif ( $SysSpecificTiming eq 'hbc' ) { $TimingMagic = "-S$StatsFile"; } @@ -207,9 +222,19 @@ cat /dev/null > $DefaultStdoutFile cat /dev/null > $DefaultStderrFile $PreScriptLines $SpixifyLine1 -echo $TimeCmd /bin/sh -c \'$CachegrindPrefix $ToRun $TimingMagic @PgmArgs < $PgmStdinFile | dos2unix 1> $TmpPrefix/runtest$$.1 2> $TmpPrefix/runtest$$.2 3> $TmpPrefix/runtest$$.3\' -$TimeCmd /bin/sh -c \'$CachegrindPrefix $ToRun $TimingMagic @PgmArgs < $PgmStdinFile | dos2unix 1> $TmpPrefix/runtest$$.1 2> $TmpPrefix/runtest$$.2 3> $TmpPrefix/runtest$$.3\' +$TimeCmd /bin/sh -c \'$CachegrindPrefix $ToRun $TimingMagic @PgmArgs < $PgmStdinFile 1> $TmpPrefix/runtest$$.1.raw 2> $TmpPrefix/runtest$$.2.raw 3> $TmpPrefix/runtest$$.3.raw\' progexit=\$? +if [ "$StdoutBinary" = "0" ]; then + dos2unix < $TmpPrefix/runtest$$.1.raw > $TmpPrefix/runtest$$.1 +else + cp $TmpPrefix/runtest$$.1.raw $TmpPrefix/runtest$$.1 +fi +if [ "$StderrBinary" = "0" ]; then + dos2unix < $TmpPrefix/runtest$$.2.raw > $TmpPrefix/runtest$$.2 +else + cp $TmpPrefix/runtest$$.2.raw $TmpPrefix/runtest$$.2 +fi +dos2unix < $TmpPrefix/runtest$$.3.raw > $TmpPrefix/runtest$$.3 if [ \$progexit -eq 0 ] && [ $PgmFail -ne 0 ]; then echo $ToRun @PgmArgs \\< $PgmStdinFile echo "****" expected a failure, but was successful @@ -272,7 +297,7 @@ if [ $SaveStderr = 1 ] && cp $TmpPrefix/runtest$$.2 $PgmStderrFile[0] fi -${RM} core $ToRunOrig.spix $DefaultStdoutFile $DefaultStderrFile $TmpPrefix/runtest$$.1 $TmpPrefix/runtest$$.2 $TmpPrefix/runtest$$.3 +${RM} core $ToRunOrig.spix $DefaultStdoutFile $DefaultStderrFile $TmpPrefix/runtest$$.1 $TmpPrefix/runtest$$.2 $TmpPrefix/runtest$$.3 $TmpPrefix/runtest$$.1.raw $TmpPrefix/runtest$$.2.raw $TmpPrefix/runtest$$.3.raw exit \$myexit EOSCRIPT @@ -298,7 +323,7 @@ if ( $SysSpecificTiming eq '' ) { # print out what we found print STDERR "<<$SysSpecificTiming: "; if ( $Cachegrind ne 'yes') { - print STDERR "$BytesAlloc bytes, $GCs GCs, $AvgResidency/$MaxResidency avg/max bytes residency ($ResidencySamples samples), $GCWork bytes GC work, ${TotMem}M in use, $InitTime INIT ($InitElapsed elapsed), $MutTime MUT ($MutElapsed elapsed), $GcTime GC ($GcElapsed elapsed)"; + print STDERR "$BytesAlloc bytes, $GCs GCs, $AvgResidency/$MaxResidency avg/max bytes residency ($ResidencySamples samples), $GCWork bytes GC work, ${TotMem}M in use, $InitTime INIT ($InitElapsed elapsed), $MutTime MUT ($MutElapsed elapsed), $GcTime GC ($GcElapsed elapsed)$Counters"; } else { print STDERR "$BytesAlloc bytes, $GCs GCs, $AvgResidency/$MaxResidency avg/max bytes residency ($ResidencySamples samples), $GCWork bytes GC work, ${TotMem}M in use, $InitTime INIT ($InitElapsed elapsed), $MutTime MUT ($MutElapsed elapsed), $GcTime GC ($GcElapsed elapsed), $TotInstrs instructions, $TotReads memory reads, $TotWrites memory writes, $TotMisses L2 cache misses"; }; @@ -357,6 +382,10 @@ sub process_stats_file { local($max_live) = 0; local($tot_live) = 0; # for calculating residency stuff local($tot_samples) = 0; + local($into_gc_counters) = 0; # once we reach into the GC counters part + local($counters) = ""; + local($counter) = ""; + local($count) = 0; $GCWork = 0; while () { @@ -367,7 +396,12 @@ sub process_stats_file { } $BytesAlloc = $1 if /^\s*([0-9,]+) bytes allocated in the heap/; - $GCWork += $1 if /^\s*([0-9,]+) bytes copied during GC/; + + if (/^\s*([0-9,]+) bytes copied during GC/) { + $tmp = $1; + $tmp =~ s/,//g; + $GCWork += $tmp; + } # if ( /^\s*([0-9,]+) bytes maximum residency .* (\d+) sample/ ) { # $MaxResidency = $1; $ResidencySamples = $2; @@ -386,6 +420,37 @@ sub process_stats_file { } elsif ( /^\s*GC\s+time\s*(-*\d+\.\d\d)s\s*\(\s*(-*\d+\.\d\d)s elapsed\)/ ) { $GcTime = $1; $GcElapsed = $2; } + + if ( /CPU GC counters/ ) { + # Counters that follow correspond to GC + $into_gc_counters = 1; + } + + if ( /^\s+\(([A-Z_0-9]+)\)\s+:\s+([0-9,]+)/ ) { + $counter = $1; + $count = $2; + $count =~ s/,//g; # Remove commas in numbers + # Pretty printing elements of a list with type [(String,[Float])] + # It's a bit lame for passing values but it works. + if($into_gc_counters) { + $counters = "$counters(\"GC:$counter\",[$count]),"; + } else { + $counters = "$counters(\"$counter\",[$count]),"; + } + } + + if ( /^\s+\(([A-Z_0-9]+)\)\s+\%\s+of\s+\(([A-Z_0-9]+)\)\s+:\s+([0-9.]+)/ ) { + $counter = "$1/$2"; # Relative quantity + $count = $3; + # Pretty printing elements of a list with type [(String,[Float])] + # It's a bit lame for passing values but it works. + if($into_gc_counters) { + $counters = "$counters(\"GC:$counter\",[$count]),"; + } else { + $counters = "$counters(\"$counter\",[$count]),"; + } + } + } close(STATS) || die "Failed when closing $StatsFile\n"; if ( $tot_samples > 0 ) { @@ -394,6 +459,13 @@ sub process_stats_file { $AvgResidency = int ($tot_live / $tot_samples) ; } + if ( length($counters) == 0 ) { + $Counters = ""; + } else { + chop($counters); # remove trailing comma from the last entry + $Counters = " [$counters]"; + } + } elsif ( $SysSpecificTiming eq 'hbc' ) { open(STATS, $StatsFile) || die "Failed when opening $StatsFile\n"; @@ -437,7 +509,6 @@ sub process_stats_file { # a bit of tidying $BytesAlloc =~ s/,//g; - $GCWork =~ s/,//g; $MaxResidency =~ s/,//g; $GCs =~ s/,//g; $InitTime =~ s/,//g;