mirror of
				https://github.com/openhwgroup/cvw
				synced 2025-02-11 06:05:49 +00:00 
			
		
		
		
	Fancy plot for branch predictor.
This commit is contained in:
		
							parent
							
								
									f119b492bb
								
							
						
					
					
						commit
						c1c4024b4b
					
				
							
								
								
									
										133
									
								
								bin/parseHPMC.py
									
									
									
									
									
								
							
							
						
						
									
										133
									
								
								bin/parseHPMC.py
									
									
									
									
									
								
							@ -2,6 +2,7 @@
 | 
			
		||||
 | 
			
		||||
import os
 | 
			
		||||
import sys
 | 
			
		||||
import matplotlib.pyplot as plt
 | 
			
		||||
 | 
			
		||||
def ComputeCPI(benchmark):
 | 
			
		||||
    'Computes and inserts CPI into benchmark stats.'
 | 
			
		||||
@ -45,7 +46,16 @@ def ComputeDCacheMissRate(benchmark):
 | 
			
		||||
    (nameString, opt, dataDict) = benchmark
 | 
			
		||||
    DCacheMR = 100.0 * int(dataDict['D Cache Miss']) / int(dataDict['D Cache Access'])
 | 
			
		||||
    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):
 | 
			
		||||
    (nameString, opt, dataDict) = benchmark
 | 
			
		||||
@ -64,45 +74,92 @@ def printStats(benchmark):
 | 
			
		||||
    print('D Cache Miss Rate  %1.4f' % dataDict['DCacheMR'])
 | 
			
		||||
    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
 | 
			
		||||
# 2 parse counters into a list of (name, value) tuples (dictionary maybe?)
 | 
			
		||||
# 3 process into useful data
 | 
			
		||||
  # cache hit rates
 | 
			
		||||
  # cache fill time
 | 
			
		||||
  # branch predictor status
 | 
			
		||||
  # hazard counts
 | 
			
		||||
  # CPI
 | 
			
		||||
  # instruction distribution
 | 
			
		||||
def FormatToPlot(currBenchmark):
 | 
			
		||||
    names = []
 | 
			
		||||
    values = []
 | 
			
		||||
    for config in currBenchmark:
 | 
			
		||||
        print ('config' , config)
 | 
			
		||||
        names.append(config[0])
 | 
			
		||||
        values.append(config[1])
 | 
			
		||||
    return (names, values)
 | 
			
		||||
 | 
			
		||||
# steps 1 and 2
 | 
			
		||||
benchmarks = []
 | 
			
		||||
transcript = open(sys.argv[1], '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))
 | 
			
		||||
if(sys.argv[1] == '-b'):
 | 
			
		||||
    configList = []
 | 
			
		||||
    for config in sys.argv[2::]:
 | 
			
		||||
        benchmarks = ProcessFile(config)
 | 
			
		||||
        ComputeAll(benchmarks)
 | 
			
		||||
        configList.append((config.split('.')[0], benchmarks))
 | 
			
		||||
 | 
			
		||||
#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:
 | 
			
		||||
    ComputeCPI(benchmark)
 | 
			
		||||
    ComputeBranchDirMissRate(benchmark)
 | 
			
		||||
    ComputeBranchTargetMissRate(benchmark)
 | 
			
		||||
    ComputeRASMissRate(benchmark)
 | 
			
		||||
    ComputeInstrClassMissRate(benchmark)
 | 
			
		||||
    ComputeICacheMissRate(benchmark)
 | 
			
		||||
    ComputeDCacheMissRate(benchmark)
 | 
			
		||||
    printStats(benchmark)
 | 
			
		||||
    # 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)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user