FPGA開発日記

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

Rocket-Chip を ZedBoardにインプリしてCoremarkを測定する(実機動作編)

さて、次はRISC-V向けLinuxのディスクイメージにcoremark.exeを追加して、実機で動作させてみる。

Linuxをビルドした際に、既にディスクイメージは作ってあるので、これをマウントし、coremarkのバイナリを追加し、実機で動作させる。 ちなみに、ディスクイメージを読み込むためのSDカードは/dev/sdb1に挿入されているものとする。 まずは、root.binをSDカードから取り出して、マウントしてファイルを書き込めるようにする。

$ cd /mnt
$ sudo mount /dev/sdb1 SD_CARD
$ cd SD_CARD/riscv
$ ls
root.bin  vmlinux

このroot.binを別の所にコピーして、マウントして中身が見れるようにする。

cp root.bin ~/riscv-work
cd ~/riscv-work
mkdir mnt
sudo mount -o loop root.bin mnt
cd mnt
sudo mkdir home
sudo cp ~/riscv-hw/coremark_v1.0/coremark.exe .
cd ../../
sudo umount mnt

これでコピーできた。

これを再度SDカードに流し込む。

cd /mnt/SD_CARD
sudo cp ~/riscv-work/root.bin riscv/
cd ..
sudo umount SD_CARD

では、早速実機で動作させる。Rocket-Chip上でLinuxをブートさせるところまでは省略。

/ #
/ # ls
bin         etc         lib         proc        tmp
dev         home        lost+found  sbin        usr
/ # cd home/
/home # ls
coremark.exe

おおお、ちゃんとcoremark.exeが入っている。

実行してみる。最後まで走り切るためには数十秒かかる。

/home # ./coremark.exe
2K performance run parameters for coremark.
CoreMark Size    : 666
Total ticks      : 15958
Total time (secs): 15.958000
Iterations/Sec   : 187.993482
Iterations       : 3000
Compiler version : GCC4.9.1
Compiler flags   : -O2 -static -DPERFORMANCE_RUN=1  -lrt
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      : 0xcc42
Correct operation validated. See readme.txt for run and reporting rules.
CoreMark 1.0 : 187.993482 / GCC4.9.1 -O2 -static -DPERFORMANCE_RUN=1  -lrt / Heap

1秒間に187イタレーションを流すことができたらしい。Rocket-Chipは100MHz(ZedBoardのクロック)で動いているだろうから、CMK/MHzは1.87くらいか。シングルパイプラインのCPUとしては結構良い方なのではないだろうか? -O2オプションでコンパイルしたバイナリだし、アンローリングの最適化オプションなども指定していないとはいえ、良い数値ではないかと思う。

ちゃんとCoremarkを実機測定できるし、Rocket-Chipは本当にすごいな (あとは、LinuxRISC-Vの最新ABIに合わせてくれたら...)