高レベルな最適化の概要

高レベルな最適化 (HLO) とは、C++ のような高水準プログラミング言語で開発されたアプリケーションに含まれているソースコード上の特性 (ループや配列など) を利用した最適化手法です。高レベルな最適化には、ループ交換、ループ融合、ループのアンロール、ループ分配、アンロール・アンド・ジャム、ブロッキング、データ・プリフェッチ、スカラー置換、およびデータレイアウトの最適化があります。

-O2 オプション (Linux*) または /O2 オプション (Windows*) でもいくつかの高レベルの最適化 (データ・プリフェッチやアンロールなど) が行われますが、-O3 オプション (Linux) または /O3 オプション (Windows) でメモリアクセスを最適化するループ変換を実行すると、最高レベルの最適化が行われます。これらのオプションによって有効になる最適化の範囲は、IA-32、Itanium(R)、およびインテル(R) EM64T ベース・システムで異なります。詳細は、「最適化オプションのまとめ」を参照してください。

IA-32 および Itanium ベース・アプリケーション

-O3 オプション (Linux)、/O3 オプション (Windows) は、-O2 オプション (Linux)、/O2 オプション (Windows) を有効にして、さらに強力な最適化 (ループ変換など) を追加します。O3 は、速度が最大になるように最適化を行いますが、パフォーマンスが向上しないプログラムもあります。

IA-32 アプリケーション

ベクトル化オプション -ax および -x (Linux)、/Qax および /Qx (Windows) と -O3 オプション (Linux)、/O3 オプション (Windows) を組み合わせて指定すると、-O2 (Linux)、/O2 (Windows) よりも詳細にデータの依存性を解析します。そのためコンパイル時間が長くなる場合があります。

Itanium ベース・アプリケーションのチューニング

-ivdep-parallel オプション (Linux) または /Qivdep-parallel オプション (Windows) は、IVDEP 宣言子の指定したループにループ運搬の依存がないことを断定します。この手法は、スパース・マトリックス・アプリケーションに役立ちます。

Itanium ベース・システムでアプリケーションをチューニングするには、以下の手順に従います。

  1. -O3 (Linux)、/O3 (Windows) と -ipo (Linux)、/Qipo (Windows) を使用してプログラムをコンパイルします。可能な限り、プロファイルに基づく最適化 (PGO) を使用します。(「プロファイルに基づく最適化の理解」を参照)

  2. コード内の hotspot を識別します。(「インテルが提供するパフォーマンス解析ツールの使用」を参照)

  3. 高レベルな最適化レポート生成します。 

  4. ループがソフトウェア・パイプライン化されていない理由を確認します。

  5. 前の手順の結果で示された変更を行います。

  6. 納得できる最適化レベルに達するまで、これらの手順を繰返します。

アプリケーションのチューニング

一般に、次の手法を使用してアプリケーションをチューニングすることができます。