HPC/並列プログラミングポータルでは、HPC(High Performance Computing)プログラミングや並列プログラミングに関する情報を集積・発信しています。

新着トピックス

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

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

 bzip2のソースコードは、Webサイトのダウンロードページからダウンロードできる。コンパイル方法はシンプルで、含まれる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通りを用意し、それぞれの設定でコンパイルしたバイナリのパフォーマンスの違いを計測する。

表4 比較に使用した最適化オプション
名称コンパイラ最適化オプション
icc:O1ICC-O1
icc:O2ICC-O2
icc:O3ICC-O3
icc:O2/ipICC-O2 -ip
icc:O3/ipICC-O3 -ip
icc:O2/ipoICC-O2 -ipo
icc:O3/ipoICC-O3 -ipo
icc:O3/ip/paraICC-O3 -ip -parallel -par-threshold90
icc:O3/ip/SSSE3ICC-O3 -ip -xSSSE3
gccgcc-O2

 なお、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

実行結果を比較する

 パフォーマンスの比較には、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マシンだ。

表5 ベンチマークテストに使用したPCのスペック
構成要素スペック
CPUCore 2 Duo E6550(2.33GHz)
OSDebian GNU/Linux 5.0
メモリ2GB
HDD(OS)Seagate Barracuda 7200.10(250GB)

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

 また、圧縮ファイルを展開する作業については、インテル コンパイラーでコンパイルすることでGCCと比べ1割程度の高速化が可能だった。こちらの場合は、もっとも高速だったのは「-O2 -ipo」オプション付きでコンパイルしたバイナリであった。