[[PageNavi(NavigationList)]]
==== Parallel Studioによる並列化 ====
faacはWindowsやLinux、Mac OS XなどさまざまなOS上でコンパイル/実行できるが、今回はParallel Studioを使用するため、Windows環境でVisual Studio 2008を使用して開発を行った。ベースとしたfaacのバージョンは1.28である。配布されているfaacのソースコードにはVisual Studio向けのプロジェクトファイルも付属しており、これを利用することでWindows環境でも簡単にコンパイルが可能だ('''図2''')。
[[Thumb(0ec912b41e9acac30f494cd95efcd212.png, caption=図2 faacにはVisual Studio向けのプロジェクトファイルも付属する)]]
今回使用したParallel Studioは、自動並列化/最適化機能を備えたコンパイラやマルチスレッド対応デバッガ、パフォーマンス計測ツール、メモリ/スレッドに関する正当性チェッカなどから構成される開発支援ツールである。詳しくは[//sourceforge.jp/magazine/09/05/15/0938220 過去の記事]を参照してほしいが、ここでは下記の目的にParallel Studioを使用した。
自動最適化によるパフォーマンス向上処理に時間のかかっている個所(ホットスポット)の検出マルチスレッド化によって発生する、スレッド間でのデータ競合などの検出メモリリークや不正なメモリの検出==== インテル コンパイラーでコンパイルするだけでもパフォーマンスが向上 ====
Parallel Studioの「インテル Parallel Composer」コンポーネントには、強力な最適化機能で知られるインテル コンパイラーが含まれており、このコンパイラを利用するだけでパフォーマンスの向上が期待できる。Parallel Studioでは、Visual StudioのIDEからボタン1つで自動的にインテル コンパイラーでソフトウェアをコンパイルできるようになり、またGUIによるコンパイルオプション設定が可能だ。
ソースコードの修正を行う前にまずはインテル コンパイラーでfaacをコンパイルしたところ、これだけでも大幅なパフォーマンス向上が確認できた('''表1''')。なお、ここでは約4分のWAVE形式音声ファイル(約40MB)を、faacのデフォルト設定でエンコードした際にかかった時間でその処理速度を比較している('''表2''')。
{{{ html
<h6>表1 コンパイラによる処理時間の違い</h6>
<table class="wikitable" border="1">
<tr><th>コンパイラ</th><th>処理時間</th></tr>
<tr><td>Visual C++</td><td>10.7秒</td></tr>
<tr><td>インテル コンパイラー</td><td>8.8秒</td></tr>
</table>
}}}
{{{ html
<h6>表2 今回のテストに使用した条件</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>メモリ</td><td>2GB</td></tr>
<tr><td>OS</td><td>Windows Vista Business SP1</td></tr>
<tr><td>HDD</td><td>SEAGATE ST3250310AS(250GB)</td></tr>
<tr><td>入力ファイル</td><td>WAVE形式、約4分(40MB)</td></tr>
<tr><td>faacのコマンドラインオプション</td><td>なし(デフォルト設定)</td></tr>
</table>
}}}
なお、実行ファイルのパフォーマンスは、コンパイラの設定(コンパイルオプション)でも大きく変化する。ここでは、Visual C++およびインテル コンパイラーで最も強力と思われる最適化設定を用いてプログラムをコンパイルしている('''図3、4''')。
[[Thumb(ff60e4c3b51c4dfea438007a308227d4.png, caption=図3 Visual C++のコンパイル設定)]]
[[Thumb(26819c6951cb423a988275f07c3d6f0f.png, caption=図4 インテル コンパイラーのコンパイル設定)]]
[[PageNavi(NavigationList)]]