さて、次は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は本当にすごいな (あとは、LinuxをRISC-Vの最新ABIに合わせてくれたら...)