Gem5のリグレッションテストが流れたので、次は自分でプログラムをコンパイルして動かしてみたい。
手っ取り早く、Coremarkのベンチマークプログラムが動かないかと思い、試行してみることにした。
CoremarkをGitHubからダウンロードし、展開する。
次に、linux64
のディレクトリをコピーして、riscv64gc
ディレクトリを作成した。内容を編集する。
linux64
とriscv64gc
の差分は以下のようにした。
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の値も一致している。