RISC-VのオープンソースプロセッサBOOMv3(SonicBOOM)は私の手元のGCCでコンパイルしたCoremarkで、特にオプションをいじらずに5.0CMK/MHzを上回ることが確認できた。
私が使っているのがRISC-V GCC 7.2なので最近リリースされたGCC 10.0にアップグレードするとスコアが向上するだろうか?やってみよう。
coremarkのコンパイル方法としてはBOOMのリポジトリに登録されているriscv-coremark
を使用する。
RISC-V向けのGCC 10.0のバイナリはソースからビルドした。riscv-gnu-toolchainのリポジトリをダウンロードしてリビジョンを変更してGCC 10.0に対応させた。
commit 256a4108922f76403a63d6567501c479971d5575 (HEAD -> master, origin/master, origin/HEAD) Merge: 07bb8cf bc8b404 Author: Kito Cheng <kito.cheng@sifive.com> Date: Fri Jun 19 10:42:33 2020 +0800 Merge pull request #655 from riscv/allowlist Rename whitelist to allowlist
riscv-unknown-elf-gcc-10.0で同じようにriscv-coremarkをコンパイルしたのだがシミュレーションが動かなかった。どうも解析しているとmemset
が正しくコンパイルされていないように見える?GCCの内部まで入って解析する元気は無いので、とりあえず上手く行っているriscv-unknown-gcc-7.2.0で生成したmemset
のアセンブリをそのまま張り付けてコンパイルし直した。
diff --git a/riscv64-baremetal/crt.S b/riscv64-baremetal/crt.S index d75e81e..f669286 100644 --- a/riscv64-baremetal/crt.S +++ b/riscv64-baremetal/crt.S @@ -216,6 +216,39 @@ trap_entry: addi sp, sp, 272 mret + .globl memset + .type memset, @function +memset: + or a5,a0,a2 + andi a5,a5,7 + add a2,a0,a2 + andi a1,a1,0xff + beqz a5,.L158 + mv a5,a0 + bleu a2,a0,.L166 +.L162: + addi a5,a5,1 + sb a1,-1(a5) + bne a2,a5,.L162 +.L160: + ret +.L158: + slli a5,a1,8 + or a5,a1,a5 + slli a1,a5,16 + or a5,a5,a1 + slli a4,a5,32 + or a5,a5,a4 + bleu a2,a0,.L160 + mv a4,a0 +.L161: + addi a4,a4,8 + sd a5,-8(a4) + bgtu a2,a4,.L161 + ret +.L166: + ret
これでコンパイルし、BOOMのMegaBoomConfigでシミュレーションしてみる。
./simulator-chipyard-MegaBoomConfig +verbose +permissive-off +dramsim +max-cycles=10000000 ../../riscv-coremark/coremark.bare.riscv >& coremark.mega.gcc10.riscv.log
Coremarkスコアは5.45 CMK/MHzとなった。GCC 7.2.0の時の 5.33より少し伸びたかな?
===== MemorySystem 0 ===== CH. 0 TOTAL_STORAGE : 4096MB | 1 Ranks | 16 Devices per rank DRAMSim2 Clock Frequency =1Hz, CPU Clock Frequency=1Hz 2K performance run parameters for coremark. CoreMark Size : 666 Total ticks : 1835524 Total time (secs): %f Iterations/Sec : %f ERROR! Must execute for at least 10 secs for a valid result! Iterations : 10 Compiler version : GCC10.1.0 Compiler flags : -O2 -mcmodel=medany -static -std=gnu99 -fno-c3 0x000000008000278a (0x629c) x15 0x0000000000000000 ommon -nostdlib -nostartfiles -lm -T ../riscv64-baremetal/link.l3 0x000000008000278a (0x629c) x15 0x0000000000000000 d Memory location : Please put data memory location here (e.g. code in flash, data on heap etc) seedcrc : 0xe9f5 [0]crclist : 0xe714 [0]crcmatrix : 0x1fd7 [0]crcstate : 0x8e3a [0]crcfinal : 0xfcaf Errors detected