FPGA開発日記

カテゴリ別記事インデックス https://msyksphinz.github.io/github_pages , English Version https://fpgadevdiary.hatenadiary.com/

RISC-VのオープンソースプロセッサBOOMv3(SonicBOOM)を試す(4. GCC10を使用して再計測)

RISC-VのオープンソースプロセッサBOOMv3(SonicBOOM)は私の手元のGCCでコンパイルしたCoremarkで、特にオプションをいじらずに5.0CMK/MHzを上回ることが確認できた。

私が使っているのがRISC-V GCC 7.2なので最近リリースされたGCC 10.0にアップグレードするとスコアが向上するだろうか?やってみよう。

coremarkのコンパイル方法としてはBOOMのリポジトリに登録されているriscv-coremarkを使用する。

github.com

RISC-V向けのGCC 10.0のバイナリはソースからビルドした。riscv-gnu-toolchainのリポジトリをダウンロードしてリビジョンを変更してGCC 10.0に対応させた。

github.com

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
f:id:msyksphinz:20200626143933p:plain