################################################################################
# returns the cycles per second of a cmp simulation run
# usage: perf [directory]
# perf - expect one sim.log in the current directory
# perf dir - expect a regression to have been run in dir
# and average out all the sim.logs
# perf dir -group=<GROUP> - only select the diags from <GROUP>
################################################################################
elsif ($argv =~ /-group/)
$group =~ s/-group=(.*)/$1/ ;
elsif (($argv =~ /-h/) or ($argv =~ /-help/))
# open the directory where the diags are
opendir (DIR, "$reg_dir") ;
my @dir = readdir (DIR) ;
next if (($dir eq ".") or ($dir eq "..")) ;
next if ((defined $group) and ($dir !~ /:$group:/)) ;
if (((-f "perf.log") or (-f "perf.log.gz")) and (!$force))
print "Accumulating in $dir\n" ;
$total_diags++ if (&accumulate (\$total_cycles, \$total_delta, \$total_cps, \$total_cpu_cps, $dir)) ;
elsif ((-f "sim.log") or ( -f "sim.log.gz"))
print "Calculating in $dir\n" ;
$total_diags++ if (&calculate (\$total_cycles, \$total_delta, \$total_cps, \$total_cpu_cps, $dir)) ;
print "Total Cycles = $total_cycles\tTotal Seconds = $total_delta\n" ;
# my $hz = $total_cycles / $total_delta ;
print "Total Cycles per Second= $total_cps\tTotal CPU Cycles per Second= $total_cpu_cps\t\tTotal Diags = $total_diags\n" ;
$cps = $total_cps / $total_diags if ($total_diags != 0) ;
printf ("Wall Time CPS=%.2f\n", $cps) ;
$cpu_cps = $total_cpu_cps / $total_diags if ($total_diags != 0) ;
printf ("CPU Time CPS=%.2f\n", $cpu_cps) ;
$total_diags++ if (&calculate (\$total_cycles, \$total_delta, \$total_cps, \$total_cpu_cps, $dir)) ;
Calculates the cycles per second of a simulation run from the wall
time of a simulation run and the simulation cycles reported by simulation.
report the performance of diag run in current directory
report average performance of diags run in regression directory <DIR>
perf -group=<GROUP> <DIR>
report average performance of diags from group <GROUP>
run in regression directory <DIR>
force recalculation of perf for each diag of a regression directory <DIR>
even if perf.log is present.
my $total_cycles = shift ;
my $total_delta = shift ;
my $total_cpu_cps = shift ;
open (IN, "perf.log") or open (IN, "gzcat perf.log.gz |") or die "Could not open perf.log" ;
return 0 if (! defined $log) ;
my ($dummy, $start, $stop, $num_cycles, $delta, $cps, $cpu_cps, $cpu_freq) = ($log =~ /^(\S*)\s+(\S*)\s+(\S*)\s+(\S*)\s+(\S*)\s+(\S*)\s+(\S*)\s+(\S*)\s+/) ;
if ( (defined $dir) and (defined $start)
and (defined $stop) and (defined $num_cycles)
and (defined $delta) and (defined $cps) and (defined $cpu_cps))
print "$dir\t$start\t$stop\t$num_cycles\t$delta\t$cps\t$cpu_cps\t$cpu_freq\n" ;
${$total_cycles} += $num_cycles ;
${$total_delta} += $delta ;
${$total_cpu_cps} += $cpu_cps ;
my $total_cycles = shift ;
my $total_delta = shift ;
my $total_cpu_cps = shift ;
if (-e "sims.log") { open (IN, "sims.log") ; }
elsif (-e "sims.log.gz") { open (IN, "gzcat sims.log.gz |") ; }
elsif (-e "sim.perf.log") { open (IN, "sim.perf.log") ; }
elsif (-e "sim.perf.log.gz") { open (IN, "gzcat sim.perf.log.gz |") ; }
my ($start) = grep (/\ssim_start\s/, @log) ;
my ($stop) = grep (/\ssim_stop\s/, @log) ;
if (-e "sim.log") {open (IN, "head -500 sim.log |") or die "Could not open sim.log" ;}
elsif (-e "sim.log.gz") {open (IN, "gzcat sim.log.gz | head -500 |") or die "Could not open sim.log.gz" ;}
my ($freq) = grep (/Selected\sCore\sClock\sFrequency\s\d+\sMHz/, @log) ;
if (-e "sim.log") {open (IN, "tail -500 sim.log |") or die "Could not open sim.log" ;}
elsif (-e "sim.log.gz") {open (IN, "gzcat sim.log.gz | tail -500 |") or die "Could not open sim.log.gz" ;}
my ($cycles) = grep (/Time:\s\d+\sps/, @log) ;
my ($cpu_time) = grep (/CPU\sTime:\s+[.\d]+\sseconds/, @log) ;
if ($start && $stop && $cycles && $freq && $cpu_time)
$start =~ s/.*?(\d+:\d+:\d+).*/$1/ ;
$stop =~ s/.*?(\d+:\d+:\d+).*/$1/ ;
$cycles =~ s/Time:\s(\d+)\sps/$1/ ;
$freq =~ s/.*?(\d+).*/$1/ ;
$cpu_time =~ s/CPU\sTime:\s+([.\d]+)\sseconds.*/$1/ ;
$period = (1000000/$freq) ;
$num_cycles = $cycles / $period ;
my ($hr, $min, $sec) = $start =~ /(\d+):(\d+):(\d+)/ ;
my $start_sec = $hr * 60 * 60 + $min * 60 + $sec ;
($hr, $min, $sec) = $stop =~ /(\d+):(\d+):(\d+)/ ;
my $stop_sec = $hr * 60 * 60 + $min * 60 + $sec ;
if ($stop_sec >= $start_sec)
$delta = $stop_sec - $start_sec ;
$delta = $stop_sec + (86400 - $start_sec) ;
$hr = $delta / (60 * 60) ;
$min = ($delta - ($hr * 60 * 60)) / 60 ;
$sec = ($delta - ($hr * 60 * 60) - ($min * 60)) ;
my $cps = $num_cycles / $delta ;
my $cpu_cps = $num_cycles / $cpu_time ;
my $cpu_freq = cpuFreq () ;
print "$dir\t$start\t$stop\t$num_cycles\t$delta\t$cps\t$cpu_cps\t$cpu_freq\n" ;
${$total_cycles} += $num_cycles ;
${$total_delta} += $delta ;
${$total_cpu_cps} += $cpu_cps ;
my @psrinfo = `psrinfo -v` ;
if ($x =~ /processor\soperates\sat/)
$val =~ s/.*?\sat\s(\d+)\sMHz,/$1/ ;
my $PRTDIAG_CMD = '/usr/platform/sun4u/sbin/prtdiag';
if ( ! -x $PRTDIAG_CMD ) {
my @lines = `$PRTDIAG_CMD`;
foreach my $line ( @lines ) {
if ( $line =~ /== CPUs ===/ ) {
if ( $inCpu && $line =~ /MHz/ ) {
# find position of frequency
my @words = split /\s+/, $line;
for ( my $i = 0; $i < scalar @words; $i++ ) {
if ( $words[$i] eq "MHz" ) {
} elsif ( $words[$i] =~ /Impl/ ) {
# fix case of a well-known multi-word title
if ( $words[0] eq "FRU" && $words[1] eq "Name" ) {
if ( $inCpu && ( $line =~ /^---/ ) ) {
if ( $parse && ( $line =~ /\S+\s*\d+\s+(\d+)\s+\S+\s+(\S+)\s+\S+/ ) ) {
$line =~ s/^\s*//; # skip any leading space
my @words = split /\s+/, $line;
$freq = $words[$fpos] if $fpos >= 0;
$cpu = $words[$cpos] if $cpos >= 0;
# printf "CPU: %s, frequency = %d MHz\n", $cpu, $freq;