前回に引き続き、RocketChipおよびBOOMでCoremarkを動作させる。いろいろ調査した結果、RocketChipとBOOMでコンパイラを切り分けなければならないので、 それを適用してCoremarkをコンパイルしてみる。
ここでは、RocketChip版は${ROCKET_CHIP}
リポジトリ、BOOM版は${BOOM}
リポジトリで作業することにする。
また、Freedom-e-sdkリポジトリを${FREEDOM}
、Coremarkのファイル群を、${COREMARK}
に格納しているものとする。
また、RocketChip版のGCCは${RISCV_ROCKET}
, BOOM版のGCCは ${RISCV_BOOM}
に格納されているものとする。
- RocketChipt版
cd ${ROCKET_CHIP}/riscv-tools/riscv-tests/benchmarks mkdir coremark && cd coremark # Freedom-e-sdkからCoremarkのコードの一部をコピーする。 cp ${FREEDOM}/software/coremark/core_portme.* . # Coremarkファイル群をコピーする cp ${COREMARK}/*.c . cp ${COREMARK}/*.h .
- BOOM版
cd ${BOOM}/riscv-tools/riscv-tests/benchmarks mkdir coremark && cd coremark # Freedom-e-sdkからCoremarkのコードの一部をコピーする。 cp ${FREEDOM}/software/coremark/core_portme.* . # Coremarkファイル群をコピーする cp ${COREMARK}/*.c . cp ${COREMARK}/*.h .
core_portme.h を以下のように変更する。
// #define COMPILER_FLAGS FLAGS_STR #define COMPILER_FLAGS "-DPREALLOCATE=1 -mcmodel=medany -static -std=gnu99 -O2 -ffast-math -fno-common -fno-builtin-printf"
core_portme.c は以下のように変更する。ITERATIONS
はシミュレーション時間によって変更する。今回は2に設定した。
#define ITERATIONS 2 #include <stdio.h> #include <stdlib.h> #include "coremark.h" // #include "platform.h" #include "encoding.h" ... void start_time(void) { // get_timer_value()はサポートしてないのでコメントアウト // t0 = get_timer_value(); } void stop_time(void) { // get_timer_value()はサポートしてないのでコメントアウト // t1 = get_timer_value(); } ... // 10秒以上Coremarkを動作させないとエラーになるので、疑似的に実行時間を10.0に設定する。 secs_ret time_in_secs(CORE_TICKS ticks) { // scale timer down to avoid uint64_t -> double conversion in RV32 int scale = 256; uint32_t delta = ticks / scale; // uint32_t freq = get_timer_freq() / scale; // uint32_t freq = 100; // return delta / (double)freq; return 10.0; }
実際にコンパイルを実行する。
- RocketChip版
$ PATH=${ROCKET_RISCV}/bin/:${PATH} make clean coremark.riscv ... msyksphinz@msyksphinz-virualbox:~/work/rocket-chip-rocket/emulator$ make output/coremark.riscv.out CONFIG=DefaultConfig ./emulator-rocketchip-DefaultConfig +max-cycles=100000000 +verbose output/coremark.riscv 2> output/coremark.riscv.out && [ $PIPESTATUS -eq 0 ] 2K performance run parameters for coremark. CoreMark Size : 666 Total ticks : 0 Total time (secs): %f Iterations/Sec : %f Iterations : 2 Compiler version : GCC7.1.1 20170509 Compiler flags : -DPREALLOCATE=1 -mcmodel=medany -static -std=gnu99 -O2 -ffast-math -fno-common -fno-builtin-printf Memory location : STACK seedcrc : 0xe9f5 [0]crclist : 0xe714 [0]crcmatrix : 0x1fd7 [0]crcstate : 0x8e3a [0]crcfinal : 0x72be Correct operation validated. See readme.txt for run and reporting rules.
- BOOM版
$ PATH=${BOOM_RISCV}/bin/:${PATH} make clean coremark.riscv make output/coremark.riscv.out CONFIG=BOOMConfig ./emulator-rocketchip-BOOMConfig +max-cycles=100000000 +verbose output/coremark.riscv 3>&1 1>&2 2>&3 | /home/msyksphinz/riscv-boom/bin/spike-dasm > output/coremark.riscv.out && [ $PIPESTATUS -eq 0 ] 2K performance run parameters for coremark. CoreMark Size : 666 Total ticks : 0 Total time (secs): %f Iterations/Sec : %f Iterations : 2 Compiler version : GCC6.1.0 Compiler flags : -DPREALLOCATE=1 -mcmodel=medany -static -std=gnu99 -O2 -ffast-math -fno-common -fno-builtin-printf Memory location : STACK seedcrc : 0xe9f5 [0]crclist : 0xe714 [0]crcmatrix : 0x1fd7 [0]crcstate : 0x8e3a [0]crcfinal : 0x72be Correct operation validated. See readme.txt for run and reporting rules. msyksphinz@msyksphinz-virualbox:~/work/rocket-chip-boom/emulator$
なんとなく動作はしているなー。
サイクル数を取得する
それぞれのRTLシミュレーションログから、サイクル数を取得しよう。
- RocketChip版
PATH=${ROCKET_RISCV}/bin:${PATH} riscv64-unknown-elf-nm output/coremark.riscv | grep -e start_time -e stop_time 0000000080001c04 T start_time 0000000080001c06 T stop_time $ grep -e 80001c04 -e 80001c06 output/coremark.riscv.out C0: 235555 [1] pc=[0080001c04] W[r 0=0000000080001c06][1] R[r 1=0000000080002bb8] R[r 0=0000000000000000] inst=[00008067] DASM(00008067) C0: 235556 [0] pc=[0080001c04] W[r 0=0000000080001c06][0] R[r 1=0000000080002bb8] R[r 0=0000000000000000] inst=[00008067] DASM(00008067) C0: 235557 [0] pc=[0080001c04] W[r 0=0000000080001c06][0] R[r 1=0000000080002bb8] R[r 0=0000000000000000] inst=[00008067] DASM(00008067) C0: 235558 [0] pc=[0080001c04] W[r 0=0000000080001c06][0] R[r 1=0000000080002bb8] R[r 0=0000000000000000] inst=[00008067] DASM(00008067) C0: 1252559 [1] pc=[0080001c06] W[r 0=0000000080001c08][1] R[r 1=0000000080002bd2] R[r 0=0000000000000000] inst=[00008067] DASM(00008067) C0: 1252560 [0] pc=[0080001c06] W[r 0=0000000080001c08][0] R[r 1=0000000000000000] R[r 0=0000000000000003] inst=[00008067] DASM(00008067) C0: 1252561 [0] pc=[0080001c06] W[r 0=0000000080001c08][0] R[r 1=0000000000000000] R[r 0=0000000000000003] inst=[00008067] DASM(00008067) C0: 1252562 [0] pc=[0080001c06] W[r 0=0000000080001c08][0] R[r 1=0000000000000000] R[r 0=0000000000000003] inst=[00008067] DASM(00008067) C0: 1252563 [0] pc=[0080001c06] W[r 0=0000000080001c08][0] R[r 1=0000000000000000] R[r 0=0000000000000003] inst=[00008067] DASM(00008067)
したがって、
- start_time : 235555
- stop_time : 1252559
と見ることができる。
- BOOM版
PATH=${BOOM_RISCV}/bin:${PATH} riscv64-unknown-elf-nm output/coremark.riscv | grep -e start_time -e stop_time 0000000080002110 T start_time 0000000080002114 T stop_time $ grep -e 80002110 -e 80002114 output/coremark.riscv.out 174448; O3PipeView:fetch: 338334000:0x0080002110:0: 174448:ret 1120353; O3PipeView:fetch: 1019847000:0x0080002114:0: 1120353:ret
したがって、
- start_time : 174448
- stop_time : 1120353
と見ることができる。
ITERATION=2とは言え、かなり遅いなあ。本当にあっているのだろうか?ECCが合っているので実行自体は正しいのだろうけど。