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を追加してみよう。
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
それでもやはりいくつかは割り込みによるジャンプが入っていた。ただし、そこまでの量ではない。これ、いったい何なんだろうな?
そして気になるCoremarkスコアは、start_time()=1162240000, stop_time()=1571200000
となり、408960サイクル、CMK/MHzは2.44となった。そこまで高くないなあ?