📄 mipsy_stats.pl
字号:
#&DO_MEMORY_STATS();exit(0);################################################################## Procedures that manipulate and print the scanned in numbers#################################################################sub numerically { $a <=> $b;}sub div { my $x = shift; my $y = shift; if ($y == 0) { return 0.0; } else { return $x/$y; }}sub PRINT_DIVIDER { printf("\n********************************************************\n");}sub DO_HEADER_INFO { printf("****************************\n"); printf("* MIPSY SIMULATION RESULTS *\n"); printf("****************************\n"); printf("Simulation Call: %s\n", $invocation); printf("Simulation Host: %s\n", $hostName); printf("Simulation Date: %s\n\n", $date); $simulationTime = $endTime - $startTime; printf("Simulation Time: %d Hours %d Minutes %d Seconds\n", $simulationTime/3600, ($simulationTime/60)%60, $simulationTime % 60); printf("Average KIPs: %.2lf\n", &div($instCount,$simulationTime) / 1000);}sub DO_SUMMARY_STATS { printf("Total Instructions: %8.0lf\n", $instCount); printf("(Floating Point): %8.0lf\n", $fpInstCount); printf("(Bdoor Insts): %8.0lf\n\n", $bdoorInstCount); printf("Total Cycles: %.0lf\n", $cycleCount); for ($cpu = 0; $cpu <= $numCpus; $cpu++) { printf("\nCPU %d\n*******\n", $cpu); printf("Total Instructions: %8.0lf (%.2lf%%)\n", $instCount[$cpu], 100.0 * &div($instCount[$cpu], $instCount)); printf("Halted Cycles: %8.0lf (%.2lf%%)\n", $haltedTime[$cpu], 100.0 * &div($haltedTime[$cpu], $cycleCount)); $totalStall[$cpu] = $cacheStall[$cpu] + $libcWait[$cpu]; printf("Total Stall Cycles: %8.0lf (%.2lf%%)\n", $totalStall[$cpu], 100.0 * &div($cacheStall[$cpu], $cycleCount)); printf(" (Libc Wait): %12.0lf (%.2lf%%)\n", $libcWait[$cpu], 100.0 * &div($libcWait[$cpu], $totalStall[$cpu])); }}sub DO_PCACHE_STATS { printf("\n1st Level Instruction Cache\n"); printf("***************************\n"); printf("Size = %s\t Line Size = %d\n", $icacheSize, $icacheLine); if ($icacheAssoc == 1) { printf("Direct-Mapped\n\n"); } else { printf("%d-way set associative\n\n", $icacheAssoc); } printf("%-25s %9s %12s\n", Operation, Count, Percentage); printf("------------------------------------------------\n"); printf("%-25s %9d %11.2f%%\n", Refs, $totalIRefs, 100.0); for ($cpu = 0; $cpu <= $numCpus; $cpu++) { printf(" CPU %d %27.0lf %11.2lf%%\n", $cpu, $iRefs[$cpu], 100.0 * &div($iRefs[$cpu], $totalIRefs)); } printf("%-25s %9d %11.2f%%\n", Misses, $totalIMisses, 100.0 * &div($totalIMisses,$totalIRefs)); for ($cpu = 0; $cpu <= $numCpus; $cpu++) { printf(" CPU %d %27.0lf %11.2lf%%\n", $cpu, $iMisses[$cpu], 100.0 * &div($iMisses[$cpu], $iRefs[$cpu])); } printf("\n1st Level Data Cache\n"); printf("*********************\n"); printf("Size = %s\tLine Size = %d\n", $dcacheSize, $dcacheLine); if ($dcacheAssoc == 1) { printf("Direct-Mapped\n\n"); } else { printf("%d-way set associative\n\n", $dcacheAssoc); } printf("%-25s %9s %12s\n", Operation, Count, Percentage); printf("------------------------------------------------\n"); $totalDRefs = $totalDReads + $totalDWrites; printf("%-25s %9d %11.2f%%\n", Refs, $totalDRefs, 100.0); printf("%-25s %9d %11.2f%%\n", Reads, $totalDReads, 100.0* &div($totalDReads,$totalDRefs)); printf("%-25s %9d %11.2f%%\n", Writes, $totalDWrites, 100.0* &div($totalDWrites,$totalDRefs)); printf("%-25s %9d %11.2f%%\n", ReadMisses, $totalDReadMisses, 100.0* &div($totalDReadMisses,$totalDReads)); for ($cpu = 0; $cpu <= $numCpus; $cpu++) { printf(" CPU %d %27.0lf %11.2lf%%\n", $cpu, $dReadMisses[$cpu], 100.0 * &div($dReadMisses[$cpu], $dReads[$cpu])); } printf("%-25s %9d %11.2f%%\n", WriteMisses, $totalDWriteMisses, 100.0* &div($totalDWriteMisses,$totalDWrites)); for ($cpu = 0; $cpu <= $numCpus; $cpu++) { printf(" CPU %d %27.0lf %11.2lf%%\n", $cpu, $dWriteMisses[$cpu], 100.0 * &div($dWriteMisses[$cpu], $dWrites[$cpu])); } printf("%-25s %9d %11.2f%%\n", Upgrades, $totalUpgrades, 100); }sub DO_SCACHE_STATS { printf("\n2nd Level Unified Cache\n"); printf("************************\n"); printf("Size = %s\tLine Size = %d\n", $scacheSize, $scacheLine); if ($scacheAssoc == 1) { printf("Direct-Mapped\n\n"); } else { printf("%d-way set associative\n\n", $scacheAssoc); } printf("%-25s %9s %12s\n", Operation, Count, Percentage); printf("------------------------------------------------\n"); $totalSIGets = $totalSIGets - $totalSIGetMHTRetries; $totalSDGets = $totalSDGets - $totalDGetRetries - $totalSDGetMHTRetries; # WATCH OUT FOR THIS! # some things start as a getx for the l2 and then they # need an upgrade. If the upgrade has an MHT conflict # then future retries count as SDUGetXMHTRetries. $totalSDGetXs = $totalSDGetXs - $totalDGetXRetries - $totalSDGetXMHTRetries - $totalSDUGetXMHTRetries; $totalSRefs = $totalSIGets + $totalSDGets + $totalSDGetXs; $totalL1Misses = $totalDReadMisses + $totalDWriteMisses + $totalIMisses; if ($totalSRefs != $totalL1Misses) { printf(" WARNING: L1 Misses = %d\t L2 Refs = %d\n", $totalL1Misses, $totalSRefs); } printf("%-25s %9d %11.2f%%\n", Refs, $totalSRefs, 100.0); if ($totalSIGets != $totalIMisses) { printf(" WARNING: L1 I Misses = %d\t L2 I Refs = %d\n", $totalIMisses, $totalSIGets); } printf("%-25s %9d %11.2f%%\n", IGets, $totalSIGets, 100.0 * &div($totalSIGets,$totalSRefs)); if ($totalSDGets != $totalDReadMisses) { printf(" WARNING: L1 D Misses = %d\t L2 DGets = %d\n", $totalDReadMisses, $totalSDGets); } printf("%-25s %9d %11.2f%%\n", DGets, $totalSDGets, 100.0 * &div($totalSDGets,$totalSRefs)); if ($totalSDGetXs != $totalDWriteMisses) { printf(" WARNING: L1 D Write Misses = %d\t L2 DGetXs = %d\n", $totalDWriteMisses, $totalSDGetXs); } printf("%-25s %9d %11.2f%%\n", DGetXs, $totalSDGetXs, 100.0 * &div($totalSDGetXs,$totalSRefs)); printf("%-25s %9d %11.2f%%\n", IGetMisses, $totalSIGetMisses, 100.0 * &div($totalSIGetMisses,$totalSIGets)); for ($cpu = 0; $cpu <= $numCpus; $cpu++) { printf(" CPU %d %27.0lf %11.2lf%%\n", $cpu, $sIGetMisses[$cpu], 100.0 * &div($sIGetMisses[$cpu], $sIGets[$cpu])); } printf("%-25s %9d %11.2f%%\n", DGetMisses, $totalSDGetMisses, 100.0 * &div($totalSDGetMisses,$totalSDGets)); for ($cpu = 0; $cpu <= $numCpus; $cpu++) { printf(" CPU %d %27.0lf %11.2lf%%\n", $cpu, $sDGetMisses[$cpu], 100.0 * &div($sDGetMisses[$cpu], $sDGets[$cpu])); } printf("%-25s %9d %11.2f%%\n", DGetXMisses, $totalSDGetXMisses, 100.0 * &div($totalSDGetXMisses,$totalSDGetXs)); for ($cpu = 0; $cpu <= $numCpus; $cpu++) { printf(" CPU %d %27.0lf %11.2lf%%\n", $cpu, $sDGetXMisses[$cpu], 100.0 * &div($sDGetXMisses[$cpu], $sDGetXs[$cpu])); } printf("\n%-25s %9d %11.2f%%\n", "Upgrade Refs", $totalSUpgradeRefs, 100); printf("%-25s %9d %11.2f%%\n", "Upgrade Misses", $totalSUpgradeMisses, 100.0 * &div($totalSUpgradeMisses,$totalSUpgradeRefs)); printf("\n%-25s %9d\n", "IGet NAKed Retries", $totalIGetRetries); printf("%-25s %9d\n", "DGet NAKed Retries", $totalDGetRetries); printf("%-25s %9d\n", "DGetX NAKed Retries", $totalDGetXRetries); printf("%-25s %9d\n", "IGet MHT Retries", $totalSIGetMHTRetries); printf("%-25s %9d\n", "DGet MHT Retries", $totalSDGetMHTRetries); printf("%-25s %9d\n", "DGetX MHT Retries", $totalSDGetXMHTRetries); printf("%-25s %9d\n", "DUGetX MHT Retries", $totalSDUGetXMHTRetries);}sub DO_PREFETCH_STATS { printf("Prefetch Stats\n"); printf("**************\n\n"); $totalPrefs = $prefetches + $prefetchXs; printf("%-25s %9s %12s\n", Operation, Count, Percentage); printf("------------------------------------------------\n"); printf("%-25s %9d %9.1lf", "Total Prefetches", $totalPrefs, 100.0); printf("\n%-25s %9d %9.1lf", "Prefetch", $prefetches, 100.0 * &div($prefetches,$totalPrefs)); printf("\n%-25s %9d %9.1lf", "Prefetch TLB Miss", $prefetchTLBMisses, 100.0*&div($prefetchTLBMisses,$prefetches)); printf("\n%-25s %9d %9.1lf", "Prefetch L1-Hits", $prefetchL1Hits, 100.0*&div($prefetchL1Hits,$prefetches)); printf("\n%-25s %9d %9.1lf", "Prefetch L2-Hits", $prefetchL2Hits, 100.0*&div($prefetchL2Hits,$prefetches)); printf("\n%-25s %9d %9.1lf", "Prefetch Merges", $prefetchMerges, 100.0*&div($prefetchMerges,$prefetches)); printf("\n%-25s %9d %9.1lf", "Prefetch Upgrades", $prefetchUpgrades, 100.0*&div($prefetchUpgrades,$prefetches)); printf("\n%-25s %9d %9.1lf", "Prefetch Stalls", $prefetchStalls, 100.0*&div($prefetchStalls,$prefetches)); printf("\n\n%-25s %9d %9.1lf", "Prefetch Exclusive", $prefetchXs, 100.0*&div($prefetchXs,$totalPrefs)); printf("\n%-25s %9d %9.1lf", "PrefetchX TLB Miss", 100.0*$prefetchXTLBMisses, &div($prefetchXTLBMisses,$prefetchXs)); printf("\n%-25s %9d %9.1lf", "PrefetchX L1-Hits", $prefetchXL1Hits, 100.0*&div($prefetchXL1Hits,$prefetchXs)); printf("\n%-25s %9d %9.1lf", "PrefetchX L2-Hits", $prefetchXL2Hits, 100.0*&div($prefetchXL2Hits,$prefetchXs)); printf("\n%-25s %9d %9.1lf", "PrefetchX Merges", $prefetchXMerges, 100.0*&div($prefetchXMerges,$prefetchXs)); printf("\n%-25s %9d %9.1lf", "PrefetchX Upgrades", $prefetchXUpgrades, 100.0*&div($prefetchXUpgrades,$prefetches)); printf("\n%-25s %9d %9.1lf", "PrefetchX Stalls", $prefetchXStalls, 100.0*&div($prefetchXStalls,$prefetches));}sub DO_MEMORY_STATS { printf("Memory Stats\n"); printf("============\n"); printf("Memory System = $memSys\n"); printf("Sync Op Stall Time %9.2f\n", $syncOpStallTime); if ($memSys eq "Uma") { printf("Bonus -> used uma\n"); }# print("Mem%d: Gets %d/%d Getx %d/%d Upgrades %d/%d wback %d rhints %d\n",}sub DO_SYNC_STATS { printf("Sync Stats\n"); printf("==========\n\n"); printf("%-25s %9s %12s\n", Operation, Count, "Avg. Cycles"); printf("------------------------------------------------\n"); if ($locks != $statsLocks) { printf(" Warning: lock counts (%d) don't match stats count (%d)\n", $locks, $statsLocks); } if ($locks != $unlocks) { printf(" Warning: lock counts (%d) don't match unlocks (%d)\n", $locks, $unlocks); } if ($locks != 0) { printf("%-25s %9d %12.2f\n", "Locks", $locks, $statsLockTime/$locks); } else { printf("%-25s %9d %12.2f\n", "Locks", $locks, 0); } for ($cpu=0; $cpu <= $numCpus; $cpu++) { printf(" CPU %d\n", $cpu); if ($locks[$cpu] != 0) { printf(" Grabs %24d %12.2f\n", $locks[$cpu], $statsLockTime[$cpu]/$locks[$cpu]); } else { printf(" Grabs %24d %12.2f\n", $locks[$cpu], 0); } printf(" Retries %24d\n", $retries[$cpu]); } if ($barriers != $statsBarriers) { printf(" Warning: barr counts (%d) don't match stats count (%d)\n", $Locks, $statsBarriers); } if ($barriers != 0) { printf("\n%-25s %9d %12.2f\n", "Barriers", $barriers, $statsBarrTime/$barriers); } else { printf("\n%-25s %9d \n", "Barriers", $barriers, 0); } for ($cpu=0; $cpu <= $numCpus; $cpu++) { printf(" CPU %d\n", $cpu); if ($barriers[$cpu] != 0) { printf(" Barriers %23d %12.2f\n", $barriers[$cpu], $statsBarrTime[$cpu]/$barriers[$cpu]); } }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -