インテル コンパイラーでオープンソースソフトウェアをコンパイルしよう 4ページ

Windows環境でのコンパイル――ImageMagick

 続いて、Windows環境でコンパイルできるオープンソースソフトウェアの例として、画像のバッチ処理ツール「ImageMagick」をコンパイルしてみよう。ImageMagickは画像のリサイズやフォーマット変換、結合など、さまざまな処理をバッチ処理できるコマンドラインツールだ。

 Windows環境でのImageMagickのコンパイルはInstall from Sourceページで解説されているが、まず設定ツールをビルドして実行することでVisual Studio用のプロジェクトファイルが作成され、次にそのプロジェクトファイルをVisual Studioで開いてビルドする、という手順となる。Windows向けの設定ツールはWindows向けソースパッケージにのみ含まれているので、こちらをダウンロードしよう。

 ZIPアーカイブを展開すると、「VisualMagick\configure」ディレクトリ以下に「configure.vcproj」というプロジェクトファイルが含まれているので、これをVisual Studioで開き、まずデフォルト設定のままでコンパイルを行う。すると、同じディレクトリ内に「configure.exe」という実行ファイルができるので、続けてこれを実行する。

 このconfigure.exeは、Windows環境向けのコンパイル設定ツールで、ウィザードに従って出力ディレクトリや共有ライブラリ/静的ライブラリのどちらを使うかなどを指定することで、Visual Studio用のプロジェクトファイルを生成できる(図6)。これで作成されたプロジェクトファイルをVisual Studioで開き、コンパイルオプションなどを設定後、プロジェクトのビルドを実行するとImageMagickがビルドされる。

図6 ImageMagickに含まれるコンパイル設定ツール
図6 ImageMagickに含まれるコンパイル設定ツール

 configure.exeでは共有ライブラリ(DLL)の使用/不使用や中間ファイルおよび出力ファイルの保存先などを指定できるが、今回はすべてデフォルトのまま、共有ライブラリを使用する設定を使用した。なお、出力されるプロジェクトファイルはVisual Studio 7(Visual Studio .NET)形式であるが、Visual Studio 2005/2008でも問題なく開くことができた。

 コンパイルオプションについては、表6のようにインテル コンパイラー(ICC)7通りと、Visual C++(VC++)1通りの合計8通りを用意し、それぞれの設定でコンパイルしたバイナリのパフォーマンスの違いを計測する。それ以外のコンパイルオプションについては、表7図7のように設定した。

表6 使用したコンパイルオプション
設定名 コンパイラ コンパイルオプション
ICC:O2 ICC /O2
ICC:O2/ip ICC /O2 /Qip
ICC:O2/ipo ICC /O2 /Qipo
ICC:O3 ICC /O3
ICC:O3/ip ICC /O3 /Qip
ICC:O3/ipo ICC /O3 /Qipo
ICC:O3/parallel ICC /O3 /Qparallel /Qpar-threshold:90
ICC:O3/SSSE3 ICC /O3 /QxSSSE3
VC++ VC++ /O2


表7 そのほかのコンパイルオプション設定(抜粋)
設定項目 設定値
グローバルな最適化 はい(/Og)
Windowsアプリケーションの最適化 はい(/GA)
インライン関数の展開 拡張可能な関数すべて(/Ob2)
組み込み関数を使用する はい(/Oi)
フレームポインターなし はい(/Oy)


図7 コンパイルオプション設定画面
図7 コンパイルオプション設定画面
実行結果

 ImageMagickには画像形式の変換や加工を行う「convert」や比較を行う「compare」、合成を行う「composite」などのコマンドが含まれているが、今回のベンチマークテストではこのうちconvertコマンドを使った3つの操作を行い、それぞれの処理にかかった時間を測定した(表8)。なお、ファイルアクセスによるオーバーヘッドが実行時間に影響しないよう、出力ファイルには「nul」を指定して実際のファイル出力は行わないようにしている。使用したPCの環境は表9のとおりだ。

表8 ベンチマークの詳細
処理名 処理の内容 実行するコマンドライン
resize 4000×3000のJPEG画像を8000×6000に拡大 convert.exe -resize 8000×6000 sample.JPG nul
blur 4000×3000のJPEG画像に半径100のぼかしフィルタを適用する convert.exe -blur 100 sample.JPG nul
monochrome 4000×3000のJPEG画像をモノクロ化する convert.exe -monochrome sample.JPG nul


表9 ベンチマークテストに使用したPCのスペック
構成要素 スペック
CPU Core 2 Duo E6550(2.33GHz)
OS Windows Vista Business SP1
メモリ 2GB
HDD(OS) Seagate Barracuda 7200.10(250GB)

 以上の3つの処理を、8種類のバイナリに対して3回ずつ行い、その実行時間の平均を取ったものを今回のベンチマーク結果とした。それぞれの結果をまとめたものが図8~10である。

図8 resize処理の実行時間
図8 resize処理の実行時間


図9 blur処理の実行時間
図9 blur処理の実行時間


図10 monochrome処理の実行時間
図10 monochrome処理の実行時間

 どのテストでももっとも高速だったのはインテル コンパイラーを使ってコンパイルしたものだったが、特に興味深いのはblur処理の結果であろう。blur処理の場合、自動並列化をオンにしてコンパイルしたバイナリはVisual C++でコンパイルしたバイナリよりも高速だったものの、並列化を利用しなかった場合はインテル コンパイラーでコンパイルしたバイナリのほうが遅くなる、という結果になってしまった。

 実はこのパフォーマンス低下はCPUのキャッシュミスが原因なのであるが、このようなソフトウェアのパフォーマンスなどに関わる問題はその原因がどこにあるか、またなぜ問題が発生しているのかを突き止めることが非常に難しい。このImageMagickでの問題の分析とパフォーマンス改善については『パフォーマンス解析ツール「VTune」でアプリケーションを高速化』で紹介しているので、詳細はこちらの記事を参照していただsきたい。

さまざまなソフトウェアで高速化の恩恵が期待できる

 インテル コンパイラーは科学技術計算や統計処理などの分野での採用例が多いため、一般的なアプリケーションでの効果を疑問視する方もいるのでは無いだろうか。しかし、今回試したbzip2やImageMagickなど、一般的なアプリケーションであってもインテル コンパイラーの効果を確認することができた。また、コンパイルの際は大規模なソフトウェアでは多少の修正が必要だったり、設定にコツがあったりするものの、おおむねGCCやVisual C++との互換性は高い。

 特にI/OよりもCPUのボトルネックがパフォーマンスに効いてくる暗号化や圧縮/展開、画像/動画/音声処理などについては、十分にインテル コンパイラーを利用するメリットがあるのではないだろうか。