FPGA開発日記

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

64bit BOOMプロセッサでCoremarkを動作させたい (2. RTLによるシミュレーション)

前回に引き続き、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が合っているので実行自体は正しいのだろうけど。

f:id:msyksphinz:20170524000502p:plain

関連記事

msyksphinz.hatenablog.com