Running CoreMark on NaxRiscv Simulator

benchmark-naxriscv-simulator

Luffcaでは、アウトオブオーダ実行スーパースカラーのRISC-V CPUであるNaxRiscvのVerilatorシミュレータを作成しました。作成したシミュレータを用いてCoreMarkを実行し、NaxRiscvの公称値通りの4.70 CoreMark/MHzを確認しました。

現在のNaxRiscvリポジトリはまだWIPですが、既にシミュレータ上でLinuxが実行できます。また、LiteXに統合されており、FPGAボード用ゲートウェアを作成できます。

アイキャッチ画像は、シミュレータから出力したログを、命令パイプラインビジュアライザーであるKonataで可視化したものです。

NaxRiscv

NaxRiscvは、32-bit RISC-V VexRiscvの開発者であるCharles Papon氏が開発を進めているRISC-V CPUです。VexRiscvと同様に、SpinalHDLというハードウェア記述言語で記述されています。

VexRiscvとNaxRiscvの違いは、UCB(カリフォルニア大学バークレイ校)のRocketBOOM(Berkeley Out-of-Order Machine)のように、インオーダ実行スカラーとアウトオブオーダ実行スーパースカラーだと思っていましたが、VexRiscvにはなかった64-bit(RV64)対応などの新たな試みが行われています。

性能的には、BOOMv3(SonicBOOM)の公称値の6.2 CoreMark/MHzに対し、32-bit NaxRiscvの公称値は、以下のようになっています。

  • 2 execution unit: 4.22 CoreMark/MHz
  • 3 execution unit: 4.70 CoreMark/MHz

CoreMark on Verilator Simulator

GitHubのNaxRiscvリポジトリには、シミュレータの作成方法の記載があり、CoreMarkもビルドされているので、再現テストを実施しました。

$ ./obj_dir/VNaxRiscv --load-elf ../../../../ext/NaxSoftware/baremetal/coremark/build/rv32im/coremark.elf --pass-symbol=pass
2K performance run parameters for coremark.
CoreMark Size    : 666
Total ticks      : 2129108
Total time (secs): 2129108.000000
Iterations/Sec   : 0.000005
Iterations       : 10
Compiler version : GCC11.1.0
Compiler flags   : -DPERFORMANCE_RUN=1  -march=rv32im -mabi=ilp32 -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-reg-struct-return -fno-rename-registers --param case-values-threshold=8 -fno-crossjumping -freorder-blocks-and-partition -fno-tree-loop-if-convert -fno-tree-sink -fgcse-sm -fno-strict-overflow -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=rv32im -mabi=ilp32 -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-reg-struct-return -fno-rename-registers --param case-values-threshold=8 -fno-crossjumping -freorder-blocks-and-partition -fno-tree-loop-if-convert -fno-tree-sink -fgcse-sm -fno-strict-overflow -DCORE_DEBUG=0  -lgcc -lc -nostartfiles -ffreestanding -Wl,-Bstatic,-T,../common/app.ld,-Map,coremark.map,--print-memory-usage / STACK
4.70 Coremark/MHz
SUCCESS ???

GCC 11.1.0でビルドしたCoreMarkの結果も、4.70 CoreMark/MHzでした。

まとめ

Luffcaでは、アウトオブオーダ実行スーパースカラーのRISC-V CPUであるNaxRiscvのVerilatorシミュレータを作成しました。作成したシミュレータを用いてCoreMarkを実行し、NaxRiscvの公称値の4.70 CoreMark/MHzを確認しました。