📄 flstats.pl
字号:
$remWriteMergeHist[$i] + $localReadConflictHist[$i] + $remReadConflictHist[$i] + $localWriteConflictHist[$i] + $remWriteConflictHist[$i]; } printf(STAT "%-40s %8d\n", "Total Request Latencies above 300:", $numLongReqs); printf(STAT "%-40s %8d\n", "Dirty Local Get Count:", $dirtyLocalGetCount); printf(STAT "%-40s %8d\n", "Dirty Local GetX Count:", $dirtyLocalGetXCount); if ($messages_processed == 0) { return; } $hack = 100; foreach $handler (keys(%count)) { $count{$handler} = $count{$handler} . $hack++; $lines{$count{$handler}} = $handler . ',' . 0; } printf(STAT "\n%-28s %5s %7s %14s %7s %10s\n", Handler, Cycles, Count, "Frequency (%)",Path,Occupancy); printf(STAT "-----------------------------------------------------------------------------\n"); foreach $counts (reverse sort numerically keys(%lines)) { ($handler, $cycleCount) = split(/,/, $lines{$counts}); chop $counts; chop $counts; chop $counts; # Insert tests for certain handlers. This info used in the # read breakdown section if ($handler eq "PILocalGet") { $piLocalGetCount = $counts; } if ($handler eq "NILocalPut") { $niLocalPutCount = $counts; } if ($handler eq "NIRemotePut") { $niRemotePutCount = $counts; } if ($handler eq "NISharingWriteback") { $niSharingWritebackCount = $counts; } $path = $latencies{$handler}; if ($path) { if ($counts != 0) { $path /= $counts; } } else { $path = "n/a"; } $occupancy = $occupancies{$handler}; if ($occupancy) { if ($counts != 0) { $occupancy /= $counts; } } else { $occupancy = "n/a"; } if ($path eq "n/a") { printf(STAT "%-30s %5d %8d %8.1lf %11s %8s\n", $handler, $cycleCount, $counts, ($counts/$messages_processed)*100.0,$path,$occupancy); } else { printf(STAT "%-30s %5d %8d %8.1lf %11.1lf %8.1lf\n", $handler, $cycleCount, $counts, ($counts/$messages_processed)*100.0,$path,$occupancy); } } printf(STAT "\nTotals %38d %8.1lf\n", $totalCount, 100.0); if ($totalCount != $messages_processed) { print STAT "WARNING: TotalCount != messages_processed ($messages_processed)\n"; } printf(STAT "\nHandler Calls Per Miss = %5.2lf\n", $totalCount/ ($processor_load_misses + $processor_store_misses + $processor_upgrade_misses + $processor_pref_misses + $processor_prefx_misses));}sub DO_DDCACHE_STATS { if ($ddcache_ops == 0) { return; } printf(STAT "Directory Data Cache Statistics\n\n"); printf(STAT "DD\$ Size = %d KB\n", $ddcache_size >> 10); printf(STAT "DD\$ Associativity = %d\n", $ddcache_assoc); printf(STAT "DD\$ Replacement Policy = $ddcache_replacement\n\n"); printf(STAT "Hit Rate = %5.1lf%%\n", ($ddcache_hits/$ddcache_ops) * 100.0); printf(STAT "Miss Rate = %5.1lf%%\n\n", ($ddcache_misses/$ddcache_ops) * 100.0); if (($ddcache_hits + $ddcache_misses) != $ddcache_ops) { printf(STAT "WARNING: Hits + Misses != Total Ops\n"); } printf(STAT "%-18s %8s %12s\n", Operation, Count, Percentage); printf(STAT "-----------------------------------------\n"); printf(STAT "%-18s %8d %9.1lf\n", Read, $ddcache_reads, ($ddcache_reads/ $ddcache_ops) * 100.0); printf(STAT "\n%18s %8d %9.1lf\n", Hits, $ddcache_read_hits, ($ddcache_read_hits/$ddcache_reads) * 100.0); printf(STAT "%18s %8d %9.1lf\n", Misses, $ddcache_read_misses, ($ddcache_read_misses/$ddcache_reads) * 100.0); if ($ddcache_read_hits + $ddcache_read_misses != $ddcache_reads) { printf(STAT "WARNING: Read Hits + Read Misses != Total Reads\n"); } printf(STAT "\n%-18s %8d %9.1lf\n", Write, $ddcache_writes, ($ddcache_writes/$ddcache_ops) * 100.0); printf(STAT "\n%18s %8d %9.1lf\n", Hits, $ddcache_write_hits, ($ddcache_write_hits/$ddcache_writes) * 100.0); printf(STAT "%18s %8d %9.1lf\n", Misses, $ddcache_write_misses, ($ddcache_write_misses/$ddcache_writes) * 100.0); if ($ddcache_write_hits + $ddcache_write_misses != $ddcache_writes) { printf(STAT "WARNING: Write Hits + Write Misses != Total Writes\n"); }}sub DO_DICACHE_STATS { if ($dicache_ops == 0) { return; } printf(STAT "Directory Instruction Cache Statistics\n\n"); printf(STAT "DI\$ Size = %d KB\n", $dicache_size >> 10); printf(STAT "DI\$ Associativity = %d\n", $dicache_assoc); printf(STAT "DI\$ Replacement Policy = $dicache_replacement\n\n"); printf(STAT "Hit Rate = %5.1lf%%\n", ($dicache_hits/$dicache_ops) * 100.0); printf(STAT "Miss Rate = %5.1lf%%\n\n", ($dicache_misses/$dicache_ops) * 100.0); if (($dicache_hits + $dicache_misses) != $dicache_ops) { printf(STAT "WARNING: Hits + Misses != Total Ops\n"); } printf(STAT "%-18s %8s %12s\n", Operation, Count, Percentage); printf(STAT "-----------------------------------------\n"); printf(STAT "%-18s %8d %9.1lf\n", Read, $dicache_reads, ($dicache_reads/ $dicache_ops) * 100.0); printf(STAT "\n%18s %8d %9.1lf\n", Hits, $dicache_read_hits, ($dicache_read_hits/$dicache_reads) * 100.0); printf(STAT "%18s %8d %9.1lf\n", Misses, $dicache_read_misses, ($dicache_read_misses/$dicache_reads) * 100.0); if ($dicache_read_hits + $dicache_read_misses != $dicache_reads) { printf(STAT "WARNING: Read Hits + Read Misses != Total Reads\n"); } printf(STAT "\n%-18s %8d %9.1lf\n", Write, $dicache_writes, ($dicache_writes/$dicache_ops) * 100.0);}sub DO_SW_QUEUE_STATS { print STAT "Software Queue Statistics\n\n"; if ($swqueue_final != 0) { print STAT "WARNING: SW Queue final count ($swqueue_final) is not 0!\n"; } printf(STAT "SW Queue requests returned to queue = %d\n", $swqueue_retries); printf(STAT "Requests NAKed because SW Queue count is full = %d\n", $swqueue_cancels); }sub DO_BUFFER_STATS { print STAT "Data Buffer Statistics\n\n"; printf(STAT "%-31s %5d\n", "Highest Data Buffer Used:", $greatest_buffer); printf(STAT "%-31s %5d\n", "Avg Highest Buffer Used:", $greatest_buffer_sum/ $numProcs); printf(STAT "%-31s %5d\n", "Avg PI Buffer Wait Latency:", $piBufferWaitLatency_sum/($numProcs*$latencyFactor)); printf(STAT "%-31s %5d\n", "Max PI Buffer Wait Latency:", $piBufferWaitLatency_max/$latencyFactor); printf(STAT "%-31s %5d\n", "Avg NI Req Buffer Wait Latency:", $niReqBufferWaitLatency_sum/($numProcs * $latencyFactor)); printf(STAT "%-31s %5d\n", "Max NI Req Buffer Wait Latency:", $niReqBufferWaitLatency_max/$latencyFactor); printf(STAT "%-31s %5d\n", "Avg NI Rep Buffer Wait Latency:", $niRepBufferWaitLatency_sum/($numProcs*$latencyFactor)); printf(STAT "%-31s %5d\n", "Max NI Rep Buffer Wait Latency:", $niRepBufferWaitLatency_max/$latencyFactor);} sub DO_QUEUE_STATS { print STAT "Queue Statistics\n\n"; printf(STAT "Maximum PI Input Queue Length = %d, Avg of Max = %d\n", $piInputQueue_max, $piInputQueue_max_sum/$numProcs); printf(STAT "Maximum NI Input Request Queue Length = %d, Avg of Max = %d\n", $niInputReqQueue_max, $niInputReqQueue_max_sum/$numProcs); printf(STAT "Maximum NI Input Reply Queue Length = %d, Avg of Max = %d\n", $niInputRepQueue_max, $niInputRepQueue_max_sum/$numProcs); printf(STAT "Maximum NI Output Request Queue Length = %d, Avg of Max = %d\n", $niOutputReqQueue_max, $niOutputReqQueue_max_sum/$numProcs); printf(STAT "Maximum NI Output Reply Queue Length = %d, Avg of Max = %d\n", $niOutputRepQueue_max, $niOutputRepQueue_max_sum/$numProcs); printf(STAT "\nPI Input Queue Histogram\n"); printf(STAT "%2s %5s %4s %4s %3s %3s %3s %3s %3s %3s %3s %3s %3s %3s %3s %3s %3s\n", P, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15); printf(STAT "----------------------------------------------------------------------\n"); foreach $i (0..$numProcs-1) { printf(STAT "p%x ", $i); foreach $j (0..0) { printf(STAT "%5d ", $piInputQueueHist{$i, $j}); } foreach $j (1..2) { printf(STAT "%4d ", $piInputQueueHist{$i, $j}); } foreach $j (3..15) { printf(STAT "%3d ", $piInputQueueHist{$i, $j}); } printf(STAT "\n"); } printf(STAT "\nNI Input Request Queue Histogram\n"); printf(STAT "%2s %5s %4s %4s %3s %3s %3s %3s %3s %3s %3s %3s %3s %3s %3s %3s %3s\n", P, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15); printf(STAT "----------------------------------------------------------------------\n"); foreach $i (0..$numProcs-1) { printf(STAT "p%x ", $i); foreach $j (0..0) { printf(STAT "%5d ", $niInputReqQueueHist{$i, $j}); } foreach $j (1..2) { printf(STAT "%4d ", $niInputReqQueueHist{$i, $j}); } foreach $j (3..15) { printf(STAT "%3d ", $niInputReqQueueHist{$i, $j}); } printf(STAT "\n"); } printf(STAT "\nNI Input Reply Queue Histogram\n"); printf(STAT "%2s %5s %4s %4s %3s %3s %3s %3s %3s %3s %3s %3s %3s %3s %3s %3s %3s\n", P, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15); printf(STAT "----------------------------------------------------------------------\n"); foreach $i (0..$numProcs-1) { printf(STAT "p%x ", $i); foreach $j (0..0) { printf(STAT "%5d ", $niInputRepQueueHist{$i, $j}); } foreach $j (1..2) { printf(STAT "%4d ", $niInputRepQueueHist{$i, $j}); } foreach $j (3..15) { printf(STAT "%3d ", $niInputRepQueueHist{$i, $j}); } printf(STAT "\n"); } printf(STAT "\nNI Output Request Queue Histogram\n"); printf(STAT "%2s %5s %4s %4s %3s %3s %3s %3s %3s %3s %3s %3s %3s %3s %3s %3s %3s\n", P, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15); printf(STAT "----------------------------------------------------------------------\n"); foreach $i (0..$numProcs-1) { printf(STAT "p%x ", $i); foreach $j (0..0) { printf(STAT "%5d ", $niOutputReqQueueHist{$i, $j}); } foreach $j (1..2) { printf(STAT "%4d ", $niOutputReqQueueHist{$i, $j}); } foreach $j (3..15) { printf(STAT "%3d ", $niOutputReqQueueHist{$i, $j}); } printf(STAT "\n"); } printf(STAT "\nNI Output Reply Queue Histogram\n"); printf(STAT "%2s %5s %4s %4s %3s %3s %3s %3s %3s %3s %3s %3s %3s %3s %3s %3s %3s\n", P, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15); printf(STAT "----------------------------------------------------------------------\n"); foreach $i (0..$numProcs-1) { printf(STAT "p%x ", $i); foreach $j (0..0) { printf(STAT "%5d ", $niOutputRepQueueHist{$i, $j}); } foreach $j (1..2) { printf(STAT "%4d ", $niOutputRepQueueHist{$i, $j}); } foreach $j (3..15) { printf(STAT "%3d ", $niOutputRepQueueHist{$i, $j}); } printf(STAT "\n"); } printf(STAT "\nRequest Network Queue Histogram\n"); printf(STAT "%2s %4s %4s %4s %4s %4s %4s %4s %4s %4s %4s\n", P, 0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20); printf(STAT "----------------------------------------------------------\n"); for ($i=0; $i < $numProcs; $i++) { printf(STAT "p%x ", $i); for ($j=0; $j < 20; $j +=2) { printf(STAT "%4d ", $reqNetworkQueueHist{$i, $j} + $reqNetworkQueueHist{$i, $j+1}); } printf(STAT "\n"); } printf(STAT "\nReply Network Queue Histogram\n"); printf(STAT "%2s %4s %4s %4s %4s %4s %4s %4s %4s %4s %4s\n", P, 0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20); printf(STAT "----------------------------------------------------------\n"); for ($i=0; $i < $numProcs; $i++) { printf(STAT "p%x ", $i); for ($j=0; $j < 20; $j +=2) { printf(STAT "%4d ", $repNetworkQueueHist{$i, $j} + $repNetworkQueueHist{$i, $j+1}); } printf(STAT "\n"); }}sub DO_MEMORY_STATS { if ($total_memory_ops_sum == 0) { return; } printf(STAT "Memory Ops\n\n"); printf(STAT "%-18s %8s %12s\n", Source, Count, Percentage); printf(STAT "-----------------------------------------\n"); printf(STAT "%-18s %8d %9.1lf\n", "Inbox from PI", $pi_memory_ops, ($pi_memory_ops/$total_memory_ops_sum) * 100.0); printf(STAT "%-18s %8d %9.1lf\n", "Inbox from NI", $ni_memory_ops, ($ni_memory_ops/$total_memory_ops_sum) * 100.0); printf(STAT "%-18s %8d %9.1lf\n", "DP Handler", $dp_memory_ops, ($dp_memory_ops/$total_memory_ops_sum) * 100.0); printf(STAT "%-18s %8d %9.1lf\n", "DD\$ Miss", $ddcache_misses, ($ddcache_misses/$total_memory_ops_sum) * 100.0); printf(STAT "%-18s %8d %9.1lf\n", "DD\$ Writeback", $ddcache_writebacks, ($ddcache_writebacks/$total_memory_ops_sum) * 100.0); printf(STAT "%-18s %8d %9.1lf\n", "DI\$ Miss", $dicache_misses, ($dicache_misses/$total_memory_ops_sum) * 100.0); printf(STAT "\nTotals %20d %9.1lf\n\n", $total_memory_ops_sum, 100.0); if (($pi_memory_ops + $ni_memory_ops + $dp_memory_ops + $ddcache_misses + $ddcache_writebacks + $dicache_misses) != $total_memory_ops_sum) { printf(STAT "\nWARNING: Memory Ops do not add to total\n"); } printf(STAT "%-18s %8s %12s\n", Operation, Count, Percentage); printf(STAT "-----------------------------------------\n"); printf(STAT "%-18s %8d %9.1lf\n", "Memory Reads", $memory_reads, ($memory_reads/$total_memory_ops_sum) * 100.0); printf(STAT "%18s %8d %9.1lf\n", "Useless Reads", $useless_reads, ($useless_reads/$memory_reads) * 100.0); printf(STAT "%18s %8d %9.1lf\n", "Appl Reads", $memory_reads - $useless_reads - $dir_memory_reads, (($memory_reads - $useless_reads - $dir_memory_reads)/$memory_reads) * 100.0); printf(STAT "%18s %8d %9.1lf\n", "Dir Reads", $dir_memory_reads, ($dir_memory_reads/$memory_reads) * 100.0); printf(STAT "\n%-18s %8d %9.1lf\n", "Memory Writes", $memory_writes, ($memory_writes/$total_memory_ops_sum) * 100.0); if ($memory_writes != 0) { printf(STAT "%18s %8d %9.1lf\n", "Appl Writes", $memory_writes - $dir_memory_writes, (($memory_writes - $dir_memory_writes)/ $memory_writes) * 100.0); printf(STAT "%18s %8d %9.1lf\n", "Dir Writes", $dir_memory_writes, ($dir_memory_writes/$memory_writes) * 100.0); } else { printf(STAT "%18s %8d %9.1lf\n", "Appl Writes", 0, 0, 0.0); printf(STAT "%18s %8d %9.1lf\n", "Dir Writes", 0, 0.0); } printf(STAT "Avg Memory Latency: %3d\n", $memLatency_sum/($numProcs * $latencyFactor)); printf(STAT "Max Memory Latency: %3d\n", $memLatency_max/$latencyFactor);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -