FPGA開発日記

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

RocketChip RISC-V実装RTLにてベンチマークを計測する(2. -O3によるCoremarkコンパイル)

f:id:msyksphinz:20161221231905p:plain

これは「ハードウェア開発、CPUアーキテクチャ」Advent Calendar... ではありません。

前回中途半端に終わった、Coremarkの測定試行についてもう少し調査したのでそれをまとめたい。

msyksphinz.hatenablog.com

msyksphinz.hatenablog.com

-O3でコンパイルするとCoremark on RocketChipが動作しなくなる問題

これを自作ISSを使って調査していたのだが、memsetのコンパイルの問題らしい。-O3を指定するとmemset()が利用されるようになるのだが、その時の逆アセンブル結果を見てみると、

0000000080005df4 <memset>:
    80005df4:   ff010113                addi    sp,sp,-16
    80005df8:   00c567b3                or      a5,a0,a2
    80005dfc:   00813023                sd      s0,0(sp)
    80005e00:   00113423                sd      ra,8(sp)
    80005e04:   0077f793                andi    a5,a5,7
    80005e08:   00050413                mv      s0,a0
    80005e0c:   02078663                beqz    a5,80005e38 <memset+0x44>
    80005e10:   00c50633                add     a2,a0,a2
    80005e14:   00c57863                bleu    a2,a0,80005e24 <memset+0x30>
    80005e18:   40a60633                sub     a2,a2,a0
    80005e1c:   0ff5f593                andi    a1,a1,255
    80005e20:   fd5ff0ef                jal     80005df4 <memset>

memset()がmemset()を呼んでいる。そんなコード無いのにな、と思っていたら、これはsysutil.cに記載してあるmemset()と、ライブラリに格納されているmemset()が混同されてこのようになっているらしい。これはバグだろ...

良くMLを読み返してみると、このバグについても議論がなされている。-fno-builtinを追加することで回避できそうだ。

-O3でコンパイルしたCoremarkバイナリをRocketChipでシミュレーションし、性能評価する

-fno-builtinを追加したバイナリをRocketで動作してみると、一応完走したようだ。

make output/coremark.riscv.o3.out
./emulator-rocketchip-BOOMConfig +max-cycles=5000000 +verbose output/coremark.riscv.o3 2> output/coremark.riscv.o3.out && [ $PIPESTATUS -eq 0 ]
$ grep -e "\[0080003eb0\]" -e "\[0080003ec0\]" output/coremark.rocket.o3.inst
C                   0:     407213 [1] pc=[0080003eb0] W[r 0=0000000000000000][1] R[r 0=0000000000000000] R[r 0=0000000000000000] inst=[00000033] add     zero, zero, zero
C                   0:    2848742 [1] pc=[0080003ec0] W[r 0=0000000000000000][1] R[r 0=0000000000000000] R[r 0=0000000000000000] inst=[00000033] add     zero, zero, zero

{ \displaystyle
\text{CMK/MHz} = 1000000 / \left(2643785 - 237504 \right) \times 5 = 2.04
}

あれれ、全然速くなってないなあ。むしろ遅くなった。

-O3 でコンパイルしたCoremarkバイナリをBOOMでシミュレーションし、性能評価する

次はBOOMだ。同様にシミュレーションを行った。

$ grep -e 80003eb0 -e 80003ec0 pipeview.out
[.....................................................................f..di...cr.]-(      477920000) 0x0080003eb0.0 DASM(00000033)            [    192499]
[=======================================================================f==di====]-(      477920000) 0x0080003ec0.0 -----DASM(00000033)       [    192503]
[==============================f=================================================]-(      728160000) 0x0080003eb0.0 -----DASM(00000033)       [    564520]
[===============================================================================f]-(      729120000) 0x0080003eb0.0 -----DASM(00000033)       [    566099]
[==================f==di=========================================================]-(      984560000) 0x0080003eb0.0 -----DASM(00000033)       [    940622]
[===============================f==di============================================]-(      984640000) 0x0080003eb0.0 -----DASM(00000033)       [    940732]
[=================================f==============================================]-(      984640000) 0x0080003ec0.0 -----DASM(00000033)       [    940736]
[f===============================================================================]-(     1016960000) 0x0080003eb0.0 -----DASM(00000033)       [    987460]
[.............................f..di...cr.........................................]-(     1909520000) 0x0080003ec0.0 DASM(00000033)            [   2285258]
[==========================f==di=================================================]-(     1912240000) 0x0080003eb0.0 -----DASM(00000033)       [   2288550]
[============================f==di===============================================]-(     1912240000) 0x0080003ec0.0 -----DASM(00000033)       [   2288554]

{ \displaystyle
\text{CMK/MHz} = 1000000 / \left(1909520 - 477920 \right) \times 5 = 3.49
}

お、結構良い数値を出していることが分かった。