概要 : Microsoft Visual C++* .NET プロジェクトにおけ る PGO の使用
このセクションでは、インテル® C++ コンパイラを Microsoft Visual C++* .NET* プロジェクトで使用 する場合の PGO (プロファイルに基づく最適化) の使用方法を説明します。以下の項目を説明しま す:
• PGO 構成プロパティ
• PGO ビルド構成の作成
• PGO ビルド設定の構成
• PGO ビルドの実行
VS .NET における PGO 構成プロパティ
次のステップに従って、プロジェクトのアクティブな構成の PGO プロパティ、またはプロジェクト内の ソースファイルにアクセスします:
1. インテル® C++ プロジェクトを開きます。
2. [ソリューション エクスプローラ] で、プロジェクト名またはプロジェクトのソースファイルを選択し ます。
3. [プロジェクト] メニューから [プロパティ] を選択して、[プロパティ ページ] ダイアログを開きます。
4. 左のペインで、[Intel(R) Specific] プロパティを選択します。
5. PGO のプロパティが右のペインの [Profile-Guided Optimization (PGO)] カテゴリに表示されま
す。
5. プロファイルに基づく最適化の使用
[PGO Phase] プロパティで、インストルメンテーション・コンパイルを実行するようにプロジェクト構成 を設定することができます:
• Phase 1: Instrumentation Build (/Qprof_gen)
• Phase 2: Enhanced Instrumentation Build (/Qprof_genx)
• Phase 3: Feedback Build (/Qprof_use)
特定のプロジェクト構成で PGO を使用しない場合は、[PGO Phase] を [Disable] に設定します。
[Profile Directory] プロパティで、プロファイル情報ファイルの場所を指定します。このファイルは、
インストルメント済み実行ファイルと、プロファイル・インストルメントおよびプロファイル・フィードバッ ク時のコンパイラによって生成されます。
PGO を使用してプロジェクトをビルドするには、通常、インストルメンテーション・ビルドとフィード バック・ビルドを実行する追加のプロジェクト構成を作成する必要があります。インストルメンテーショ ン・ビルドを実行する構成は、インストルメント済みの実行ファイル (PGO のフェーズ 2) も実行でき ます。PGO 構成プロパティの使用方法は、「PGO ビルド設定の構成」で説明します。
注: プロジェクト・レベルでは、[PGO Phase] の値のみ設定してください。ソース
ファイルの構成プロパティで、[PGO Phase] の値を設定する場合、プロジェクト構 成内のすべてのファイルに同じ値を使用するか、または [Disable] にする必要があ ります。
例えば、プロジェクトのインストルメンテーションの構成では、utility.cpp で定義されたユー ティリティ・モジュールを除くプロジェクトの全ファイルをインストルメントします。インストルメンテー ション構成のプロジェクトの [構成プロパティ] で、[PGO Phase] の値を "Phase 1: Instrumentation Build (/Qprof_gen)" に設定します。そして、utility.cpp の [構成プロパティ] で、[PGO Phase] の値を [Disable] に設定できます。
VS .NET における PGO ビルド構成の作成
ここでは、アプリケーションの PGO ビルドを実行するインテル® C++ コンパイラの使用例を示します。
この例は、インテル C++ プロジェクトを含むソリューションを作成したか、開いたことがあることを前 提にしています。
はじめに、PGO ビルドの新しいソリューション構成とプロジェクト構成を作成してから、下記のス テップに従ってください:
インストルメンテーション構成を作成する
1. [ビルド] > [構成マネージャ] メニュー項目を選択します。
2. [アクティブ ソリューション構成] ドロップダウン・リストから [<新規作成...>] を選択します。
3. [新しいソリューション構成] ダイアログで、[設定のコピー元] ドロップダウン・リストから [Release]
を選択します。
4. [ソリューション構成名] テキストボックスに、PGINSTRUMENT のように名前を入力します。
5. [新しいプロジェクト構成も作成する] チェックボックスがチェックされていることを確認してくださ い。
6. [OK] をクリックします。
フィードバック構成を作成する
1. [構成マネージャ] ダイアログが開いているはずです。開いていない場合は、[ビルド] > [構成マ ネージャ] メニュー項目を選択して開きます。
2. [アクティブ ソリューション構成] ドロップダウン・リストから [<新規作成...>] を選択します。[新し いソリューション構成] ダイアログで、[設定のコピー元] ドロップダウン・リストから [Release] を選 択します。
3. [ソリューション構成名] テキストボックスに、PGOPTIMIZE のように名前を入力します。
4. [新しいプロジェクト構成も作成する] チェックボックスがチェックされていることを確認してくださ い。
5. [OK] をクリックします。
VS .NET における PGO ビルド設定の構成
下記のステップに従って、PGINSTRUMENT 構成と PGOPTIMIZE 構成の設定を行ってください:
1. [ソリューション エクスプローラ] でプロジェクト名をクリックします。
2. [プロジェクト] > [プロパティ] メニュー項目を選択します。
3. [構成] ドロップダウン・リストから [PGINSTRUMENT] を選択します。
4. [構成プロパティ] で、[Intel(R) Specific] プロパティ・ページを選択して、次のプロパティ値を設 定します:
5. プロファイルに基づく最適化の使用
プロパティ 値
PGO Phase Phase 1: Instrumentation Build (/Qprof_gen)
Profile Directory PGINSTRUMENT
5. [構成プロパティ] で、[ビルド イベント] > [ビルド前のイベント] プロパティ・ページを選択して、
次のプロパティ値を設定します:
プロパティ 値
コマンド ライン $(TargetPath)
説明 PGO フェーズ 2 の実行 : インストルメント済み実行ファイル ビルドから除外 いいえ
注: [コマンド ライン] のプロパティ値には、入力データと共にインストルメント済み のアプリケーションを起動するバッチファイルまたは他のコマンドを設定できます。
• [コマンド ライン] のプロパティ値にスペースが含まれる場合、その値を二
重引用符で囲んでください。例えば、$(TargetPath) の値にスペース が含まれる場合、"$(TargetPath)" と二重引用符で囲んでください。
6. [構成] ドロップダウン・リストから [PGOPTIMIZE] を選択します。
7. [構成プロパティ] で、[Intel(R) Specific] プロパティ・ページを選択して、次のプロパティ値を設 定します:
プロパティ 値
PGO Phase Phase 3: Feedback Build (/Qprof_use)
Profile Directory PGINSTRUMENT
注: PGOPTIMIZE 構成の [Profile Directory] プロパティ値は、PGINSTRUMENT 構成の [Profile Directory] プロパティ値と同じ値にする必要があります。
PGINSTRUMENT ビルドで生成されたプロファイル・ファイルは、PGOPTIMIZE ビ ルドに使用されます。
VS .NET における PGO ビルドの実行
通常、アプリケーションの PGO ビルドは、リリースビルドとして、開発時期に行われます。PGO ビル ド実行の主なステップは、次のとおりです:
• PGINSTRUMENT 構成のビルド
• PGOPTIMIZE 構成のビルド PGINSTRUMENT 構成のビルド
PGINSTRUMENT 構成をビルドするには、これらのステップに従ってください:
1. [ビルド] > [構成マネージャ] メニュー項目を選択します。
2. [アクティブ ソリューション構成] ドロップダウン・リストから [PGINSTRUMENT] を選択します。
3. [閉じる] をクリックします。
4. [ビルド] > [ビルド] メニュー項目を選択します。
PGINSTRUMENT 構成は、インストルメント済み実行ファイルをビルドします。[ビルド前のイベント]
> [コマンド ライン] を起動して、プロファイル情報を収集するインストルメント済み実行ファイルを実 行します。インストルメント済み実行ファイルは、インストルメンテーション・コードのオーバヘッドのた めに、通常の実行ファイルよりも時間がかかります。インストルメント済み実行ファイルが完了すると、
1 つまたは複数の動的プロファイル情報ファイル (.dyn) が、Profile ディレクトリに生成されます。
注: 古いプロファイル情報が新しい情報と一緒に使用されないようにするため、
PGINSTRUMENT 構成をビルドする前に Profile ディレクトリから動的プロファイ ル情報ファイル (.dyn) を削除します。[ビルド前のイベント] > [コマンド ライン] の ステップで削除を行います。[ビルド] > [消去] または [ビルド] > [すべてリビルド]
を選択すると、古い .dyn ファイルも削除されます。
PGOPTIMIZE 構成のビルド
PGOPTIMIZE 構成をビルドするには、これらのステップに従ってください:
1. [ビルド] > [構成マネージャ] メニュー項目を選択します。
2. [アクティブ ソリューション構成] ドロップダウン・リストから [PGOPTIMIZE] を選択します。
3. [閉じる] をクリックします。
4. [ビルド] > [ビルド] メニュー項目を選択します。
PGINSTRUMENT ビルドで生成されたプロファイル情報 (.dyn ファイル) を使用して、
PGOPTIMIZE 構成は、プロファイルによって最適化された実行ファイルをビルドします。1 つまた は複数の動的プロファイル情報ファイル (.dyn) からのプロファイル情報が結合され、Profile ディ レクトリにプロファイル情報サマリファイル (pgopti.dpi) が生成されます。そして、このファイルを コンパイラが使用し、プロファイルに基づく最適化が実行されます。
6. Microsoft* 互換性オプション
6. Microsoft* 互換性オプション
概要 : Microsoft との互換性
インテル® C++ コンパイラは、Microsoft Visual C++* で C/C++ 言語に追加された拡張機能に対応
しています。Microsoft Visual C++ の拡張機能のいくつかは、インテル C++ コンパイラでの解釈が 異なります。ここではその違いを説明します。次のような点が異なります:
• コンパイラのプラグマ
• Microsoft 互換性オプション
• Microsoft バージョン互換性オプション
• Microsoft Visual C++ Processor Pack との互換性
• 未対応のコンパイラ・オプション
• PCH サポートの相違点
• プリコンパイル済みヘッダファイルの共存
• コンパイルと実行に関する相違点
• 名前空間に定義している関数の有効範囲内での宣言
• enum ビット・フィールドの符号の有無
• MSVC++ を使用したアライメント済みスタックフレームを持つ関数のデバッグ
コンパイラのプラグマ
インテル® C++ コンパイラは、Microsoft Visual C++* のプラグマをサポートしています。ただし、次
のような制約事項があります:
• optimize プラグマは、特定の最適化処理の有効化/無効化を決めるリストを読み込むた めのものです。インテル® コンパイラはこのリストを無視します。このプラグマは、コマンドラ インのオプションで指定する最適化処理のすべてについて有効化/無効化を決めます。
• 次の各プラグマはヘッダファイルの中に記述されている場合がありますが、効果は何もあり ません。ただし、エラーも出ません。
o component o function o include_alias o inline_depth
o inline_recursion o intrinsic
o setlocale
プラグマの詳細については、Microsoft Visual C++ のオンライン・ヘルプか付属のマニュアルを参 照してください。
注: インテル C++ コンパイラは、次のプラグマもサポートしています:
• #pragma auto_inline([{on|off}])
off で指定された範囲内で定義されたすべての関数を、自動的なインライン展開の候補 とみなされる関数から除外します。
• #pragma conform(name [, show] [, {on|off}] [[, {push|pop}] [, indentifier]])
ループの初期化子がローカルスコープの終了までスコープ中に残ることを可能にする /Zc:forScope コンパイラ・オプションのランタイムの動作を指定します。
Microsoft* 互換性オプション
まれにしかありませんが、同じソースコードでも Microsoft* コンパイラでコンパイルするとエラーが 出ず、インテル® コンパイラでコンパイルするとエラーが出る場合があります。この現象が、サード パーティ提供のインクルード・ファイルや C++ クラス・ライブラリ・ファイルなどに含まれるファイルの 中で発生すると、当該ソースファイル内でエラーを修正するのは難しいかもしれません。その場合、
インテル・コンパイラで /Qms オプションを使用すると、正常にコンパイルできることがあります。
/Qms オプションのデフォルト設定は /Qms1 です。また、/Qms オプションは、その他のコンパイ ラ・オプションのデフォルトを変更しません。
/Qms0
/Qms0 オプションでコンパイルを行うと、最小数の Microsoft のバグがエミュレートされます。その 結果、ANSI C++ 標準により準拠したコンパイルを行うことができます。このオプションを使用した場 合、インテル・コンパイラはリンクの互換性に影響するバグや、Microsoft システム・ヘッダ・ファイル を効果的に使用するために必要なバグには対処しません。
/Qms1
/Qms1 では、/Qms0 より多くの Microsoft のバグをエミュレートします。/Qms0 オプションではエ ミュレートされず、/Qms1 オプションでエミュレートされる主なバグは次のとおりです:
• Microsoft コンパイラは、元の式が左辺値ではない限り、直接参照バインディングにおける
変換関数の使用を許可しません。
• 推定された定数ではない参照は、Microsoft バグモード内の右辺値にバインドできます。
• 2 つの extern C 関数に同じ名前が使用されている場合、不正な多重定義が発生しま
す。Microsoft コンパイラは、これらの関数の宣言が異なる名前空間で定義されている場合 に、この条件を許可します。
/Qms2
/Qms1 オプションではエミュレートされず、/Qms2 オプションでエミュレートされる主なバグは次の とおりです:
• void (*f) ();
*f = /* some expression */
* 演算子が、no-op (何のメリットもない操作、例えば関数へのポインタなど) で、左辺値に 適用される場合、Microsoft コンパイラはオペランドの "左辺値の属性" を保持します。