高レベルの最適化は、Fortran および C++ などの高級プログラミング言語で開発されるアプリケーション内のソースコード構造 (例えば、ループと配列) の特性を利用します。高レベルの最適化には、ループ交換、ループ融合、ループのアンロール、ループ分配、アンロール・アンド・ジャム、ブロッキング、データ・プリフェッチ、スカラ置換、データ・レイアウトの最適化およびループのアンロール手法があります。
高レベルの最適化をオンにするには、-O3 オプションを指定します。-O3 によりオンになる最適化の範囲は IA-32 および Itanium® ベースのアプリケーションで異なります。「最適化レベルの設定」を参照してください。
-O3 オプションは、 -O2 オプションを有効にし、またさらに強力な最適化 (例えば、ループ変換やプリフェッチ) を追加します。-O3 は、最大速度について最適化を行いますが、パフォーマンスが向上しないプログラムもあります。
ベクトル化オプション -ax{K|W|N|B|P} および -x{K|W|N|B|P} と -O3 を組み合わせて指定すると、-O2 よりも詳細にデータの依存性を分析します。このため、コンパイル時間が長くなる可能性があります。
-ivdep_parallel オプションは、IVDEP ディレクティブの指定したループにループキャリー依存がないことを断定します。この手法は、スパース・マトリックス・アプリケーションに役立ちます。
Itanium ベース・システムでアプリケーションをチューニングするには、以下の手順に従います。
-O3 と -ipo を使用してプログラムをコンパイルします。 可能な限り、プロファイルに基づく最適化 (PGO) を使用します。
コード内の Hotspot を識別します。
最適化レポートを有効にします。
ループに対するソフトウェアのパイプライン化が行われていない理由を確認します。
CDEC$ ivdep を使用して、依存がないことをコンパイラに通知します。 ループキャリー依存がないことを示す -ivdep_parallel オプションが必要な場合があります。
CDEC$ swp を使用して、ソフトウェアのパイプライン化を有効にします (不適当なコントロールや不明なループカウントに役立ちます)。
必要に応じて、CDEC$ loop count(n) を使用します。
クレイポインタが使用されている場合、safe_cray_ptr を使用してエイリアシングがないことを示します。
CDEC$ distribute point を使用して、大きなループを分割します (通常、これは自動的に行われます)。
プリフェッチが正しく設定されていることを確認します。CDEC$ prefetch を使用して、必要に応じて設定を上書きします。