高レベルな最適化 (HLO) とは、C++ のような高水準プログラミング言語で開発されたアプリケーションに含まれているソースコード上の特性 (ループや配列など) を利用した最適化手法です。高レベルな最適化には、ループ交換、ループ融合、ループのアンロール、ループ分配、アンロール・アンド・ジャム、ブロッキング、データ・プリフェッチ、スカラー置換、およびデータレイアウトの最適化があります。
-O2 オプション (Linux*) または /O2 オプション (Windows*) でもいくつかの高レベルの最適化 (データ・プリフェッチやアンロールなど) が行われますが、-O3 オプション (Linux) または /O3 オプション (Windows) でメモリアクセスを最適化するループ変換を実行すると、最高レベルの最適化が行われます。これらのオプションによって有効になる最適化の範囲は、IA-32、Itanium(R)、およびインテル(R) EM64T ベース・システムで異なります。詳細は、「最適化オプションのまとめ」を参照してください。
-O3 オプション (Linux)、/O3 オプション (Windows) は、-O2 オプション (Linux)、/O2 オプション (Windows) を有効にして、さらに強力な最適化 (ループ変換など) を追加します。O3 は、速度が最大になるように最適化を行いますが、パフォーマンスが向上しないプログラムもあります。
ベクトル化オプション -ax および -x (Linux)、/Qax および /Qx (Windows) と -O3 オプション (Linux)、/O3 オプション (Windows) を組み合わせて指定すると、-O2 (Linux)、/O2 (Windows) よりも詳細にデータの依存性を解析します。そのためコンパイル時間が長くなる場合があります。
-ivdep-parallel オプション (Linux) または /Qivdep-parallel オプション (Windows) は、IVDEP 宣言子の指定したループにループ運搬の依存がないことを断定します。この手法は、スパース・マトリックス・アプリケーションに役立ちます。
Itanium ベース・システムでアプリケーションをチューニングするには、以下の手順に従います。
-O3 (Linux)、/O3 (Windows) と -ipo (Linux)、/Qipo (Windows) を使用してプログラムをコンパイルします。可能な限り、プロファイルに基づく最適化 (PGO) を使用します。(「プロファイルに基づく最適化の理解」を参照)
コード内の hotspot を識別します。(「インテルが提供するパフォーマンス解析ツールの使用」を参照)
高レベルな最適化レポートを生成します。
ループがソフトウェア・パイプライン化されていない理由を確認します。
前の手順の結果で示された変更を行います。
納得できる最適化レベルに達するまで、これらの手順を繰返します。
一般に、次の手法を使用してアプリケーションをチューニングすることができます。
#pragma ivdep を使用して、依存性がないことを示します。コンパイルする際にループ運搬の依存がないことを示す -ivdep-parallel オプション (Linux) または /Qivdep-parallel オプション (Windows) が必要な場合があります。
#pragma swp を使用して、ソフトウェアのパイプライン化を有効にします (不適当なコントロールや不明なループカウントに役立ちます)。
必要に応じて、#pragma loop count(n) を使用します。
-ansi-alias (Linux) または /Qansi-alias (Windows) は便利なオプションです。
restrict キーワードを追加して、エイリアシングを回避します。-restrict (Linux) または /Qrestrict (Windows) を使用してコンパイルします。
-alias-args (Linux) または /Qalias-args- (Windows) を使用して、引数がエイリアス化されないことを示します。
#pragma distribute point を使用して、大きなループを分割します (通常、これは自動的に行われます)。
C コードの場合、ループのインデックスに unsigned int を使用しないでください。HLO は、添字オーバーフローが原因で、最適化をスキップする場合があります。上限がポインター参照の場合、可能な限りローカル変数に割り当ててください。
プリフェッチが正しく設定されていることを確認します。#pragma prefetch を使用して、必要に応じて設定を上書きします。