FPGA evaluation

5 minute read

Published:

基于BOOM FPGA的乱序CPU微架构流水线内部参数评测

评测目标

  1. 修改物理寄存器数量,观测处理器相关参数及整体性能变化。预期会观察到,在以计算为主的测试程序中,处理器的性能会随着数量增加而提升。
  2. 修改ROB条目数,观测处理器相关参数及整体性能变化。预期会观察到,在条件判断较多的控制密集型测试程序中,处理器的性能会随着数量增加而提升。
  3. 修改发射宽度,观测处理器相关参数及整体性能变化。
  4. 修改发射队列条目数,观测处理器相关参数及整体性能变化。

评测方法

​ 控制变量法:使用FPGA,修改BOOM架构的流水线内部参数,模拟测评程序在不同参数配置下的运行情况,对比结果,并进行分析。

评测环境

MediumBOOM参数(默认)

ParametersValues
issueWidth1+2+1
numIssueEntries12+20+16
numRobEntries64
numIntPhysRegisters80
numFpPhysRegisters64

评测基准

  • coremark

    类似于MIPS、Dhrystone,是目前在嵌入式CPU行业中普遍公认的性能测试指标标准。作为综合型基准评测程序,它提供一套测试单核处理器核心的方法。测试标准是在配置参数的组合下单位时间内运行的CoreMark程序次数(单位:CoreMark/MHz),该数字值越大则说明测试的性能越好,CoreMark具有特定的运行和报告规则,可以避免由于所使用的编译库不同而导致的测试结果难以比较。

    run sh script

    ./coremark 
    

    RISCV汇编代码文件

  • SPEC CPU2006

    • 计算密集型

      • gobmk(445)

        模拟量子计算机的库文件,用来进行量子计算机应用的研究

        run sh script

        #!/bin/sh
         ./gobmk --quiet --mode gtp  < 13x13.tst 
        

        RISCV汇编代码文件

    • 控制密集型

    • I/0密集型

      • h264ref(464)

        处理编解码,需要读入较大的输入文件。

        run sh script

        #!/bin/sh
        ./h264ref -d foreman_ref_encoder_baseline.cfg 
        

编译选项

riscv64-unknown-elf-gcc/riscv64-unknown-linux-gnu-gcc -static -O2 -o <target> <src> -lm

如果是C++源文件,则使用相应的g++编译器,都是静态编译,统一使用版本为9.2.0的编译器,2级编译优化。

评测指标

​ 由于本测评修改了寄存器数量,ROB条目和发射宽度和发射队列条目,因此主要选择了以下11个硬件性能事件作为评测指标,使用HPC性能计数器进行统计。

  • cycle

  • inst

  • int physical register full

  • fp physical register full

  • mem issued insts

  • int issued insts

  • fp issued insts

  • mem issue queue full

  • int issue queue full

  • fp issue queue full

  • rob queue full

事件信号设计

  • Event Set # 0

  • sigs

    	  used_event_sigs(0) := 1.U  //cycles
          used_event_sigs(1) := RegNext(PopCount(rob.io.commit.arch_valids.asUInt)) // commit inst
          used_event_sigs(2) := Mux(rename_stage.io.fl_full, 1.U, 0.U) //int physical reg
          used_event_sigs(3) := Mux(fp_rename_stage.io.fl_full, 1.U, 0.U)             //fp physical reg
          used_event_sigs(4) := RegNext(PopCount(mem_iss_unit.io.iss_valids))
          used_event_sigs(5) := RegNext(PopCount(int_iss_unit.io.iss_valids))
          used_event_sigs(6) := RegNext(PopCount(fp_pipeline.io.debug_iss_valids))
          used_event_sigs(7) := Mux(mem_iss_unit.io.event_empty, 1.U, 0.U)
          used_event_sigs(8) := Mux(int_iss_unit.io.event_empty, 1.U, 0.U)
          used_event_sigs(9) := Mux(fp_pipeline.io.debug_issue_full, 1.U, 0.U)
          used_event_sigs(10) := Mux(rob.io.full, 1.U, 0.U)
    

评测结果

Coremark

大致运行时间

real 6m44.374s user 6m37.770s sys 0m0.421s

下表为修改ROB条目数的参数后的性能及相关事件统计

numRobEntries3264(default)128256
Cycles5594704794559431386555933912665592532452
Insts7540616951754033107575436022947540935088
IPC1.347811.347861.348661.34839
ROBFullEvents8255298821408981168758119870

下表为修改整数型物理寄存器数目的参数后的性能及相关事件统计

numIntPhysRegisters4080(default)160240
Cycles5606932248559431386555954362355594944873
Insts7541012941754033107575419082357541351022
IPC1.344941.347861.347871.34789
int physical register full9062595904776490030628992927

下表为修改浮点型物理寄存器数目的参数后的性能及相关事件统计

numFpPhysRegisters64(default)128256
Cycles559431386555934111435591838351
Insts754033107575643331927563500179
IPC1.347861.352361.35259
int physical register full816377994981632338358161314056

下表为修改发射宽度的参数后的性能及相关事件统计

issueWidth34(default)8
Cycles566678371655943138655595110396
Insts756434187475403310757541673369
IPC1.334861.347861.34790
int issued insts826396348826311129826288960

下表为修改发射队列条目数的参数后的性能及相关事件统计

numIssueEntriesx0.5x1(default)x2x4
Cycles5668226006559431386555899515835546173877
Insts7564427145754033107575824967327541407366
IPC1.334531.347861.356451.35974
int issue queue full5699951560566822602156567116765613067533

gcc

大致运行时间

real 66m56.734s user 65m26.152s sys 0m34.367s

下表为修改ROB条目数的参数后的性能及相关事件统计

numRobEntries3264(default)128256
Cycles199288756030199124845509198834670025198827305424
Insts94502436086944707792129442594233494437067943
IPC0.474200.474430.474900.47497
ROBFullEvents1574446500156889979415672330141567189182

下表为修改整数型物理寄存器数目的参数后的性能及相关事件统计

numIntPhysRegisters4080(default)160240
Cycles199156632317199124845509198911791181198665685926
Insts94471850595944707792129441444886694334618017
IPC0.474360.474430.474650.47484
int physical register full1111783791111028925111010442541098553797

下表为修改发射宽度的参数后的性能及相关事件统计

issueWidth34(default)8
Cycles199774084753199124845509198875463450
Insts944428708939447077921294472237476
IPC0.472750.474430.47503
int issued insts747306961647472911990374688439884

下表为修改issue queue条目参数后的性能及相关事件统计

numIssueEntriesx0.5x1(default)x2x4
Cycles199246482561199124845509198823107402198515428402
Insts94492871766944707792129446034858194343987469
IPC0.474250.474430.475100.47525
issue queue full199146482580198911791196198823107404198515428396

gobmk

大致运行时间

real 151m28.938s user 149m15.153s sys 0m14.211s

下表为修改ROB条目参数后的性能及相关事件统计

numRobEntries3264(default)128256
Cycles457891450149457753288117456972651103456920677366
Insts277235262250277380926772277452130079277421114121
IPC0.605460.605960.6071520.607152
ROBFullEvents11183883098111759164021117536118611168618400

下表为修改整数型物理寄存器数目的参数后的性能及相关事件统计

numIntPhysRegisters4080(default)160240
Cycles457907506585457753288117457026310354457029925557
Insts277368826051277380926772277388547541277409423998
IPC0.605730.605960.606940.60698
int physical register full5796169458575986472057536952925747932880

下表为修改发射宽度的参数后的性能及相关事件统计

issueWidth34(default)8
Cycles467099997281457753288117456762965262
Insts281548452595277380926772277441826646
IPC0.602760.605960.60741
int issued insts149868727403146108078728145721540777

下表为修改issue queue条目参数后的性能及相关事件统计

numIssueEntriesx0.5x1(default)x2x4
Cycles458888320882457753288117457285954735469077735725
Insts277483873995277380926772277514652230284622508407
IPC0.604690.605960.606870.60677
issue queue full457870773011457753288170457285954721457377735719

hmmer

下表为修改ROB条目参数后的性能及相关事件统计

numRobEntries3264(default)128256
Cycles809074452950808713417314807847611182806952739701
Insts385698717788385674870657386133606279385708497829
IPC0.476720.476900.4779830.477982
ROBFullEvents2570522806254663777825243148362515529358

下表为修改整数型物理寄存器数目的参数后的性能及相关事件统计

numIntPhysRegisters4080(default)160240
Cycles809370221186808713417314809767322726807825937552
Insts385719132207385674870657386207983347385293913580
IPC0.476570.476900.476940.47695
int physical register full222050324049221494489523219538953416218272749397

下表为修改发射宽度的参数后的性能及相关事件统计

issueWidth34(default)8
Cycles809214740166808713417314807670675951
Insts385730379320385674870657385891584747
IPC0.476670.476900.47778
int issued insts127132475577127161470236127423963687

下表为修改issue queue条目参数后的性能及相关事件统计

numIssueEntriesx0.5x1(default)x2x4
Cycles809213830878808713417314807888593966806290604375
Insts385261324205385674870657386120708266385738656868
IPC0.476090.476900.477930.47841
issue queue full807921382723807888593985807847611190807290604339

h264ref

大致运行时间

real 267m22.919s user 258m47.163s sys 0m26.569s

下表为修改ROB条目参数后的性能及相关事件统计

numRobEntries3264(default)128256
Cycles827128387180812174759858796094804153795010336617
Insts631291689881624189938069616968902337615658661357
IPC0.763230.768540.774990.77440
ROBFullEvents4402217470402771557836046799623487984208

下表为修改整数型物理寄存器数目的参数后的性能及相关事件统计

numIntPhysRegisters4080(default)160240
Cycles812821132820812174759858811821132820811504798354
Insts624221175137624189938069624221175137624008426822
IPC0.767970.768540.768910.76895
int physical register full69019991010687950362536704807859466421175153

下表为修改发射宽度的参数后的性能及相关事件统计

issueWidth34(default)8
Cycles817529441068812174759858808078124133
Insts615632825755624189938069624129606391
IPC0.753040.768540.77236
int issued insts239309876563216778837682209150869514

下表为修改issue queue条目参数后的性能及相关事件统计

numIssueEntriesx0.5x1(default)x2x4
Cycles854027715578812174759858760172367123758647711176
Insts625564129606624189938069615819207705615312446630
IPC0.732490.768540.810100.81106
issue queue full857003795616812174759876760172367124758647711210

评测分析

coremark

  • IPC随ROB队列容量增大,先增后不变,ROB full事件次数呈现同样趋势,说明ROB条目为128时已经饱和,ROB容量对性能的提升达到瓶颈。

  • 该基准程序中,物理寄存器的增加,对IPC的提升相比其他基准还是更明显,但也只有不到0.5%,这说明BOOM架构中,流水线内部参数寄存器数量不是制约性能提升的关键路径。
  • coremark的IPC随着发射队列容量的增加而提升相比于其他程序也是比较明显的,但是提升幅度最高也没有超过2%,这说明目前的发射队列容量基本已经够满足coremark程序这种数量级的指令的基准的需求

gcc

  • gcc基准程序对于ROB,物理寄存器数量,发射队列这三种参数的敏感度都较低,IPC的提升幅度太小,这说明这些流水线内部参数可能不是影响gcc性能的关键所在。

gobmk

  • 该基准程序仅对于物理寄存器数量参数相对其他程序较敏感,但最高不超过0.2%,说明寄存器数量在默认配置下已经够用,对性能基本无影响。

hmmer

  • hmmer性能随着ROB容量的增加而提升,归因于分支跳转和load等影响乱序性能的操作比较频繁,容易给ROB带来较大压力。

h264ref

  • 该基准程序IPC受到发射队列容量的影响最大,提升幅度超过了10%,但在将发射队列提升到2倍后,IPC基本不再提升,观察到发射队列Full次数也不再有明显下降,这说明这时候的发射队列不再是性能关键路径,这或许是它是memory类型应用的缘故,性能关键路径最重要的一环在load队列,这是刘欢师兄测试的参数。
  • 该基准程序在其他参数上IPC的变化趋势也是所有已测基准中更明显的,这可能是其指令数更庞大,指令类型更复杂,存在较多影响乱序流水性能的操作带来的效果,需要进一步更具体的研究。

综合对比分析

image-20220102214057510

image-20220306124643093

image-20220306124715852

image-20220306124659037

根据以上各个参数的IPC的变化图,以及一些相关事件统计值的变化趋势,可以得出以下的初步分析:

  • 不同的基准程序由于各类指令分布特点的不同,IPC与各类参数的关系很复杂,比如说,对于ROB条目数增加带来的性能提升幅度就很不同,hmmer,h264ref等程序更可能因为ROB队列容量增加带来性能提升,因为这些程序分支跳转和load等影响乱序性能的操作比较频繁,容易给ROB带来较大压力,这也能从ROB Full Events的减少体现出ROB队列容量的重要性,较大容量会减少流水线的停顿频率,这项参数的评测结果符合预期。
  • 所测的h264ref等基准程序对于发射队列条目增加带来的性能提升比较明显,有的ipc提升甚至达到了10%以上,说明它们对于发射队列的容量需求比较敏感,
  • 基本上大部分所测的基准程序的ipc都会因为物理寄存器数量增加而增大,但是提升幅度都较小,最高的都不到0.5%,而且从每个基准程序在测试时统计到寄存器full事件次数可以发现,该数值降低的趋势太小,这说明BOOM默认配置基本上可以满足大部分程序的需求,没有必要再为了一点点小的性能提升而花费太大代价来增加物理寄存器的数量,故整数寄存器80个,浮点寄存器64个基本上可以满足所测的大部分程序的性能需求
  • Spec基准程序相比coremark而言,因为指令数目的增加,IPC和ROB队列容量、发射队列容量等参数的关系更加明显,特别是h264ref基准,观察到其输入文件较大,可能有较大load操作,对乱序流水线性能有很大影响,这让其几乎和每种参数都有较强的相关性。
  • 所测的大部分基准程序,在发射宽度从默认的4到提升一倍的过程中IPC变化不太明显,相对于发射宽度为3的提升幅度最高不到3%,这说明发射宽度不在影响性能的关键路径上,平均来看发射宽度取默认的4是较好的选择。