この記事は、インテル® デベロッパー・ゾーンに公開されている「Vectorization Toolkit」(https://software.intel.com/en-us/articles/vectorization-toolkit/) の日本語参考訳です。
ここでは、アプリケーションをベクトル化してパフォーマンスを高める 6 つのステップを示します。
ホワイトペーパー | ツールの評価版 | フォーラム (英語) |
アプリケーションをベクトル化する 6 つのステップ
ステップ 1: 基準となるリリースビルドのパフォーマンスを測定する
次の理由から、(デバッグビルドではなく) リリースビルドで作業することが重要です。
- コンパイラーによりコードが最適化され、hotspot のループが変わる可能性があります。
- ベクトル化によりパフォーマンスが向上したかどうか判断するため、アプリケーションのベースラインを把握しておく必要があります。
(リリースビルドが十分に高速化されたら) 作業を完了できるように、パフォーマンスの目標を設定すべきです。
インテル® コンパイラーでは、リリースビルドがデフォルト設定です。Windows* の場合はデバッグビルド (または -Zi オプション)、Linux*/macOS* X の場合は -O0 オプション (または -g オプション) を使用して、最適化を無効にする必要があります。
ステップ 2: インテル® VTune™ プロファイラーを使用して hotspot を特定する
パフォーマンス・プロファイラーであるインテル® VTune™ プロファイラーを使用して、アプリケーションで最も時間を費やしている関数を特定します。これには、hotspot 解析タイプを推奨します。最も時間を費やしているコード領域を特定することで、最も効果的にパフォーマンスを向上できる領域に最適化の労力を集中できます。一般に、アプリケーションの実行時間の 10% 以上を占めている hotspot を解消すれば十分です。次のステップで最適化する hotspot をメモします。
このステップの関連情報
- インテル® VTune™ プロファイラーのチュートリアル (英語) (Windows* 版/Linux* 版)
- OpenMP*、MPI、Java* を含むその他のチュートリアル (英語)
- インテル® VTune™ プロファイラー評価版
ステップ 3: インテル® コンパイラーの最適化レポートを使用してループの候補を決定する
最適化レポートのベクトル化セクションは、コード内の各ループがベクトル化されたかどうかを示します。ステップ 2 で特定した hotspot に関する最適化レポートの出力内容を確認します。hotspot 内にベクトル化されなかったループがある場合、配列などのデータの数学演算、データ処理、文字列操作を並列に実行していないか確認します。該当する処理がある場合は、ベクトル化の候補となります。ベクトル化の候補が見つかった場合は、ステップ 4 に進みます。
最適化レポートにコンパイラーによるベクトル化に関する情報を生成するには、”-qopt-report -qop-report-phase=loop,vec” (Linux*) または “/Qopt-report /Qopt-report-phase:loop,vec” (Windows*) オプションを指定してコンパイルします。
インテル® コンパイラーはコードの一部だけで使用することもでき、ネイティブ・コンパイラーである gcc (Linux* および macOS* X) および Microsoft* Visual C++* (Windows*) と互換性があります。
Begin optimization report for: test_scalar_dep(double *, int) Report from: Vector optimizations [vec] LOOP BEGIN at scalar_dep.cpp(79,1) remark #15344: loop was not vectorized: vector dependence prevents vectorization. First dependence is shown below. Use level 5 report for details remark #15346: vector dependence: assumed ANTI dependence between line 81 and line 80 LOOP END
このステップの関連情報
- 新しい最適化レポートを使用してインテル® コンパイラーをさらに活用する
- インテル® コンパイラーの最適化レポートを活用する
https://software.intel.com/sites/default/files/managed/55/b1/new-compiler-optimization-reports.pdf
https://software.intel.com/en-us/videos/getting-the-most-out-of-the-intel-compiler-with-new-optimization-reports
最適化レポートは、インテル® コンパイラー 15 で導入されて以来、継続的に強化されています。 - qopt-report、Qopt-report
C++: https://software.intel.com/en-us/cpp-compiler-developer-guide-and-reference-optimization-report-options
Fortran: https://software.intel.com/en-us/fortran-compiler-developer-guide-and-reference-optimization-report-options - インテル® コンパイラーの評価版
ステップ 4: インテル® Advisor を使用してアドバイスを得る
インテル® Advisor のベクトル化解析機能を使用して、アプリケーションの実行時の動作を解析し、ベクトル化により恩恵が得られるアプリケーションのコンポーネントを特定します。
解析を実行して結果が生成されたら、GUI で結果を確認できます。必要に応じて、テキストベースのレポートを生成することも可能です。収集に使用された解析タイプにより、結果から生成できるレポートタイプが決まります。
このステップの関連情報
- インテル® Advisor の概要、入門ガイド (英語)
- サポート (英語)
- インテル® Advisor の評価版
ステップ 5: ベクトル化の推奨事項を実装する
例えば、「スカラーベクトル依存関係」がコンパイラーによるベクトル化コードの生成を妨げているとインテル® Advisor が判断した場合、推奨された変更がセマンティクスやループ計算の安全性に影響を与えないことを確認します。依存性がないことを保証する 1 つの方法は、ループを逆に実行したときに結果が変わるかどうかをチェックすることです。ランダムな順序でループを実行したときの結果を確認するのも 1 つの方法です。結果が変わる場合、ループには依存性があり、ベクトル化は「安全」ではありません。 ただし、この場合でも、依存性を排除してからベクトル化を行うことは可能です。ソースコードを変更して、適切なベクトル化が行われるように、コンパイラーに情報を知らせるか、ループを最適化します。
このステップの関連情報
ステップ 6: 繰り返す!
パフォーマンス解析に基づいてアプリケーション・コードを変更し、新しいパフォーマンス・メトリックを確認して結果を比較します。パフォーマンスの目標を達成するまで、または目立った hotspot がなくなるまでこのサイクルを繰り返します。
コンパイラーの最適化に関する詳細は、最適化に関する注意事項を参照してください。