2016-05-07

UnixBench - UNIX系OS向けベンチマーク (2)

UNIX 系 OS 向けベンチマークとして、以前、UnixBench を紹介しました [1]。今回は、C コンパイラの違いでベンチマークの結果が違ってくるかどうかを調べてみました。最初、候補に挙げたコンパイラは GCC, Clang, pcc の3つでしたが、コンパイル名を変えただけでは pcc のコンパイルが出来なかったので、GCC と Clang の比較にとどめました。

ベンチマークのターゲットにした環境は前回と同じく下記のとおりです。

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]

参考サイト

  1. bitWalk's: UnixBench - UNIX系OS向けベンチマーク
  2. kdlucas/byte-unixbench: Automatically exported from code.google.com/p/byte-unixbench
  3. GCC Development Plan - GNU Project - Free Software Foundation (FSF) Version Numbering Scheme for GCC 5 and Up
  4. コンパイラ評価用プログラム

 

ブログランキング・にほんブログ村へ
にほんブログ村

0 件のコメント: