Fancy plot for branch predictor.

This commit is contained in:
Ross Thompson 2023-01-06 18:04:49 -06:00
parent f119b492bb
commit c1c4024b4b

View File

@ -2,6 +2,7 @@
import os import os
import sys import sys
import matplotlib.pyplot as plt
def ComputeCPI(benchmark): def ComputeCPI(benchmark):
'Computes and inserts CPI into benchmark stats.' 'Computes and inserts CPI into benchmark stats.'
@ -46,6 +47,15 @@ def ComputeDCacheMissRate(benchmark):
DCacheMR = 100.0 * int(dataDict['D Cache Miss']) / int(dataDict['D Cache Access']) DCacheMR = 100.0 * int(dataDict['D Cache Miss']) / int(dataDict['D Cache Access'])
dataDict['DCacheMR'] = DCacheMR dataDict['DCacheMR'] = DCacheMR
def ComputeAll(benchmarks):
for benchmark in benchmarks:
ComputeCPI(benchmark)
ComputeBranchDirMissRate(benchmark)
ComputeBranchTargetMissRate(benchmark)
ComputeRASMissRate(benchmark)
ComputeInstrClassMissRate(benchmark)
ComputeICacheMissRate(benchmark)
ComputeDCacheMissRate(benchmark)
def printStats(benchmark): def printStats(benchmark):
(nameString, opt, dataDict) = benchmark (nameString, opt, dataDict) = benchmark
@ -64,23 +74,16 @@ def printStats(benchmark):
print('D Cache Miss Rate %1.4f' % dataDict['DCacheMR']) print('D Cache Miss Rate %1.4f' % dataDict['DCacheMR'])
print() print()
def ProcessFile(fileName):
# 1 find lines with Read memfile and extract test name '''Extract preformance counters from a modelsim log. Outputs a list of tuples for each test/benchmark.
# 2 parse counters into a list of (name, value) tuples (dictionary maybe?) The tuple contains the test name, optimization characteristics, and dictionary of performance counters.'''
# 3 process into useful data # 1 find lines with Read memfile and extract test name
# cache hit rates # 2 parse counters into a list of (name, value) tuples (dictionary maybe?)
# cache fill time benchmarks = []
# branch predictor status transcript = open(fileName, 'r')
# hazard counts HPMClist = { }
# CPI testName = ''
# instruction distribution for line in transcript.readlines():
# steps 1 and 2
benchmarks = []
transcript = open(sys.argv[1], 'r')
HPMClist = { }
testName = ''
for line in transcript.readlines():
lineToken = line.split() lineToken = line.split()
if(len(lineToken) > 3 and lineToken[1] == 'Read' and lineToken[2] == 'memfile'): if(len(lineToken) > 3 and lineToken[1] == 'Read' and lineToken[2] == 'memfile'):
opt = lineToken[3].split('/')[-4] opt = lineToken[3].split('/')[-4]
@ -93,16 +96,70 @@ for line in transcript.readlines():
HPMClist[name] = value HPMClist[name] = value
elif ('is done' in line): elif ('is done' in line):
benchmarks.append((testName, opt, HPMClist)) benchmarks.append((testName, opt, HPMClist))
return benchmarks
#print(benchmarks[0]) def FormatToPlot(currBenchmark):
names = []
values = []
for config in currBenchmark:
print ('config' , config)
names.append(config[0])
values.append(config[1])
return (names, values)
for benchmark in benchmarks: if(sys.argv[1] == '-b'):
ComputeCPI(benchmark) configList = []
ComputeBranchDirMissRate(benchmark) for config in sys.argv[2::]:
ComputeBranchTargetMissRate(benchmark) benchmarks = ProcessFile(config)
ComputeRASMissRate(benchmark) ComputeAll(benchmarks)
ComputeInstrClassMissRate(benchmark) configList.append((config.split('.')[0], benchmarks))
ComputeICacheMissRate(benchmark)
ComputeDCacheMissRate(benchmark) # Merge all configruations into a single list
benchmarkAll = []
for (config, benchmarks) in configList:
print(config)
for benchmark in benchmarks:
(nameString, opt, dataDict) = benchmark
benchmarkAll.append((nameString, opt, config, dataDict))
# now extract all branch prediction direction miss rates for each
# namestring + opt, config
benchmarkDict = { }
for benchmark in benchmarkAll:
(name, opt, config, dataDict) = benchmark
if name+'_'+opt in benchmarkDict:
benchmarkDict[name+'_'+opt].append((config, dataDict['BDMR']))
else:
benchmarkDict[name+'_'+opt] = [(config, dataDict['BDMR'])]
size = len(benchmarkDict)
index = 1
print('Number of plots', size)
for benchmarkName in benchmarkDict:
currBenchmark = benchmarkDict[benchmarkName]
(names, values) = FormatToPlot(currBenchmark)
print(names, values)
plt.subplot(6, 7, index)
plt.bar(names, values)
plt.title(benchmarkName)
plt.ylabel('BR Dir Miss Rate (%)')
#plt.xlabel('Predictor')
index += 1
#plt.tight_layout()
plt.show()
else:
# steps 1 and 2
benchmarks = ProcessFile(sys.argv[1])
# 3 process into useful data
# cache hit rates
# cache fill time
# branch predictor status
# hazard counts
# CPI
# instruction distribution
ComputeAll(benchmarks)
for benchmark in benchmarks:
printStats(benchmark) printStats(benchmark)