2010-05-03

LLVM 2.7 のベンチマーク (2)

LLVM のベンチマークと言っても、コンパイルに使用するライブラリのほとんどが GCC でビルドされたものであることを考えると、前回の Tcl を使ったベンチマークは、あまりにもアバウトな比較だったように思います。
 
そこで、今回は、GMP を利用した円周率の計算プログラムで、GCC と LLVM/clang のパフォーマンスを較べてみました。計算の主要部分である GMP ライブラリを GCC と clang でビルドして用いれば、もう少し精度の良い比較が出きると考えたからです。
 
GMP は最新の 5.0.1 のスタティックライブラリを GCC, LLVM/clang それぞれでビルドしてローカルアカウントの領域にインストール、そのライブラリを使い、円周率計算プログラムを、それぞれに対応するコンパイラでビルドして比較してみました。
 
円周率の計算プログラムのソースは、GNU/Linux上で円周率の計算をおこなうで紹介されている pi.c を利用させていただきました。
 
GMP をビルドするのに使用したスクリプト build-gmp.sh を以下に示しました。このスクリプトは作業エリア $HOME/work/Pi/GMP/ 内に GMP のソースがあり、インストール先が使用したコンパイラに応じて、$HOME/work/Pi/GMP/${CC} であることを想定しています。

#!/bin/sh
 
# C compiler
#export CC=gcc
export CC=clang
 
# constants
export ver="5.0.1"
 
# remove old sources
echo "### Removing old sources & binaries"
rm -fR gmp-${ver}
 
# extract sources
echo "### Expanding sources to build"
tar jxvf gmp-${ver}.tar.bz2
 
# build GMP
echo "### build GMP"
cd gmp-${ver}
./configure --prefix=$HOME/work/Pi/GMP/${CC} \
--disable-shared --enable-static
make
make install

GCC と LLVM/clang でそれぞれビルド、円周率を計算した結果を以下に示しました。使用した PC は Thinkpad X31 です。なお、あらかじめ glibc のスタティックライブラリの RPM glibc-static がインストールされている必要があります。

### GCC 4.4.3
 
$ time ./build-gmp.sh
real 3m28.100s
user 0m50.568s
sys 1m19.172s
 
$ ls -l ./gcc/lib/libgmp.a
-rw-r--r--. 1 bitwalk bitwalk 816078 2010-05-03 23:24 ./gcc/lib/libgmp.a
 
$ gcc -static -O2 -I./gcc/include pi.c ./gcc/lib/libgmp.a -o pi
$ time ./pi > pi.dat
real 0m19.522s
user 0m18.564s
sys 0m0.661s
 
 
### LLVM/clang 2.7
 
$ time ./build-gmp.sh
real 4m2.098s
user 1m11.869s
sys 1m30.534s
 
$ ls -l ./clang/lib/libgmp.a
-rw-r--r--. 1 bitwalk bitwalk 739022 2010-05-03 23:36 ./clang/lib/libgmp.a
 
$ clang -static -O2 -I./clang/include pi.c ./clang/lib/libgmp.a -o pi
$ time ./pi > pi.dat
real 0m19.584s
user 0m18.661s
sys 0m0.622s

今回は、GMP のビルドに要した時間も計測してみましたが、意外にも clang でビルドした場合の方が時間が掛かっています(+16.3% 程度)。バイナリ libgmp.a のサイズは clang でビルドした方が明らかに小さく(-9.4% 程度)、実行速度は GCC よりやや遅い(+0.3% 程度)という結果になりました。
 
余談になりますが、Fedora 13(β版)の RPM パッケージ GMP 4.3.1 のスタティックライブラリを使って普通にビルドした場合の計算時間も確認しました。GMP 5.0.1 との差にびっくりです。

$ gcc -static -O2 pi.c -lgmp -o pi
$ time ./pi > pi.dat
real 0m38.492s
user 0m37.361s
sys 0m0.605s

参考サイト


[1] GNU/Linux上で円周率の計算をおこなう
[2] The GNU MP Bignum Library
 

0 件のコメント: