これは「ハードウェア開発、CPUアーキテクチャ」Advent Calendar... ではありません。
前回中途半端に終わった、Coremarkの測定試行についてもう少し調査したのでそれをまとめたい。
-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
あれれ、全然速くなってないなあ。むしろ遅くなった。
-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]
お、結構良い数値を出していることが分かった。