[[PageNavi(NavigationList)]]
=== インテル コンパイラーとGCCとのパフォーマンス差は? ===
さて、インテル Atom プロセッサー向け インテル アプリケーション・ソフトウェア開発ツール・スイートに含まれるインテル コンパイラーは「GCCよりも大幅に優れたパフォーマンスを提供します」とうたわれている。そこで、最後にGCCとインテル コンパイラーのパフォーマンス差について簡単ではあるがベンチマークを行った結果を紹介しよう。
Linux環境ではさまざまなベンチマークツールがあるが、これらの多くはCPUの単純な演算性能やI/O性能、グラフィック性能を測るものであり、コンパイラの性能比較には利用しにくい。そこで、ここではファイル圧縮/展開ツールであるbzip2をGCCおよびインテル コンパイラーでコンパイルし、ファイルの圧縮/展開速度を比較した。使用したbzip2のバージョンは1.0.5だ。なお、bzip2のソースコードは[http://www.bzip.org/ bzip2のWebサイト]からダウンロードできる。
==== bzip2のコンパイル ====
bzip2のコンパイル設定はconfigureスクリプトではなく、付属のMakefileを直接編集して行う。まず、ダウンロードしたソースコードを適当なディレクトリに展開する。
{{{
$ tar xvzf bzip2-1.0.5.tar.gz
}}}
Makefile冒頭でコンパイラや関連ツール、コンパイルオプションを設定するための変数が用意されているので、こちらを書き換える('''リスト1''')。
====== リスト1 Makefile中で編集を行う個所 ======
{{{
# To assist in cross-compiling
CC=gcc
AR=ar
RANLIB=ranlib
LDFLAGS=
BIGFILES=-D_FILE_OFFSET_BITS=64
CFLAGS=-Wall -Winline -O2 -g $(BIGFILES)
# Where you want it installed when you do 'make install'
PREFIX=/usr/local
}}}
設定する変数は、次の'''表6'''のとおりだ。
{{{ html
<h6>表6 bzip2のコンパイル設定</h6>
<table class="wikitable" border="1">
<tr><th>変数名</th><th>意味</th><th>GCCを利用する場合の設定</th><th>インテル コンパイラーを利用する場合の設定</th></tr>
<tr><td>CC</td><td>使用するコンパイラ</td><td>i586-moblin-linux-gcc</td><td>icc</td></tr>
<tr><td>AR</td><td>使用するアーカイバ</td><td>i586-moblin-linux-ar</td><td>xiar</td></tr>
<tr><td>RANLIB</td><td>使用するranlibツール</td><td colspan="2">i586-moblin-linux-ranlib</td></tr>
<tr><td>LDFLAGS</td><td>リンカーに与えるオプション</td><td>(なし)</td><td>-L$(PKG_CONFIG_SYSROOT_DIR)/usr/lib -L$(PKG_CONFIG_SYSROOT_DIR)/lib</td></tr>
<tr><td>CFLAGS</td><td>コンパイルオプション</td><td>-Wall -Winline -O2 -g $(BIGFILES)(デフォルトのまま)</td><td>-Wall -Winline -O2 -ipo -I$(PKG_CONFIG_SYSROOT_DIR)/usr/include -I$(PKG_CONFIG_SYSROOT_DIR)/include $(BIGFILES)</td></tr>
<tr><td>PREFIX</td><td>「make install」コマンドのインストール先</td><td>/tmp/bzip2_gcc</td><td>/tmp/bzip2_icc</td></tr>
</table>
}}}
Makefileの編集後「make」コマンドおよび「make install」コマンドを実行すると、PREFIX変数で指定したディレクトリ以下にバイナリが作成される。
{{{
$ make
$ make install
}}}
次に、作成したバイナリ一式をMoblin環境にコピーする。本来はRPMパッケージを作成し、rpmコマンドでのインストールを行うのが推奨されているが、今回はテスト目的であるため、ファイル一式を直接Moblin環境の/usr/localディレクトリ以下にSCPでコピーしている。たとえばインテル コンパイラーで作成したバイナリの場合、次のように実行する。
{{{
$ cd /tmp/bzip2_icc
$ scp -r * root@<Moblin環境のIPアドレス>:/usr/local/
}}}
==== ベンチマークテストの実行環境と実行方法 ====
今回のテストでは、CPUとしてAtom N270(1.60GHz)を搭載するネットブック「EeePC 901」を使用した。スペックやそのほかの環境は次の'''表7'''のとおりだ。
{{{ html
<h6>表7 テストを実行した環境</h6>
<table class="wikitable" border="1">
<tr><th>構成要素</th><th>スペック</th></tr>
<tr><td>CPU</td><td>Atom N270(1.60GHz)</td></tr>
<tr><td>メモリ</td><td>1GB</td></tr>
<tr><td>ストレージ</td><td>ASUS-PHISON SSD TST2(8GB)</td></tr>
<tr><td>Linuxカーネルバージョン</td><td>2.6.31.6-17.1.moblin2-netbook</td></tr>
</table>
}}}
ベンチマークでは[https://developer.mozilla.org/en/Download_Mozilla_Source_Code Firefox 3.6のソースアーカイブ(firefox-3.6.source.tar.bz2)]を使用し、これを展開/圧縮するのにかかった時間をtimeコマンドで計測した。ストレージの読み書きによる影響を抑えるため、展開/圧縮した結果はディスクに書き出さないようにしている。
{{{
$ time bzip2 -d -c firefox-3.6.source.tar.bz2 /dev/null (展開)
$ time bzip2 -z -c firefox-3.6.source.tar /dev/null (圧縮)
}}}
計測は合計4回行い、ディスクキャッシュの影響を抑えるため2回目〜4回目の値を有効な計測結果とした。得られた計測結果は次の'''表8、''''''図12'''のとおりだ。
{{{ html
<h6>表8 bzip2を使用したベンチマーク結果</h6>
<table class="wikitable" border="1">
<tr><th>操作</th><th>コンパイラー</th><th>1回目</th><th>2回目</th><th>3回目</th><th>平均</th></tr>
<tr><td rowspan="2">圧縮</td><td>インテル コンパイラー</td><td>284.311秒</td><td>283.442秒</td><td>284.739秒</td><td>284.16秒</td></tr>
<tr><td>GCC</td><td>339.414秒</td><td>339.375秒</td><td>339.954秒</td><td>339.58秒</td></tr>
<tr><td rowspan="2">展開</td><td>インテル コンパイラー</td><td>43.727秒</td><td>44.030秒</td><td>43.662秒</td><td>43.81秒</td></tr>
<tr><td>GCC</td><td>44.256秒</td><td>44.248秒</td><td>44.539秒</td><td>44.35秒</td></tr>
</table>
}}}
[[Thumb(d0ce87413d4b588795d0a7611076ead9.png, caption=図12 bzip2によるベンチマーク結果)]]
圧縮については、インテル コンパイラーでコンパイルしたバイナリが、GCCでコンパイルしたものよりも2割近く高速という結果となった。また、展開処理については差は大きくないものの、こちらもインテル コンパイラーのほうが高速という結果が得られている。
Moblinがターゲットとするネットブックやモバイルインターネット端末で採用されているAtom CPUは、一般的なPCで採用されているCore/Celeronシリーズと比べると処理性能が低いため、PC上ではあまり気にならなかった速度差も、Moblin上で実行すると大きく感じられる可能性がある。再コンパイルだけでパフォーマンスの向上を図れるインテル コンパイラーは、パフォーマンスが必要とされるアプリケーション開発において大きく役立つツールと言えるだろう。
[[PageNavi(NavigationList)]]