UNIX 系 OS 向けベンチマークとして、以前、UnixBench を紹介しました [1]。今回は、C コンパイラの違いでベンチマークの結果が違ってくるかどうかを調べてみました。最初、候補に挙げたコンパイラは GCC, Clang, pcc の3つでしたが、コンパイル名を変えただけでは pcc のコンパイルが出来なかったので、GCC と Clang の比較にとどめました。
ベンチマークのターゲットにした環境は前回と同じく下記のとおりです。
- PC: Stream 11-r016TU
- インテル® Celeron® プロセッサー N2840 (2.16GHz-2.58GHz, L2キャッシュ 1MB)
- OS: Fedora 24 x86_64(アルファ版)
GCC
GCC, GNU Compiler Collection の gcc は Linux Kernel のデフォルトコンパイラです。Fedora 24 では、GCC の version 6 が採用されています。Fedora 24 Alpha 版に収録されている GCC のバージョンは 6.0.0 です。ちなみに 4 月 27 日に GCC 6.1 がリリースされていますので、Fedora 24 のリリースでは GCC 6.1 以降が収録されると予想されます [3]。
GCC による UnixBench の実行方法は以下のとおりです。
$ cd byte-unixbench-master/UnixBench $ ls Makefile README Run USAGE WRITING_TESTS pgms src testdir $ make clean rm -f ./pgms/arithoh ./pgms/register ./pgms/short ./pgms/int ./pgms/long ./pgms/float ./pgms/double ./pgms/hanoi ./pgms/syscall ./pgms/context1 ./pgms/pipe ./pgms/spawn ./pgms/execl ./pgms/dhry2 ./pgms/dhry2reg ./pgms/looper ./pgms/fstime ./pgms/whetstone-double core *~ */*~ $ make make distr make[1]: ディレクトリ '/home/bitwalk/ダウンロード/byte-unixbench-master/UnixBench' に入ります Checking distribution of files ./pgms exists ./src exists ./testdir exists make[1]: ディレクトリ '/home/bitwalk/ダウンロード/byte-unixbench-master/UnixBench' から出ます make programs make[1]: ディレクトリ '/home/bitwalk/ダウンロード/byte-unixbench-master/UnixBench' に入ります gcc -o pgms/arithoh -Wall -pedantic -O3 -ffast-math -march=native -mtune=native -I ./src -DTIME -Darithoh src/arith.c gcc -o pgms/register -Wall -pedantic -O3 -ffast-math -march=native -mtune=native -I ./src -DTIME -Ddatum='register int' src/arith.c gcc -o pgms/short -Wall -pedantic -O3 -ffast-math -march=native -mtune=native -I ./src -DTIME -Ddatum=short src/arith.c ... (省略) ... make[1]: ディレクトリ '/home/bitwalk/ダウンロード/byte-unixbench-master/UnixBench' から出ます $ ./Run ... (省略) ...
Clang
Clang は、プログラミング言語 C, C++, Objective-C, Objective-C++ 向けのコンパイラフロントエンドです。バックエンドとして LLVM を使用しています。Mac OS X および iOS ならびに FreeBSD において標準のコンパイラとして採用されています。もちろん、Fedora でも利用できます。今回使用した Clang のバージョンは 3.8.0 です。
Clang による UnixBench の実行方法は以下のとおりです。
$ make clean rm -f ./pgms/arithoh ./pgms/register ./pgms/short ./pgms/int ./pgms/long ./pgms/float ./pgms/double ./pgms/hanoi ./pgms/syscall ./pgms/context1 ./pgms/pipe ./pgms/spawn ./pgms/execl ./pgms/dhry2 ./pgms/dhry2reg ./pgms/looper ./pgms/fstime ./pgms/whetstone-double core *~ */*~ $ make CC=clang make distr make[1]: ディレクトリ '/home/bitwalk/ダウンロード/byte-unixbench-master/UnixBench' に入ります Checking distribution of files ./pgms exists ./src exists ./testdir exists ./tmp exists ./results exists make[1]: ディレクトリ '/home/bitwalk/ダウンロード/byte-unixbench-master/UnixBench' から出ます make programs make[1]: ディレクトリ '/home/bitwalk/ダウンロード/byte-unixbench-master/UnixBench' に入ります clang -o pgms/arithoh -Wall -pedantic -O3 -ffast-math -march=native -mtune=native -I ./src -DTIME -Darithoh src/arith.c clang -o pgms/register -Wall -pedantic -O3 -ffast-math -march=native -mtune=native -I ./src -DTIME -Ddatum='register int' src/arith.c clang -o pgms/short -Wall -pedantic -O3 -ffast-math -march=native -mtune=native -I ./src -DTIME -Ddatum=short src/arith.c ... (省略) ... make[1]: ディレクトリ '/home/bitwalk/ダウンロード/byte-unixbench-master/UnixBench' から出ます $ ./Run ... (省略) ...
ベンチマーク結果
ベンチマーク結果の内、'2 CPUs in system; running 2 parallel copies of tests' の部分を以下にまとめました。
======================================================================== BYTE UNIX Benchmarks (Version 5.1.3) System: stream11: GNU/Linux OS: GNU/Linux -- 4.5.2-302.fc24.x86_64 -- #1 SMP Wed Apr 27 14:22:29 UTC 2016 Machine: x86_64 (x86_64) Language: en_US.utf8 (charmap="UTF-8", collate="UTF-8") CPU 0: Intel(R) Celeron(R) CPU N2840 @ 2.16GHz (4326.4 bogomips) Hyper-Threading, x86-64, MMX, Physical Address Ext, SYSENTER/SYSEXIT, SYSCALL/SYSRET, Intel virtualization CPU 1: Intel(R) Celeron(R) CPU N2840 @ 2.16GHz (4326.4 bogomips) Hyper-Threading, x86-64, MMX, Physical Address Ext, SYSENTER/SYSEXIT, SYSCALL/SYSRET, Intel virtualization
Compiler | gcc-6.0.0 | clang-3.8.0 |
---|---|---|
System Benchmarks Index Values | INDEX | INDEX |
Dhrystone 2 using register variables | 2,204.2 | 2,092.7 |
Double-Precision Whetstone | 787.4 | 777.0 |
Execl Throughput | 732.5 | 737.5 |
File Copy 1024 bufsize 2000 maxblocks | 973.1 | 998.3 |
File Copy 256 bufsize 500 maxblocks | 686.2 | 686.4 |
File Copy 4096 bufsize 8000 maxblocks | 1,562.1 | 1,644.8 |
Pipe Throughput | 1,417.8 | 1,408.7 |
Pipe-based Context Switching | 457.5 | 453.9 |
Process Creation | 873.6 | 886.1 |
Shell Scripts (1 concurrent) | 886.5 | 901.3 |
Shell Scripts (8 concurrent) | 844.6 | 838.4 |
System Call Overhead | 1,822.0 | 1,850.0 |
System Benchmarks Index Score | 1,002.1 | 1,005.7 |
ベンチマークの結果は、意外にも Clang のスコアの方がやや上回っていました。Clang/LLVM が、コンパイラに求められる現代的な機能を実現しているとは言え、コンパイルしたバイナリの実行速度では、まだ GCC のレベルには達していないと思っていたからです。
しかし、前回 UnixBench を紹介した時に、同じ環境および GCC で実施したスコアが、今回よりやや高い 1016.6 であったことを考えると、スコアの差はばらつきの範囲と考えて差し支えなさそうです [1]。このベンチマーク方法でコンパイラの性能差を精度よく評価できるかは判らないものの、GCC と Clang の差は、このベンチマークテストでは認められなかったということになります。
コンパイラ評価用のプログラムは、他のサイトで紹介されていますので、機会をみて試してみようと思います [4]。
参考サイト
- bitWalk's: UnixBench - UNIX系OS向けベンチマーク
- kdlucas/byte-unixbench: Automatically exported from code.google.com/p/byte-unixbench
- GCC Development Plan - GNU Project - Free Software Foundation (FSF) Version Numbering Scheme for GCC 5 and Up
- コンパイラ評価用プログラム
にほんブログ村
0 件のコメント:
コメントを投稿