diff --git a/bin/CModelBTBAccuracy.sh b/bin/CModelBTBAccuracy.sh index 5cde4238c..e4a26fb85 100755 --- a/bin/CModelBTBAccuracy.sh +++ b/bin/CModelBTBAccuracy.sh @@ -52,6 +52,6 @@ do # with such long precision bc outputs onto multiple lines # must remove \n and \ from string Product=`echo "$Product" | tr -d '\n' | tr -d '\\\'` - GeoMean=`perl -E "say $Product**(1/$Count)"` + GeoMean=`perl -E "say $Product**(1/$Count) * 100"` echo "$Pred$Size $GeoMean" done diff --git a/bin/SeparateBranch.sh b/bin/SeparateBranch.sh index eb4ee4494..c81ba32c9 100755 --- a/bin/SeparateBranch.sh +++ b/bin/SeparateBranch.sh @@ -43,7 +43,8 @@ TrainLineNumberArray=($TrainLineNumbers) BeginLineNumberArray=($BeginLineNumbers) EndLineNumberArray=($EndLineNumbers) -mkdir -p branch +OutputPath=${File%%.*} +mkdir -p $OutputPath Length=${#EndLineNumberArray[@]} for i in $(seq 0 1 $((Length-1))) do @@ -51,5 +52,5 @@ do CurrTrain=$((${TrainLineNumberArray[$i]}+1)) CurrEnd=$((${EndLineNumberArray[$i]}-1)) echo $CurrName, $CurrTrain, $CurrEnd - sed -n "${CurrTrain},${CurrEnd}p" $File > branch/${CurrName}_branch.log + sed -n "${CurrTrain},${CurrEnd}p" $File > $OutputPath/${CurrName}_${File} done diff --git a/bin/parseHPMC.py b/bin/parseHPMC.py index bb6d2871e..a11296b3e 100755 --- a/bin/parseHPMC.py +++ b/bin/parseHPMC.py @@ -32,10 +32,12 @@ import math import numpy as np import argparse -RefData = [('twobitCModel6', 'twobitCModel', 64, 9.65280765420711), ('twobitCModel8', 'twobitCModel', 256, 8.75120245829945), ('twobitCModel10', 'twobitCModel', 1024, 8.1318382397263), +RefDataBP = [('twobitCModel6', 'twobitCModel', 64, 9.65280765420711), ('twobitCModel8', 'twobitCModel', 256, 8.75120245829945), ('twobitCModel10', 'twobitCModel', 1024, 8.1318382397263), ('twobitCModel12', 'twobitCModel', 4096, 7.53026646633342), ('twobitCModel14', 'twobitCModel', 16384, 6.07679338544009), ('twobitCModel16', 'twobitCModel', 65536, 6.07679338544009), ('gshareCModel6', 'gshareCModel', 64, 10.6602835418646), ('gshareCModel8', 'gshareCModel', 256, 8.38384710559667), ('gshareCModel10', 'gshareCModel', 1024, 6.36847432155534), ('gshareCModel12', 'gshareCModel', 4096, 3.91108491151983), ('gshareCModel14', 'gshareCModel', 16384, 2.83926519215395), ('gshareCModel16', 'gshareCModel', 65536, .60213659066941)] +RefDataBTB = [('BTBCModel6', 'BTBCModel', 64, 1.11806778745097), ('BTBCModel8', 'BTBCModel', 256, 0.183833943219956), ('BTBCModel10', 'BTBCModel', 1024, 0.0109271020749376), + ('BTBCModel12', 'BTBCModel', 4096, 0.00437600802791213), ('BTBCModel14', 'BTBCModel', 16384, 0.00188756234204305), ('BTBCModel16', 'BTBCModel', 65536, 0.00188756234204305)] def ParseBranchListFile(path): '''Take the path to the list of Questa Sim log files containing the performance counters outputs. File @@ -178,9 +180,11 @@ def ExtractSelectedData(benchmarkFirstList): benchmarkDict = { } for benchmark in benchmarkFirstList: (name, opt, config, prefixName, entries, dataDict) = benchmark - if opt == 'bd_speedopt_speed': NewName = name+'Sp' - elif opt == 'bd_sizeopt_speed': NewName = name+'Sz' - else: NewName = name + # use this code to distinguish speed opt and size opt. + #if opt == 'bd_speedopt_speed': NewName = name+'Sp' + #elif opt == 'bd_sizeopt_speed': NewName = name+'Sz' + #else: NewName = name + NewName = name #print(NewName) #NewName = name+'_'+opt if NewName in benchmarkDict: @@ -240,7 +244,7 @@ def ReportAsText(benchmarkDict): def Inversion(lst): return [x if not args.invert else 100 - x for x in lst] -def BarGraph(seriesDict, xlabelList, BenchPerRow, FileName): +def BarGraph(seriesDict, xlabelList, BenchPerRow, FileName, IncludeLegend): index = 0 NumberInGroup = len(seriesDict) # Figure out width of bars. NumberInGroup bars + want 2 bar space @@ -258,8 +262,8 @@ def BarGraph(seriesDict, xlabelList, BenchPerRow, FileName): plt.xticks([r + barWidth*(NumberInGroup/2-0.5) for r in range(0, BenchPerRow)], xlabelList) plt.xlabel('Benchmark') if(not args.invert): plt.ylabel('Misprediction Rate (%)') - else: plt.ylabel('Prediction Accuracy (%)') - plt.legend(loc='upper left', ncol=2) + else: plt.ylabel('Prediction Accuracy (%)') + if(IncludeLegend): plt.legend(loc='upper right', ncol=2) plt.savefig(FileName) def SelectPartition(xlabelListBig, seriesDictBig, group, BenchPerRow): @@ -348,13 +352,13 @@ def ReportAsGraph(benchmarkDict, bar): # index += 1 if(not args.summary): - size = len(benchmarkDict) - sizeSqrt = math.sqrt(size) - isSquare = math.isclose(sizeSqrt, round(sizeSqrt)) - numCol = math.floor(sizeSqrt) + NumBenchmarks = len(benchmarkDict) + NumBenchmarksSqrt = math.sqrt(NumBenchmarks) + isSquare = math.isclose(NumBenchmarksSqrt, round(NumBenchmarksSqrt)) + numCol = math.floor(NumBenchmarksSqrt) numRow = numCol + (0 if isSquare else 1) index = 1 - BenchPerRow = 7 + BenchPerRow = 5 xlabelList = [] seriesDict = {} @@ -383,11 +387,11 @@ def ReportAsGraph(benchmarkDict, bar): #The next step will be to split the benchmarkDict into length BenchPerRow pieces then repeat the following code # on each piece. - for row in range(0, math.ceil(39 / BenchPerRow)): + for row in range(0, math.ceil(NumBenchmarks / BenchPerRow)): (xlabelListTrunk, seriesDictTrunk) = SelectPartition(xlabelListBig, seriesDictBig, row, BenchPerRow) FileName = 'barSegment%d.png' % row groupLen = len(xlabelListTrunk) - BarGraph(seriesDictTrunk, xlabelListTrunk, groupLen, FileName) + BarGraph(seriesDictTrunk, xlabelListTrunk, groupLen, FileName, (row == 0)) # main @@ -436,7 +440,8 @@ performanceCounterList = BuildDataBase(predictorLogs) # builds a databas benchmarkFirstList = ReorderDataBase(performanceCounterList) # reorder first by benchmark then trace benchmarkDict = ExtractSelectedData(benchmarkFirstList) # filters to just the desired performance counter metric -if(args.reference): benchmarkDict['Mean'].extend(RefData) +if(args.reference and args.direction): benchmarkDict['Mean'].extend(RefDataBP) +if(args.reference and args.target): benchmarkDict['Mean'].extend(RefDataBTB) #print(benchmarkDict['Mean']) #print(benchmarkDict['aha-mont64Speed']) #print(benchmarkDict) diff --git a/linux/devicetree/wally-artya7.dts b/linux/devicetree/wally-artya7.dts index 6dab66c7b..1ad559bbc 100644 --- a/linux/devicetree/wally-artya7.dts +++ b/linux/devicetree/wally-artya7.dts @@ -31,6 +31,7 @@ status = "okay"; compatible = "riscv"; riscv,isa = "rv64imafdcsu"; + riscv,isa-extensions = "imafdc", "sstc", "svinval", "svnapot", "svpbmt", "zba", "zbb", "zbc", "zbs", "zicbom", "zicbop", "zicbopz", "zicntr", "zicsr", "zifencei", "zihpm"; mmu-type = "riscv,sv48"; interrupt-controller { diff --git a/linux/devicetree/wally-virt.dts b/linux/devicetree/wally-virt.dts index 7cc0f757a..edf602df3 100644 --- a/linux/devicetree/wally-virt.dts +++ b/linux/devicetree/wally-virt.dts @@ -31,6 +31,7 @@ status = "okay"; compatible = "riscv"; riscv,isa = "rv64imafdcsu"; + riscv,isa-extensions = "svadu"; mmu-type = "riscv,sv48"; interrupt-controller { diff --git a/sim/bpred-sim.py b/sim/bpred-sim.py index 209e21fc4..60af41298 100755 --- a/sim/bpred-sim.py +++ b/sim/bpred-sim.py @@ -102,7 +102,8 @@ def main(): if(args.direction): # for direction predictor size sweep bpdSize = [6, 8, 10, 12, 14, 16] - bpdType = ['twobit', 'gshare', 'global', 'gshare_basic', 'global_basic', 'local_basic'] + #bpdType = ['twobit', 'gshare', 'global', 'gshare_basic', 'global_basic', 'local_basic'] + bpdType = ['twobit', 'gshare'] for CurrBPType in bpdType: for CurrBPSize in bpdSize: name = CurrBPType+str(CurrBPSize) @@ -114,7 +115,20 @@ def main(): grepstr="") configs.append(tc) - if(args.target or args.iclass): + if(args.target): + # BTB and class size sweep + bpdSize = [6, 8, 10, 12, 14, 16] + for CurrBPSize in bpdSize: + name = 'BTB'+str(CurrBPSize) + configOptions = "+define+INSTR_CLASS_PRED=0 +define+BPRED_OVERRIDE +define+BPRED_TYPE=\`BP_GSHARE" + "+define+BPRED_SIZE=16" + "+define+RAS_SIZE=16+define+BTB_SIZE=" + str(CurrBPSize) + "+define+BTB_OVERRIDE" + tc = TestCase( + name=name, + variant="rv32gc", + cmd="vsim > {} -c <