Parallel Studioを活用したソフトウェアの並列化:AACエンコーダを高速化する 3ページ

インテル Parallel Amplifierによる「ホットスポット」の特定

 処理の並列化を行うには、まずどの部分の処理を並列化するかを検討しなければならない。処理の並列化を行うためにはコードの修正という手間が必要なだけでなく、並列化によるオーバーヘッドのため逆に処理が遅くなる可能性もある。そのため、プログラム中で時間のかかる処理を特定し、その部分を並列実行するようにするのが定石だ。このような処理に時間のかかる個所は「ホットスポット」などと呼ばれ、「プロファイラ」と呼ばれるツールを利用することで特定できる。Parallel Studioには「インテル Parallel Amplifier」(以下、Parallel Amplifier)というプロファイラが含まれており、今回はこれを利用してプログラム中のホットスポットを見つけることにする。

 Parallel Amplifierを利用するには、Visual StudioのParallel Amplifierツールバーで計測する対象を指定し、ボタンをクリックするだけである(図5)。

図5 Parallel Amplifierツールバー
図5 Parallel Amplifierツールバー

 今回は計測対象として「Hotspots」を指定してParallel Amplifierを実行した。なお、Parallel Amplifierを使用する際にはコンパイル時にデバッグ情報を生成しておくように指定しておく。デバッグ情報を生成するには、プロジェクトのプロパティ中「C/C++」-「全般」の「デバッグ情報の形式」で「プログラム データベース(/Zi)」もしくは「エディット コンティニュ用プログラム データベース(/ZI)」を選択したうえで、「リンカ」-「デバッグ」の「デバッグ情報の生成」で「はい(/DEBUG)」を選択する(図6、7)。デバッグ情報がなくてもParallel Amplifierの実行自体は可能だが、その場合実行結果とソースコードが紐付けられないため、有用な情報が得られなくなってしまう。

図6 Parallel Amplifierを利用する際には、C/C++の全般設定でデバック情報の形式で「/Zi」もしくは「/ZI」を指定しておく
図6 Parallel Amplifierを利用する際には、C/C++の全般設定でデバック情報の形式で「/Zi」もしくは「/ZI」を指定しておく
図7 リンカの設定では「デバッグ」項目の「デバッグ情報の生成」を「はい(/DEBUG)」にする
図7 リンカの設定では「デバッグ」項目の「デバッグ情報の生成」を「はい(/DEBUG)」にする

 faacに対してParallel Amplifierを実行した結果は、図8のようになった。ここから、変換元ファイルからデータを読み出す「wav_read_float32()」関数やFFTを行う「rfft()」関数、AAC量子化関数「AACQuantize()」およびその中で呼ばれる「FixNoise()」関数などがfaacのホットスポットであることが分かる。

図8 Parallel Amplifierの実行結果
図8 Parallel Amplifierの実行結果

 また、Parallel Amplifierの実行結果ではそれぞれの関数がどのように呼び出されているかも確認できる(図9)。これによると今回ホットスポットとなっている関数はすべて「faacEncEncode()」関数、もしくはその関数内で使用している関数から呼び出されており、これらの関数に注目して並列化を行えばよい、ということが分かる。

図9 Parallel Amplifierによる関数の呼び出し履歴
図9 Parallel Amplifierによる関数の呼び出し履歴