X-Git-Url: http://git.megacz.com/?p=ghc-hetmet.git;a=blobdiff_plain;f=utils%2Frunstdtest%2Frunstdtest.prl;h=7d58d93168e3a7dd5951c66047b27dcdb8ef98ed;hp=752e6af0734846da772b2c2cb95eb120bcc31df3;hb=6e4c802adf4e8d9beaeb4e4529ae2ef3e702157f;hpb=3c604148f96f21b27aaeacad6da461ee088a9f73 diff --git a/utils/runstdtest/runstdtest.prl b/utils/runstdtest/runstdtest.prl index 752e6af..7d58d93 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; @@ -68,11 +70,13 @@ $DefaultStderrFile = "$TmpPrefix/no_stderr$$"; @PgmStderrFile = (); $PreScript = ''; $PostScript = ''; -$TimeCmd = ''; +$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,8 +222,18 @@ cat /dev/null > $DefaultStdoutFile cat /dev/null > $DefaultStderrFile $PreScriptLines $SpixifyLine1 -echo $TimeCmd /bin/sh -c \'$CachegrindPrefix $ToRun $TimingMagic @PgmArgs < $PgmStdinFile 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 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\' +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 progexit=\$? if [ \$progexit -eq 0 ] && [ $PgmFail -ne 0 ]; then echo $ToRun @PgmArgs \\< $PgmStdinFile @@ -223,7 +248,7 @@ else $PostScriptLines hit='NO' for out_file in @PgmStdoutFile ; do - if diff --strip-trailing-cr \$out_file $TmpPrefix/runtest$$.1 > /dev/null 2>&1 ; then + if sed "s/\\r\$//" $TmpPrefix/runtest$$.1 | cmp -s \$out_file - ; then hit='YES' fi done @@ -249,7 +274,7 @@ fi hit='NO' for out_file in @PgmStderrFile ; do - if diff --strip-trailing-cr \$out_file $TmpPrefix/runtest$$.2 > /dev/null 2>&1 ; then + if sed "s/\\r\$//" $TmpPrefix/runtest$$.2 | cmp -s \$out_file - ; then hit='YES' fi done @@ -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;