FPGA開発日記

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

Gem5 for RISC-Vのビルド試行 (3. Gem5でCoremarkをコンパイルして実行してみる)

f:id:msyksphinz:20181129165439p:plain

Gem5のリグレッションテストが流れたので、次は自分でプログラムをコンパイルして動かしてみたい。

手っ取り早く、Coremarkのベンチマークプログラムが動かないかと思い、試行してみることにした。

CoremarkをGitHubからダウンロードし、展開する。

github.com

次に、linux64ディレクトリをコピーして、riscv64gcディレクトリを作成した。内容を編集する。 linux64riscv64gcの差分は以下のようにした。

diff -w linux64/core_portme.c riscv64gc/core_portme.c
79a80
>     #define CLOCKS_PER_SEC 1000000
diff -w linux64/core_portme.h riscv64gc/core_portme.h
18a19,21
> #include <stdint.h>
> #include <stddef.h>
>
38c41
< #define HAS_TIME_H 1
---
> #define HAS_TIME_H 0
45c48
< #define USE_CLOCK 0
---
> #define USE_CLOCK 1
70c73,74
< #error "Please define type of CORE_TICKS and implement start_time, end_time get_time and time_in_secs functions!"
---
> typedef uint64_t CORE_TICKS;
> // #error "Please define type of CORE_TICKS and implement start_time, end_time get_time and time_in_secs functions!"
117c121
< #define SEED_METHOD SEED_ARG
---
> #define SEED_METHOD SEED_VOLATILE
277a282
>
diff -w linux64/core_portme.mak riscv64gc/core_portme.mak
24c24
< CC = gcc
---
> CC = riscv64-unknown-elf-gcc
33c33
< LFLAGS_END += -lrt
---
> # LFLAGS_END += -lrt
64c64
< LD            = gcc
---
> LD            = riscv64-unknonw-elf-gcc

これでコンパイルを行う。

make PORT_DIR=riscv64gc ITERATIONS=10

まずはSpikeで動作するか確認してみよう。

$ spike pk ./coremark.exe
Ready
2K performance run parameters for coremark.
CoreMark Size    : 666
Total ticks      : 0
Total time (secs): 0.000000
ERROR! Must execute for at least 10 secs for a valid result!
Iterations       : 10
Compiler version : GCC7.2.0
Compiler flags   : -O2 -DPERFORMANCE_RUN=1
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

時間に対する概念が無いのでERRORになってしまっているが、動作自体は問題なさそうだ。

次に、Gem5で実行してみる。

$ build/RISCV/gem5.opt configs/example/se.py -c ${HOME}/work/riscv/coremark/coremark.exe
gem5 Simulator System.  http://gem5.org
gem5 is copyrighted software; use the --copyright option for details.

gem5 compiled Nov 29 2018 15:22:49
gem5 started Dec  1 2018 15:41:28
gem5 executing on msyksphinz-VirtualBox, pid 10648
command line: build/RISCV/gem5.opt configs/example/se.py -c /home/msyksphinz/work/riscv/coremark/coremark.exe

Global frequency set at 1000000000000 ticks per second
warn: DRAM device capacity (8192 Mbytes) does not match the address range assigned (512 Mbytes)
warn: Unknown operating system; assuming Linux.
0: system.remote_gdb: listening for remote gdb on port 7000
**** REAL SIMULATION ****
info: Entering event queue @ 0.  Starting simulation...
Ready
2K performance run parameters for coremark.
CoreMark Size    : 666
Total ticks      : 0
Total time (secs): 0.000000
ERROR! Must execute for at least 10 secs for a valid result!
Iterations       : 10
Compiler version : GCC7.2.0
Compiler flags   : -O2 -DPERFORMANCE_RUN=1
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
Exiting @ tick 2220101000 because exiting with last active thread context

同様だが、無事に実行できたようだ。CRCの値も一致している。