FPGA開発日記

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

RISC-Vコア BOOM向けのCoremarkリポジトリの準備

BOOMコアの解析の続き。やはり途中で割り込みに飛んでしまう動作が気に食わないので、riscv-testsのリポジトリをForkしてCoremarkを追加してみようと思った。

まず、Coremarkのriscv-testsのディレクトリを解析してみよう。riscv-testsのbenchmarkディレクトリは以下のようになっている。

.
├── Makefile
├── common
│   ├── crt.S
│   ├── syscalls.c
│   ├── test.ld
│   └── util.h
...
├── mt-vvadd
│   ├── bmark.mk
│   ├── dataset.h
│   ├── mt-vvadd.c
│   ├── vvadd.c
│   └── vvadd_gendata.pl
├── multiply
│   ├── bmark.mk
│   ├── dataset1.h
│   ├── multiply.c
│   ├── multiply.h
│   ├── multiply_gendata.pl
│   └── multiply_main.c
├── qsort
...

つまり、中央のMakefileに共通の設定を記述して、個々のbmark.mkに個別の設定を追加するわけだ。早速Coremarkを追加してみよう。

github.com

coremarkのディレクトリを追加した。また、コンパイルオプションに最適化オプションを追加した。

├── coremark
│   ├── bmark.mk
│   ├── bmark.mk~
│   ├── core_list_join.c
│   ├── core_main.c
│   ├── core_matrix.c
│   ├── core_portme.c
│   ├── core_portme.h
│   ├── core_state.c
│   ├── core_util.c
│   ├── coremark.h
│   ├── ee_printf.c
│   ├── encoding.h
│   ├── syscalls.c
│   └── util.h
  • coremark/bmark.mk
FLAGS_STR = "$(PORT_CFLAGS) $(XCFLAGS) $(XLFLAGS) $(LFLAGS_END)"
RISCV_GCC_OPTS += -O3 -funroll-loops -fno-builtin $(PORT_CFLAGS) -I$(PORT_DIR) -I. -DFLAGS_STR=\"$(FLAGS_STR)\" -DITERATIONS=1
RISCV_LINK_OPTS += -O3 -funroll-loops -fno-builtin

これでCoremarkをコンパイルできるようになったが、他のベンチマークは落ちるようになってしまった。これは後で解析しなければならない。

make

riscv64-unknown-elf-gcc -T ./common/test.ld -I./../env -I./common -I./median -I./qsort -I./rsort -I./towers -I./vvadd -I./multiply -I./mm -I./dhrystone -I./spmv -I./mt-vvadd -I./mt-matmul -I./coremark  mm_main.o  mm.o  syscalls.o  crt.o -o mm.riscv -nostdlib -nostartfiles -ffast-math -lgcc -O3 -funroll-loops -fno-builtin
mm_main.o: 関数 `.L18' 内:
mm_main.c:(.text+0x3b0): `fabs' に対する定義されていない参照です
mm_main.c:(.text+0x3c4): `fabs' に対する定義されていない参照です
mm.o: 関数 `.L8' 内:
mm.c:(.text+0xe4): `fma' に対する定義されていない参照です
mm.c:(.text+0x104): `fma' に対する定義されていない参照です
mm.c:(.text+0x128): `fma' に対する定義されていない参照です
mm.c:(.text+0x144): `fma' に対する定義されていない参照です
mm.c:(.text+0x168): `fma' に対する定義されていない参照です
mm.o:mm.c:(.text+0x180): `fma' に対する定義されていない参照がさらに続いています
collect2: error: ld returned 1 exit status
mm/bmark.mk:28: ターゲット 'mm.riscv' のレシピで失敗しました
make: *** [mm.riscv] エラー 1

仕方がないのでCoremarkだけコンパイルする。

make coremark.riscv
...
riscv64-unknown-elf-gcc -T ./common/test.ld -I./../env -I./common -I./median -I./qsort -I./rsort -I./towers -I./vvadd -I./multiply -I./mm -I./dhrystone -I./spmv -I./mt-vvadd -I./mt-matmul -I./coremark  core_list_join.o  core_main.o  core_matrix.o  core_portme.o  core_state.o  core_util.o  ee_printf.o  syscalls.o  crt.o \
    -o coremark.riscv -nostdlib -nostartfiles -ffast-math -lgcc -O3 -funroll-loops -fno-builtin

無事にコンパイルできたので、BOOMに読み込ませて実行してみよう。まずはboomのディレクトリで、coremark.riscvにリンクを張る。

msyksphinz@msyksphinz-VirtualBox:~/work/rocket-chip/emulator$ pwd
/home/msyksphinz/work/rocket-chip/emulator
msyksphinz@msyksphinz-VirtualBox:~/work/rocket-chip/emulator$ ls -ltr output/coremark.riscv
lrwxrwxrwx 1 msyksphinz msyksphinz 83  4月 18 01:10 output/coremark.riscv -> /home/msyksphinz/work/rocket-chip/riscv-tools/riscv-tests/benchmarks/coremark.riscv

これでシミュレーションを実行すると、私のマシンでは約10分くらいでシミュレーションが完了した。いつも通り編集してパイプライントレースを生成してみる。

make CONFIG=BOOMConfig output/coremark.riscv.out
sed -ei '1d' output/coremark.riscv.out 
../boom/util/pipeview-helper.py -f output/coremark.riscv.out > coremark.trace.out
~/work/gem5/util/o3-pipeview.py -o coremark.pipe.out --color coremark.trace.out

それでもやはりいくつかは割り込みによるジャンプが入っていた。ただし、そこまでの量ではない。これ、いったい何なんだろうな?

f:id:msyksphinz:20170419011131p:plain

そして気になるCoremarkスコアは、start_time()=1162240000, stop_time()=1571200000となり、408960サイクル、CMK/MHzは2.44となった。そこまで高くないなあ?

やはりコンパイラGCCを使っているのがダメなんだろうか?Clangとか使ってみようかなあ。