Benchmarks on RV64GC RISC-V Out-of-Order Simulator

benchmark-naxriscv-simulator

RISC-V Out-of-Order CoreのNaxRiscvがRV[32|64]GCに対応したので、RV64GCシミュレータを作成し、ベンチマークのCoreMark、Dhrystone及びWhetstoneを実行しました。

NaxRiscvの関連記事は、こちら。

NaxRiscv

NaxRiscvは、RV[32|64]IMAFDCSUに対応したアウトオブオーダ実行スーパースカラのRISC-V Coreです。

NaxRiscvの概要は以前の記事、詳細はNaxRiscv documentationをご覧ください。

デフォルトのRV32IMAとRV64IMAの性能は、以下のようになっています。

RV32IMA

  • CoreMark: 5.00 CoreMark/MHz (-O3 and so many more random flags)
  • Dhrystone: 2.94 DMIPS/MHz (-O3 -fno-common -fno-inline)

RV64IMA

  • CoreMark: 4.91 CoreMark/MHz (-O3, u32 as s32 and so many more random flags)
  • Dhrystone: 2.97 DMIPS/MHz (-O3 -fno-common -fno-inline)

Benchmarks on NaxRiscv RV64GC Simulator

今回は、Verilatorを用いてNaxRiscvのRV64GC(RV64IMAFDC)シミュレータを作成し、ベンチマークのCoreMark、Dhrystone及びNaxRiscvに移植したWhetstoneを実行しました。

CoreMark

以下は、CoreMarkを実行したときのコンソール出力を示しています。

$ ./sim/VNaxRiscv64gc --name coremark \
  --load-elf $NAXSOFTWARE/baremetal/coremark/build/rv64imafdc/coremark.elf \
  --pass-symbol pass
2K performance run parameters for coremark.
CoreMark Size    : 666
Total ticks      : 2178284
Total time (secs): 2178284.000000
Iterations/Sec   : 0.000005
Iterations       : 10
Compiler version : GCC11.1.0
Compiler flags   : -DPERFORMANCE_RUN=1  -march=rv64imafdc -mabi=lp64d -mcmodel=medany -Wno-pointer-to-int-cast -Wno-int-to-pointer-cast -I../driver -O3 -fno-common -funroll-loops -finline-functions -falign-functions=16 -falign-jumps=4 -falign-loops=4 -finline-limit=1000 -fno-if-conversion2 -fselective-scheduling -fno-crossjumping -freorder-blocks-and-partition -DCORE_DEBUG=0  -lgcc -lc -nostartfiles -ffreestanding -Wl,-Bstatic,-T,../common/app.ld,-Map,coremark.map,--print-memory-usage
Memory location  : STACK
seedcrc          : 0xe9f5
[0]crclist       : 0xe714
[0]crcmatrix     : 0x1fd7
[0]crcstate      : 0x8e3a
[0]crcfinal      : 0xfcaf
Correct operation validated. See README.md for run and reporting rules.
CoreMark 1.0 : 0.000005 / GCC11.1.0 -DPERFORMANCE_RUN=1  -march=rv64imafdc -mabi=lp64d -mcmodel=medany -Wno-pointer-to-int-cast -Wno-int-to-pointer-cast -I../driver -O3 -fno-common -funroll-loops -finline-functions -falign-functions=16 -falign-jumps=4 -falign-loops=4 -finline-limit=1000 -fno-if-conversion2 -fselective-scheduling -fno-crossjumping -freorder-blocks-and-partition -DCORE_DEBUG=0  -lgcc -lc -nostartfiles -ffreestanding -Wl,-Bstatic,-T,../common/app.ld,-Map,coremark.map,--print-memory-usage / STACK
4.59 CoreMark/MHz
SUCCESS coremark

RV64GCシミュレータのCoreMark/MHzは、4.59です。上記のようにRV64IMAは、4.91 CoreMark/MHzなので、7%位スコアが低下しています。

Dhrystone

以下は、Dhrystoneを実行したときのコンソール出力を示しています。

$ ./sim/VNaxRiscv64gc --name dhrystone \
  --load-elf $NAXSOFTWARE/baremetal/dhrystone/build/rv64imafdc/dhrystone.elf \
  --pass-symbol pass

Dhrystone Benchmark, Version C, Version 2.2
Program compiled without 'register' attribute
Using time(), HZ=12000000

...

Microseconds for one run through Dhrystone: 16
Dhrystones per Second:                      62168
User_Time : 965124
Number_Of_Runs : 5000
HZ : 12000000
DMIPS per MHz:                              2.94
SUCCESS dhrystone

RV64GCシミュレータのDMIPS/MHzは、2.94です。上記のようにRV64IMAは、2.97 DMIPS/MHzなので、スコアはほとんど変わりません。

Whetstone

以下は、新規に移植したWhetstoneを実行したときのコンソール出力を示しています。

$ ./sim/VNaxRiscv64gc --name whetstone \
  --load-elf $NAXSOFTWARE/baremetal/whetstone/build/rv64imafdc/whetstone.elf \
  --pass-symbol pass

Loops: 10, Iterations: 1, Duration: 1023732 cycles.
C Converted Double Precision Whetstones: 976 KIPS/MHz
SUCCESS whetstone

RV64GCシミュレータのWMIPS/MHzは、0.976です。

まとめ

Verilatorを用いてNaxRiscvのRV64GCシミュレータを作成し、ベンチマークのCoreMark、Dhrystone及びWhetstoneを実行しました。

RV64GCの性能は、以下のようになっています。

RV64GC

  • CoreMark: 4.59 CoreMark/MHz (-O3, u32 as s32 and so many more random flags)
  • Dhrystone: 2.94 DMIPS/MHz (-O3 -fno-common -fno-inline)
  • Whetstone: 0.976 WMIPS/MHz (-O3 -fno-common -fno-inline)