自動最適化

このトピックでは、最も一般的なコードの最適化オプションをリストし、IA-32 アーキテクチャー、インテル(R) 64 アーキテクチャー、IA-64 アーキテクチャーで共通の特性および各アーキテクチャーの一般的な動作について説明します。

アーキテクチャーの違いと、これらのオプションにより有効または無効になるコンパイラー・オプションもリストします。それぞれのオプションの説明には、関連トピックへのリンクも含まれています。

Linux* および Mac OS* X

Windows*

説明

-O1

/O1

好ましい (より小さな) コードサイズとコードの局所性に最適化します。ほとんどの場合は、このオプションよりも -O2 (Linux および Mac OS X) または /O2 (Windows) を推奨します。

この最適化は、通常コードサイズを増加させる可能性があるいくつかの最適化を無効にします。この最適化レベルは、分岐が多く、実行時間がループ内のコードに支配されない、非常に大きなコードサイズのアプリケーションのパフォーマンスを向上させます。一般に、この最適化レベルは次のことを行います。

  • グローバルな最適化を有効にします。

  • 組み込み関数の認識と組み込み関数のインライン展開を無効にします。

IA-64 アーキテクチャー:

  • このオプションは、ソフトウェアのパイプライン化、ループのアンロール、およびグローバル・コード・スケジューリングを無効にします。

このオプションによって設定されるオプション、またはアーキテクチャー別およびオペレーティング・システム別の動作に関する詳細は、次のトピックを参照してください。

  • -O1 コンパイラー・オプション

-O2 または -O

/O2

速度について最適化します。デフォルトの最適化レベルです。最適化レベルを指定しなかった場合、コンパイラーはこの最適化レベルを自動的に使用します。一般的に推奨される最適化レベルです。しかし、他のコンパイラー・オプションを指定して、このレベルで通常行われる最適化と同じ最適化を行うこともできます。

一般に、コードサイズは -O1 (Linux および Mac OS X) や /O1 (Windows) を使用して生成されたコードサイズよりも大きくなります。

このオプションは、パフォーマンスの向上のために関数のインライン展開と次の機能を有効にします。定数伝播、コピー伝播、不要コードの排除、グローバルレジスター割り当て、グローバル命令スケジューリング、スペキュレーション・コントロール、ループのアンロール、コード選択の最適化、部分冗長の排除、ストレングス・レダクション/誘導変数の簡略化、変数名の変更、例外処理の最適化、末端再帰、ピープホールの最適化、構造体代入の最適化、および不要ストアの排除。

IA-64 アーキテクチャー:

  • 速度の最適化を有効にします。グローバル・コード・スケジューリング、ソフトウェアのパイプライン化、プレディケーション、スペキュレーション、およびデータ・プリフェッチが含まれます。

このオプションによって設定されるオプション、またはアーキテクチャー別およびオペレーティング・システム別の動作の詳細は、次のトピックを参照してください。

  • -O2 コンパイラー・オプション

-O3

/O3

-O2 (Linux および Mac OS X) または /O2 (Windows) の最適化に加えて、プリフェッチ、スカラー置換、キャッシュ・ブロッキング、ループ変換、およびメモリーアクセス変換などのより強力な最適化を有効にします。

最大の実行速度が得られる可能性のある最適化を行いますが、ループ変換およびメモリーアクセス変換が行われない限り、パフォーマンスが向上しない場合があります。このオプションによる最適化は、コードによっては -O2 (Linux) または /O2 (Windows) の最適化よりも遅くなります。

このオプションは、浮動小数点演算を多く使用するループや大きなデータセットを処理するループを含むアプリケーションに推奨します。

他のコード最適化オプションと同じように、このオプションの動作はアーキテクチャーおよびオペレーティング・システムによって異なります。

IA-32 アーキテクチャー:

  • -ax または -x (Linux)、/Qax または /Qx (Windows) と組み合わせて使用すると、-O2 (Linux)、/O2 (Windows) よりも詳細にデータの依存性を解析します。その結果、コンパイル時間が長くなることがあります。

  • Mac OS X システムでは、有効な値は -xP および -axP のみです。

IA-64 アーキテクチャー:

  • 技術計算を行うアプリケーション (ループを多用するコード) の最適化、つまりループとデータ・プリフェッチの最適化を有効にします。

詳細は、次のトピックを参照してください。

  • -O3 コンパイラー・オプション

相当するオプションなし

/Ox

コンパイラー・オプションを組み合わせて最大限の最適化を有効にし、インライン展開する関数を決定する、グローバル最適化を有効にする、最適化で EBP を汎用レジスターとして使用する、速度の最適化をすべて有効にする、組み込み関数のインライン展開を有効にする、といったことを行います。このオプションは、すべてのアーキテクチャーでサポートされています。

Mac OS X: このオプションはサポートされていません。

-fast

/fast

ランタイム・パフォーマンスを向上させる最適化機能一式をすべて有効にする、単純で単一の最適化を提供します。

この最適化は、多くのプログラムでパフォーマンスの向上が得られる一般的なオプションです。

IA-32 アーキテクチャーおよびインテル 64 アーキテクチャーでは、このオプションによって設定される -xP オプション (Linux および Mac OS X) または /QxP オプション (Windows) は、他のコマンドライン・オプションで上書きされません。このオプションと -xN (Linux) または /QxN (Windows) などの異なるプロセッサー固有のオプションを指定した場合、コンパイラーは -xP オプションまたは /QxP オプションを上書きすることができないという警告を出力します。この制限に対処するには、設定したいオプションをコマンドラインから明示的に指定してください。

警告

-xP オプション (Linux および Mac OS X) または /QxP オプション (Windows) を使用してコンパイルされたプログラムは、互換性のないプロセッサーを検出し、実行時にエラーメッセージを出力します。

このオプションは他のオプションを有効にしますが、このオプションによって有効にされるオプションが、コンパイラーの次のリリースで変更されることもあります。メイクファイルを使用する場合、この動作の変更に注意するようにしてください。

制約事項と使用に関する詳細は、次のトピックを参照してください。

  • -fast コンパイラー・オプション

次の構文例では、デフォルトのオプションを使用してアプリケーションをコンパイルする方法を示します。

プラットフォーム

Linux および Mac OS X

icpc -O2 prog.cpp

Windows

icl /O2 prog.cpp

クイック・リファレンス・トピックの一覧は、「クイック・リファレンス・リスト」を参照してください。