CPUのベンチマークといえば様々なものがあるが、有名なところといえば
- SPEC (https://spec.org/) Standard Performance Evaluation Corperation。おそらくもっとも有名なベンチマーク。各種CPUのベンチマーク評価などでも使用される。
- EEMBC(https://www.eembc.org/) Embedded Microprocessor Benchmark Consortium。組み込み向けのCPUの評価などに使用される。Coremarkなどが有名。
など様々なものが存在する。SPECは有料だが、EEMBCはCoremarkに限って無料となっている。しかし今回、Coremarkに加えて、mlmark(Machine Learning benchMARK)およびCoremark-PROがオープンソースとして公開されてみたので触ってみたい。まずはCoremark-PROから試行していく。
Coremark-PROとは、Coremarkの後継として開発されたベンチマークプログラムセットだ。これまでCoremarkは無料で使用することができたが、Coremark-PROはベータ版のみ無料、本物は有料となっていた。今回はCoremark-PROも無料となり、オープンソースとして公開されている。
Ceremarkは単一のプログラム(といっても複数のベンチマークプログラムをmain()
内で呼び出しているだけであるが)、Coremark-PROの場合は複数のプログラムから構成されている。
Coremark-PROのGitHubディレクトリを眺めているとbenchmarks
ディレクトリの中は複数のベンチマークから構成されていることが分かる。
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パッケージは無いかな?
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のコードを削除できないかな?