FPGA開発日記

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

GitHubでCoremark-PROがオープンソース化されたので試してみる

CPUのベンチマークといえば様々なものがあるが、有名なところといえば

など様々なものが存在する。SPECは有料だが、EEMBCはCoremarkに限って無料となっている。しかし今回、Coremarkに加えて、mlmark(Machine Learning benchMARK)およびCoremark-PROがオープンソースとして公開されてみたので触ってみたい。まずはCoremark-PROから試行していく。

github.com

Coremark-PROとは、Coremarkの後継として開発されたベンチマークプログラムセットだ。これまでCoremarkは無料で使用することができたが、Coremark-PROはベータ版のみ無料、本物は有料となっていた。今回はCoremark-PROも無料となり、オープンソースとして公開されている。

Ceremarkは単一のプログラム(といっても複数のベンチマークプログラムをmain()内で呼び出しているだけであるが)、Coremark-PROの場合は複数のプログラムから構成されている。

github.com

Coremark-PROのGitHubディレクトリを眺めているとbenchmarksディレクトリの中は複数のベンチマークから構成されていることが分かる。

f:id:msyksphinz:20190831164054p:plain
Coremark-PROのベンチマークプログラムのディレクトリ構成

Coremark-PROをx86マシンで動かす

では、まずはx86ベンチマークプログラムを動かしてみよう。使用しているのは私のSurface Laptop 2ノートPCである。

git clone https://github.com/eembc/coremark-pro.git

とりあえず手元のマシンで動作するかどうかを確認した。ビルドには以下のコマンドを使用する。

make TARGET=linux64 build

上記のコマンドで、以下のbuilds/linux64/gcc64/binにバイナリファイルが生成されていることが分かる。

$ tree builds/linux64/gcc64/bin
builds/linux64/gcc64/bin
├── cjpeg-rose7-preset.exe
├── core.exe
├── data
├── linear_alg-mid-100x100-sp.exe
├── loops-all-mid-10k-sp.exe
├── nnet_test.exe
├── parser-125k.exe
├── radix2-big-64k.exe
├── sha-test.exe
└── zip-test.exe

ベンチマークプログラムを走らせるためには、以下のようにコマンドを実行する。

make TARGET=linux64 XCMD='-c4' certify-all

ベンチマークプログラムを走らせた結果は、以下のようになった。

WORKLOAD RESULTS TABLE

                                                 MultiCore SingleCore
Workload Name                                     (iter/s)   (iter/s)    Scaling
----------------------------------------------- ---------- ---------- ----------
cjpeg-rose7-preset                                  357.14     119.05       3.00
core                                                  5.40       1.87       2.89
linear_alg-mid-100x100-sp                           400.00     169.49       2.36
loops-all-mid-10k-sp                                 19.96       6.02       3.32
nnet_test                                            16.89       7.27       2.32
parser-125k                                          50.00      19.23       2.60
radix2-big-64k                                     1543.21     449.84       3.43
sha-test                                            344.83     158.73       2.17
zip-test                                            222.22     111.11       2.00

MARK RESULTS TABLE

Mark Name                                        MultiCore SingleCore    Scaling
----------------------------------------------- ---------- ---------- ----------
CoreMark-PRO                                      12068.25    4581.69       2.63

RISC-Vへのポーティングを試みる

Coremark-PROをRISC-Vへの移植するためには、どのようにすれば良いのだろうか?

内部を調査していると、Coremarkの内部に複数のMakefileが入っており、これらを改造すればよいように思われる。以下のファイルを新たに追加してみた。中身は、

util/make/riscv64-unknown-elf-gcc.mak   # gcc.makからコピーして作成
util/make/riscv64.mak                   # linux64.makからコピーして作成

まずは、以下のようにしてビルドを実行する。以下のようにしてエラーが発生した。

/home/msyksphinz/riscv64/lib/gcc/riscv64-unknown-elf/7.2.0/../../../../riscv64-unknown-elf/bin/ld: cannot find -lpthread
/home/msyksphinz/riscv64/lib/gcc/riscv64-unknown-elf/7.2.0/../../../../riscv64-unknown-elf/bin/ld: cannot find -lrt

いろいろ調査してみたが、どうも上手く行かない。libpthread, librtが存在しているRISC-V GCCパッケージは無いかな?

  • riscv64-unknown-linux-gnuを使用してみると以下のエラーが発生した。
al_file.c:(.text+0xb2): undefined reference to `_impure_ptr'
/home/msyksphinz/riscv64-ctng-linux/lib/gcc/riscv64-unknown-linux-gnu/8.3.0/../../../../riscv64-unknown-linux-gnu/bin/ld: al_file.c:(.text+0xb6): 
/home/msyksphinz/riscv64-ctng-linux/lib/gcc/riscv64-unknown-linux-gnu/8.3.0/../../../../riscv64-unknown-linux-gnu/bin/ld: al_file.c:(.text+0xba): undefined reference to `__srget_r'
collect2: error: ld returned 1 exit status

うーん、単純なpthreadのプログラムは動くんだが。。。 どうにかしてpthreadのコードを削除できないかな?