[[PageNavi(NavigationList)]]
==== Windows環境でのコンパイル――!ImageMagick ====
続いて、Windows環境でコンパイルできるオープンソースソフトウェアの例として、画像のバッチ処理ツール「!!ImageMagick」をコンパイルしてみよう。[http://www.imagemagick.org/script/index.php !ImageMagick]は画像のリサイズやフォーマット変換、結合など、さまざまな処理をバッチ処理できるコマンドラインツールだ。
Windows環境での!!ImageMagickのコンパイルは[http://www.imagemagick.org/script/install-source.php#windows Install from Source]ページで解説されているが、まず設定ツールをビルドして実行することでVisual Studio用のプロジェクトファイルが作成され、次にそのプロジェクトファイルをVisual Studioで開いてビルドする、という手順となる。Windows向けの設定ツールは[ftp://ftp.imagemagick.org/pub/!ImageMagick/windows/!ImageMagick-windows.zip Windows向けソースパッケージ]にのみ含まれているので、こちらをダウンロードしよう。
ZIPアーカイブを展開すると、「!!VisualMagick\configure」ディレクトリ以下に「configure.vcproj」というプロジェクトファイルが含まれているので、これをVisual Studioで開き、まずデフォルト設定のままでコンパイルを行う。すると、同じディレクトリ内に「configure.exe」という実行ファイルができるので、続けてこれを実行する。
このconfigure.exeは、Windows環境向けのコンパイル設定ツールで、ウィザードに従って出力ディレクトリや共有ライブラリ/静的ライブラリのどちらを使うかなどを指定することで、Visual Studio用のプロジェクトファイルを生成できる('''図6''')。これで作成されたプロジェクトファイルをVisual Studioで開き、コンパイルオプションなどを設定後、プロジェクトのビルドを実行すると!!ImageMagickがビルドされる。
[[Thumb(bf7d9453d62f2dbc7250f339c4ff52e9.png, caption=図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'''のように設定した。
{{{ html
<h6>表6 使用したコンパイルオプション</h6>
<table class="wikitable" border="1">
<tr><th>設定名</th><th>コンパイラ</th><th>コンパイルオプション</th></tr>
<tr><td>ICC:O2</td><td>ICC</td><td>/O2</td></tr>
<tr><td>ICC:O2/ip</td><td>ICC</td><td>/O2 /Qip</td></tr>
<tr><td>ICC:O2/ipo</td><td>ICC</td><td>/O2 /Qipo</td></tr>
<tr><td>ICC:O3</td><td>ICC</td><td>/O3</td></tr>
<tr><td>ICC:O3/ip</td><td>ICC</td><td>/O3 /Qip</td></tr>
<tr><td>ICC:O3/ipo</td><td>ICC</td><td>/O3 /Qipo</td></tr>
<tr><td>ICC:O3/parallel</td><td>ICC</td><td>/O3 /Qparallel /Qpar-threshold:90</td></tr>
<tr><td>ICC:O3/SSSE3</td><td>ICC</td><td>/O3 /QxSSSE3</td></tr>
<tr><td>VC++</td><td>VC++</td><td>/O2</td></tr>
</table>
}}}
{{{ html
<h6>表7 そのほかのコンパイルオプション設定(抜粋)</h6>
<table class="wikitable" border="1">
<tr><th>設定項目</th><th>設定値</th></tr>
<tr><td>グローバルな最適化</td><td>はい(/Og)</td></tr>
<tr><td>Windowsアプリケーションの最適化</td><td>はい(/GA)</td></tr>
<tr><td>インライン関数の展開</td><td>拡張可能な関数すべて(/Ob2)</td></tr>
<tr><td>組み込み関数を使用する</td><td>はい(/Oi)</td></tr>
<tr><td>フレームポインターなし</td><td>はい(/Oy)</td></tr>
</table>
}}}
[[Thumb(f622e4d56c3e26873579a8f0955c1c5f.png, caption=図7 コンパイルオプション設定画面)]]
====== 実行結果 ======
!!ImageMagickには画像形式の変換や加工を行う「convert」や比較を行う「compare」、合成を行う「composite」などのコマンドが含まれているが、今回のベンチマークテストではこのうちconvertコマンドを使った3つの操作を行い、それぞれの処理にかかった時間を測定した('''表8''')。なお、ファイルアクセスによるオーバーヘッドが実行時間に影響しないよう、出力ファイルには「nul」を指定して実際のファイル出力は行わないようにしている。使用したPCの環境は'''表9'''のとおりだ。
{{{ html
<h6>表8 ベンチマークの詳細</h6>
<table class="wikitable" border="1">
<tr><th>処理名</th><th>処理の内容</th><th>実行するコマンドライン</th></tr>
<tr><td>resize</td><td>4000×3000のJPEG画像を8000×6000に拡大</td><td>convert.exe -resize 8000x6000 sample.JPG nul</td></tr>
<tr><td>blur</td><td>4000×3000のJPEG画像に半径100のぼかしフィルタを適用する</td><td>convert.exe -blur 100 sample.JPG nul</td></tr>
<tr><td>monochrome</td><td>4000×3000のJPEG画像をモノクロ化する</td><td>convert.exe -monochrome sample.JPG nul</td></tr>
</table>
}}}
{{{ html
<h6>表9 ベンチマークテストに使用した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>Windows Vista Business SP1</td></tr>
<tr><td>メモリ</td><td>2GB</td></tr>
<tr><td>HDD(OS)</td><td>Seagate Barracuda 7200.10(250GB)</td></tr>
</table>
}}}
以上の3つの処理を、8種類のバイナリに対して3回ずつ行い、その実行時間の平均を取ったものを今回のベンチマーク結果とした。それぞれの結果をまとめたものが'''図8~10'''である。
[[Thumb(55ff25aaef2b5c95e2392e5518c36221.png, caption=図8 resize処理の実行時間)]]
[[Thumb(1be255d8191fc9b4bf7943bf1c0b747d.png, caption=図9 blur処理の実行時間)]]
[[Thumb(e2b23177e0d70abbec3fb86e826fc0fc.png, caption=図10 monochrome処理の実行時間)]]
どのテストでももっとも高速だったのはインテル コンパイラーを使ってコンパイルしたものだったが、特に興味深いのはblur処理の結果であろう。blur処理の場合、自動並列化をオンにしてコンパイルしたバイナリはVisual C++でコンパイルしたバイナリよりも高速だったものの、並列化を利用しなかった場合はインテル コンパイラーでコンパイルしたバイナリのほうが遅くなる、という結果になってしまった。
実はこのパフォーマンス低下はCPUのキャッシュミスが原因なのであるが、このようなソフトウェアのパフォーマンスなどに関わる問題はその原因がどこにあるか、またなぜ問題が発生しているのかを突き止めることが非常に難しい。この!!ImageMagickでの問題の分析とパフォーマンス改善については『[パフォーマンス解析ツール「VTune」でアプリケーションを高速化_p1 パフォーマンス解析ツール「VTune」でアプリケーションを高速化]』で紹介しているので、詳細はこちらの記事を参照していただsきたい。
==== さまざまなソフトウェアで高速化の恩恵が期待できる ====
インテル コンパイラーは科学技術計算や統計処理などの分野での採用例が多いため、一般的なアプリケーションでの効果を疑問視する方もいるのでは無いだろうか。しかし、今回試したbzip2や!!ImageMagickなど、一般的なアプリケーションであってもインテル コンパイラーの効果を確認することができた。また、コンパイルの際は大規模なソフトウェアでは多少の修正が必要だったり、設定にコツがあったりするものの、おおむねGCCやVisual C++との互換性は高い。
特にI/OよりもCPUのボトルネックがパフォーマンスに効いてくる暗号化や圧縮/展開、画像/動画/音声処理などについては、十分にインテル コンパイラーを利用するメリットがあるのではないだろうか。
[[PageNavi(NavigationList)]]