• Showing Page History #49437

Show page source of インテル_コンパイラーでオープンソースソフトウェアをコンパイルしよう_p3 #49711

[[PageNavi(NavigationList)]]



==== Linux環境でのコンパイル――bzip2 ====


 まずは小手調べとして、さまざまなプラットフォームで動作するコマンドラインのファイル圧縮ツール「[http://www.bzip.org/ bzip2]」をLinux版のインテル コンパイラーでコンパイルしてみよう。Windowsユーザーにはあまりなじみが無いかもしれないが、bzip2は主にUNIX/Linux環境で多く利用されている、高圧縮を誇る圧縮ツールである。記事執筆時点での最新版は2008年3月にリリースされている1.0.5だ。


 bzip2のソースコードは、Webサイトの[http://www.bzip.org/downloads.html ダウンロードページ]からダウンロードできる。コンパイル方法はシンプルで、含まれるMakefileを環境に応じて編集し、makeを実行するだけである。今回編集する個所は下記のとおりだ。
{{{
CC=gcc
AR=ar
RANLIB=ranlib
LDFLAGS=

BIGFILES=-D_FILE_OFFSET_BITS=64
CFLAGS=-Wall -Winline -O2 -g $(BIGFILES)

を以下のように変更

CC=icc
AR=xiar
RANLIB=ranlib
LDFLAGS=

BIGFILES=-D_FILE_OFFSET_BITS=64
CFLAGS=-Wall -Winline <最適化オプション> $(BIGFILES)
}}}


 また、コンパイルオプションについては、'''表4'''のようにインテル コンパイラー(ICC)9通りと、GCC(-O2オプション)1通りの合計10通りを用意し、それぞれの設定でコンパイルしたバイナリのパフォーマンスの違いを計測する。
{{{ html
<h6>表4 比較に使用した最適化オプション</h6>
<table class="wikitable" border="1">

<tr><th>名称</th><th>コンパイラ</th><th>最適化オプション</th></tr>
<tr><td>icc:O1</td><td>ICC</td><td>-O1</td></tr>
<tr><td>icc:O2</td><td>ICC</td><td>-O2</td></tr>
<tr><td>icc:O3</td><td>ICC</td><td>-O3</td></tr>
<tr><td>icc:O2/ip</td><td>ICC</td><td>-O2 -ip</td></tr>
<tr><td>icc:O3/ip</td><td>ICC</td><td>-O3 -ip</td></tr>
<tr><td>icc:O2/ipo</td><td>ICC</td><td>-O2 -ipo</td></tr>
<tr><td>icc:O3/ipo</td><td>ICC</td><td>-O3 -ipo</td></tr>
<tr><td>icc:O3/ip/para</td><td>ICC</td><td>-O3 -ip -parallel -par-threshold90</td></tr>
<tr><td>icc:O3/ip/SSSE3</td><td>ICC</td><td>-O3 -ip -xSSSE3</td></tr>
<tr><td>gcc</td><td>gcc</td><td>-O2</td></tr>

</table>
}}}


 なお、bzip2はWindows環境でもコンパイル可能だ。Window版インテル C++ コンパイラーでコンパイルする場合は、付属しているWindows環境向けのmakefile(makefile.msc)を下記のように修正し、これを「nmake -f makefile.msc」のようにVisual C++付属のnmakeコマンドの引数として指定すればよい。
{{{
CC=cl
CFLAGS= -DWIN32 -MD -Ox -D_FILE_OFFSET_BITS=64 -nologo

を以下のように変更

CC=icl
CFLAGS= -DWIN32 -MD <最適化オプション> -D_FILE_OFFSET_BITS=64 -nologo
}}}
====== 実行結果を比較する ======


 パフォーマンスの比較には、[ftp://ftp.mozilla.org/pub/firefox/releases/3.1b2/source/ Firefox 3.1b2のソースアーカイブ](firefox-3.1b2-source.tar.bz2、約40MB)を利用した。このファイルを展開するのにかかった時間と、展開したファイルを再度圧縮するのにかかった時間を3回測定し、その平均を結果としている。展開および圧縮は、次のようなコマンドラインオプションで実行した。なお、HDDアクセスのオーバーヘッドが結果に影響しないよう、出力先として/dev/nullデバイスを指定してファイルへの書き込みを行わないようにしている。
{{{
展開:
$ ./bzip2 -c -k -d firefox-3.1b2-source.tar.bz2  /dev/null

圧縮:
$ ./bzip2 -k -z --best firefox-3.1b2-source.tar  /dev/null
}}}


 また、テストに使用したPC環境は'''表5'''のようなCore 2 Duoマシンだ。
{{{ html
<h6>表5 ベンチマークテストに使用したPCのスペック</h6>
<table class="wikitable" border="1">

<tr><th>構成要素</th><th>スペック</th></tr>
<tr><td>CPU</td><td>Core 2 Duo E6550(2.33GHz)</td></tr>
<tr><td>OS</td><td>Debian GNU/Linux 5.0</td></tr>
<tr><td>メモリ</td><td>2GB</td></tr>
<tr><td>HDD(OS)</td><td>Seagate Barracuda 7200.10(250GB)</td></tr>

</table>
}}}


 さて、それではベンチマーク結果を見てみよう。'''図4'''が圧縮にかかった時間、'''図5'''が展開にかかった時間をまとめたものだ。まず、圧縮の場合について見てみると、インテル コンパイラーでコンパイルしたものはGCCでコンパイルしたものに比べ、6割強の時間で作業が完了している。また、「-ip」オプションを付けてコンパイルしたものがもっとも速かったものの、コンパイルオプションを変えた場合でも実行時間には大幅な変化は見られなかった。


 また、圧縮ファイルを展開する作業については、インテル コンパイラーでコンパイルすることでGCCと比べ1割程度の高速化が可能だった。こちらの場合は、もっとも高速だったのは「-O2 -ipo」オプション付きでコンパイルしたバイナリであった。
[[Thumb(c58d7b37075625673d514cb805d894dd.png, caption=図4 bzip2のファイル圧縮ベンチマーク結果)]]

[[Thumb(eac9eecf5ad230180d71ac12df2adf35.png, caption=図5 bzip2のファイル展開ベンチマーク結果)]]



[[PageNavi(NavigationList)]]