FPGA evaluation
Published:
基于BOOM FPGA的乱序CPU微架构流水线内部参数评测
评测目标
- 修改物理寄存器数量,观测处理器相关参数及整体性能变化。预期会观察到,在以计算为主的测试程序中,处理器的性能会随着数量增加而提升。
- 修改ROB条目数,观测处理器相关参数及整体性能变化。预期会观察到,在条件判断较多的控制密集型测试程序中,处理器的性能会随着数量增加而提升。
- 修改发射宽度,观测处理器相关参数及整体性能变化。
- 修改发射队列条目数,观测处理器相关参数及整体性能变化。
评测方法
控制变量法:使用FPGA,修改BOOM架构的流水线内部参数,模拟测评程序在不同参数配置下的运行情况,对比结果,并进行分析。
评测环境
MediumBOOM参数(默认)
Parameters | Values |
---|---|
issueWidth | 1+2+1 |
numIssueEntries | 12+20+16 |
numRobEntries | 64 |
numIntPhysRegisters | 80 |
numFpPhysRegisters | 64 |
评测基准
coremark
类似于MIPS、Dhrystone,是目前在嵌入式
CPU
行业中普遍公认的性能测试指标标准。作为综合型基准评测程序,它提供一套测试单核处理器核心的方法。测试标准是在配置参数的组合下单位时间内运行的CoreMark
程序次数(单位:CoreMark/MHz
),该数字值越大则说明测试的性能越好,CoreMark
具有特定的运行和报告规则,可以避免由于所使用的编译库不同而导致的测试结果难以比较。run sh script
./coremark
SPEC CPU2006
计算密集型
gobmk(445)
模拟量子计算机的库文件,用来进行量子计算机应用的研究
run sh script
#!/bin/sh ./gobmk --quiet --mode gtp < 13x13.tst
控制密集型
gcc(403) 基于gcc V3.2,为AMDCPU生成机器码,输入文件较多,测试压力更大,对9组C代码进行了编译 run sh script
#!/bin/sh gcc 166.i -o 166.s
hmmer(456) 使用HMMS(Hidden Markov Models,隐马尔科夫模型) 基因识别方法进行基因序列搜索 run sh script
#!/bin/sh hmmer nph3.hmm swiss41
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条目数的参数后的性能及相关事件统计
numRobEntries | 32 | 64(default) | 128 | 256 |
---|---|---|---|---|
Cycles | 5594704794 | 5594313865 | 5593391266 | 5592532452 |
Insts | 7540616951 | 7540331075 | 7543602294 | 7540935088 |
IPC | 1.34781 | 1.34786 | 1.34866 | 1.34839 |
ROBFullEvents | 8255298 | 8214089 | 8116875 | 8119870 |
下表为修改整数型物理寄存器数目的参数后的性能及相关事件统计
numIntPhysRegisters | 40 | 80(default) | 160 | 240 |
---|---|---|---|---|
Cycles | 5606932248 | 5594313865 | 5595436235 | 5594944873 |
Insts | 7541012941 | 7540331075 | 7541908235 | 7541351022 |
IPC | 1.34494 | 1.34786 | 1.34787 | 1.34789 |
int physical register full | 9062595 | 9047764 | 9003062 | 8992927 |
下表为修改浮点型物理寄存器数目的参数后的性能及相关事件统计
numFpPhysRegisters | 64(default) | 128 | 256 |
---|---|---|---|
Cycles | 5594313865 | 5593411143 | 5591838351 |
Insts | 7540331075 | 7564333192 | 7563500179 |
IPC | 1.34786 | 1.35236 | 1.35259 |
int physical register full | 8163779949 | 8163233835 | 8161314056 |
下表为修改发射宽度的参数后的性能及相关事件统计
issueWidth | 3 | 4(default) | 8 |
---|---|---|---|
Cycles | 5666783716 | 5594313865 | 5595110396 |
Insts | 7564341874 | 7540331075 | 7541673369 |
IPC | 1.33486 | 1.34786 | 1.34790 |
int issued insts | 826396348 | 826311129 | 826288960 |
下表为修改发射队列条目数的参数后的性能及相关事件统计
numIssueEntries | x0.5 | x1(default) | x2 | x4 |
---|---|---|---|---|
Cycles | 5668226006 | 5594313865 | 5589951583 | 5546173877 |
Insts | 7564427145 | 7540331075 | 7582496732 | 7541407366 |
IPC | 1.33453 | 1.34786 | 1.35645 | 1.35974 |
int issue queue full | 5699951560 | 5668226021 | 5656711676 | 5613067533 |
gcc
大致运行时间
real 66m56.734s user 65m26.152s sys 0m34.367s
下表为修改ROB条目数的参数后的性能及相关事件统计
numRobEntries | 32 | 64(default) | 128 | 256 |
---|---|---|---|---|
Cycles | 199288756030 | 199124845509 | 198834670025 | 198827305424 |
Insts | 94502436086 | 94470779212 | 94425942334 | 94437067943 |
IPC | 0.47420 | 0.47443 | 0.47490 | 0.47497 |
ROBFullEvents | 1574446500 | 1568899794 | 1567233014 | 1567189182 |
下表为修改整数型物理寄存器数目的参数后的性能及相关事件统计
numIntPhysRegisters | 40 | 80(default) | 160 | 240 |
---|---|---|---|---|
Cycles | 199156632317 | 199124845509 | 198911791181 | 198665685926 |
Insts | 94471850595 | 94470779212 | 94414448866 | 94334618017 |
IPC | 0.47436 | 0.47443 | 0.47465 | 0.47484 |
int physical register full | 1111783791 | 1110289251 | 1101044254 | 1098553797 |
下表为修改发射宽度的参数后的性能及相关事件统计
issueWidth | 3 | 4(default) | 8 |
---|---|---|---|
Cycles | 199774084753 | 199124845509 | 198875463450 |
Insts | 94442870893 | 94470779212 | 94472237476 |
IPC | 0.47275 | 0.47443 | 0.47503 |
int issued insts | 74730696164 | 74729119903 | 74688439884 |
下表为修改issue queue条目参数后的性能及相关事件统计
numIssueEntries | x0.5 | x1(default) | x2 | x4 |
---|---|---|---|---|
Cycles | 199246482561 | 199124845509 | 198823107402 | 198515428402 |
Insts | 94492871766 | 94470779212 | 94460348581 | 94343987469 |
IPC | 0.47425 | 0.47443 | 0.47510 | 0.47525 |
issue queue full | 199146482580 | 198911791196 | 198823107404 | 198515428396 |
gobmk
大致运行时间
real 151m28.938s user 149m15.153s sys 0m14.211s
下表为修改ROB条目参数后的性能及相关事件统计
numRobEntries | 32 | 64(default) | 128 | 256 |
---|---|---|---|---|
Cycles | 457891450149 | 457753288117 | 456972651103 | 456920677366 |
Insts | 277235262250 | 277380926772 | 277452130079 | 277421114121 |
IPC | 0.60546 | 0.60596 | 0.607152 | 0.607152 |
ROBFullEvents | 11183883098 | 11175916402 | 11175361186 | 11168618400 |
下表为修改整数型物理寄存器数目的参数后的性能及相关事件统计
numIntPhysRegisters | 40 | 80(default) | 160 | 240 |
---|---|---|---|---|
Cycles | 457907506585 | 457753288117 | 457026310354 | 457029925557 |
Insts | 277368826051 | 277380926772 | 277388547541 | 277409423998 |
IPC | 0.60573 | 0.60596 | 0.60694 | 0.60698 |
int physical register full | 5796169458 | 5759864720 | 5753695292 | 5747932880 |
下表为修改发射宽度的参数后的性能及相关事件统计
issueWidth | 3 | 4(default) | 8 |
---|---|---|---|
Cycles | 467099997281 | 457753288117 | 456762965262 |
Insts | 281548452595 | 277380926772 | 277441826646 |
IPC | 0.60276 | 0.60596 | 0.60741 |
int issued insts | 149868727403 | 146108078728 | 145721540777 |
下表为修改issue queue条目参数后的性能及相关事件统计
numIssueEntries | x0.5 | x1(default) | x2 | x4 |
---|---|---|---|---|
Cycles | 458888320882 | 457753288117 | 457285954735 | 469077735725 |
Insts | 277483873995 | 277380926772 | 277514652230 | 284622508407 |
IPC | 0.60469 | 0.60596 | 0.60687 | 0.60677 |
issue queue full | 457870773011 | 457753288170 | 457285954721 | 457377735719 |
hmmer
下表为修改ROB条目参数后的性能及相关事件统计
numRobEntries | 32 | 64(default) | 128 | 256 |
---|---|---|---|---|
Cycles | 809074452950 | 808713417314 | 807847611182 | 806952739701 |
Insts | 385698717788 | 385674870657 | 386133606279 | 385708497829 |
IPC | 0.47672 | 0.47690 | 0.477983 | 0.477982 |
ROBFullEvents | 2570522806 | 2546637778 | 2524314836 | 2515529358 |
下表为修改整数型物理寄存器数目的参数后的性能及相关事件统计
numIntPhysRegisters | 40 | 80(default) | 160 | 240 |
---|---|---|---|---|
Cycles | 809370221186 | 808713417314 | 809767322726 | 807825937552 |
Insts | 385719132207 | 385674870657 | 386207983347 | 385293913580 |
IPC | 0.47657 | 0.47690 | 0.47694 | 0.47695 |
int physical register full | 222050324049 | 221494489523 | 219538953416 | 218272749397 |
下表为修改发射宽度的参数后的性能及相关事件统计
issueWidth | 3 | 4(default) | 8 |
---|---|---|---|
Cycles | 809214740166 | 808713417314 | 807670675951 |
Insts | 385730379320 | 385674870657 | 385891584747 |
IPC | 0.47667 | 0.47690 | 0.47778 |
int issued insts | 127132475577 | 127161470236 | 127423963687 |
下表为修改issue queue条目参数后的性能及相关事件统计
numIssueEntries | x0.5 | x1(default) | x2 | x4 |
---|---|---|---|---|
Cycles | 809213830878 | 808713417314 | 807888593966 | 806290604375 |
Insts | 385261324205 | 385674870657 | 386120708266 | 385738656868 |
IPC | 0.47609 | 0.47690 | 0.47793 | 0.47841 |
issue queue full | 807921382723 | 807888593985 | 807847611190 | 807290604339 |
h264ref
大致运行时间
real 267m22.919s user 258m47.163s sys 0m26.569s
下表为修改ROB条目参数后的性能及相关事件统计
numRobEntries | 32 | 64(default) | 128 | 256 |
---|---|---|---|---|
Cycles | 827128387180 | 812174759858 | 796094804153 | 795010336617 |
Insts | 631291689881 | 624189938069 | 616968902337 | 615658661357 |
IPC | 0.76323 | 0.76854 | 0.77499 | 0.77440 |
ROBFullEvents | 4402217470 | 4027715578 | 3604679962 | 3487984208 |
下表为修改整数型物理寄存器数目的参数后的性能及相关事件统计
numIntPhysRegisters | 40 | 80(default) | 160 | 240 |
---|---|---|---|---|
Cycles | 812821132820 | 812174759858 | 811821132820 | 811504798354 |
Insts | 624221175137 | 624189938069 | 624221175137 | 624008426822 |
IPC | 0.76797 | 0.76854 | 0.76891 | 0.76895 |
int physical register full | 69019991010 | 68795036253 | 67048078594 | 66421175153 |
下表为修改发射宽度的参数后的性能及相关事件统计
issueWidth | 3 | 4(default) | 8 |
---|---|---|---|
Cycles | 817529441068 | 812174759858 | 808078124133 |
Insts | 615632825755 | 624189938069 | 624129606391 |
IPC | 0.75304 | 0.76854 | 0.77236 |
int issued insts | 239309876563 | 216778837682 | 209150869514 |
下表为修改issue queue条目参数后的性能及相关事件统计
numIssueEntries | x0.5 | x1(default) | x2 | x4 |
---|---|---|---|---|
Cycles | 854027715578 | 812174759858 | 760172367123 | 758647711176 |
Insts | 625564129606 | 624189938069 | 615819207705 | 615312446630 |
IPC | 0.73249 | 0.76854 | 0.81010 | 0.81106 |
issue queue full | 857003795616 | 812174759876 | 760172367124 | 758647711210 |
评测分析
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的变化趋势也是所有已测基准中更明显的,这可能是其指令数更庞大,指令类型更复杂,存在较多影响乱序流水性能的操作带来的效果,需要进一步更具体的研究。
综合对比分析
根据以上各个参数的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是较好的选择。