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,45 +74,92 @@ 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):
'''Extract preformance counters from a modelsim log. Outputs a list of tuples for each test/benchmark.
The tuple contains the test name, optimization characteristics, and dictionary of performance counters.'''
# 1 find lines with Read memfile and extract test name
# 2 parse counters into a list of (name, value) tuples (dictionary maybe?)
benchmarks = []
transcript = open(fileName, 'r')
HPMClist = { }
testName = ''
for line in transcript.readlines():
lineToken = line.split()
if(len(lineToken) > 3 and lineToken[1] == 'Read' and lineToken[2] == 'memfile'):
opt = lineToken[3].split('/')[-4]
testName = lineToken[3].split('/')[-1].split('.')[0]
HPMClist = { }
elif(len(lineToken) > 4 and lineToken[1][0:3] == 'Cnt'):
countToken = line.split('=')[1].split()
value = countToken[0]
name = ' '.join(countToken[1:])
HPMClist[name] = value
elif ('is done' in line):
benchmarks.append((testName, opt, HPMClist))
return benchmarks
# 1 find lines with Read memfile and extract test name def FormatToPlot(currBenchmark):
# 2 parse counters into a list of (name, value) tuples (dictionary maybe?) names = []
# 3 process into useful data values = []
# cache hit rates for config in currBenchmark:
# cache fill time print ('config' , config)
# branch predictor status names.append(config[0])
# hazard counts values.append(config[1])
# CPI return (names, values)
# instruction distribution
# steps 1 and 2 if(sys.argv[1] == '-b'):
benchmarks = [] configList = []
transcript = open(sys.argv[1], 'r') for config in sys.argv[2::]:
HPMClist = { } benchmarks = ProcessFile(config)
testName = '' ComputeAll(benchmarks)
for line in transcript.readlines(): configList.append((config.split('.')[0], benchmarks))
lineToken = line.split()
if(len(lineToken) > 3 and lineToken[1] == 'Read' and lineToken[2] == 'memfile'):
opt = lineToken[3].split('/')[-4]
testName = lineToken[3].split('/')[-1].split('.')[0]
HPMClist = { }
elif(len(lineToken) > 4 and lineToken[1][0:3] == 'Cnt'):
countToken = line.split('=')[1].split()
value = countToken[0]
name = ' '.join(countToken[1:])
HPMClist[name] = value
elif ('is done' in line):
benchmarks.append((testName, opt, HPMClist))
#print(benchmarks[0]) # 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))
for benchmark in benchmarks: # now extract all branch prediction direction miss rates for each
ComputeCPI(benchmark) # namestring + opt, config
ComputeBranchDirMissRate(benchmark) benchmarkDict = { }
ComputeBranchTargetMissRate(benchmark) for benchmark in benchmarkAll:
ComputeRASMissRate(benchmark) (name, opt, config, dataDict) = benchmark
ComputeInstrClassMissRate(benchmark) if name+'_'+opt in benchmarkDict:
ComputeICacheMissRate(benchmark) benchmarkDict[name+'_'+opt].append((config, dataDict['BDMR']))
ComputeDCacheMissRate(benchmark) else:
printStats(benchmark) 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)