インテル® C++ コンパイラー 18.0 デベロッパー・ガイドおよびリファレンス

関数順序リストの使用、関数のグループ化、関数の順序設定、データの順序設定の最適化

[Q]ipo コンパイラー・オプションを使用して複数ファイルにわたるプロシージャー間の最適化を行う代わりに、コンパイラーとリンカーを利用して、関数とデータをアプリケーションに配置する場所についてグローバルな判断を行い、最適化の利点を得ることができます。これらの最適化は、macOS* システムでは利用できません。

次の表では、それぞれの最適化について、関数の型または適用するグローバルデータ、およびサポートされているオペレーティング・システムとアーキテクチャーをリストしています。

最適化:

関数またはデータの型

サポートされている OS とアーキテクチャー

関数順序リスト: リンカーがプログラムの非スタティック・ルーチン (関数) をリンクする際の順序を指定します。この最適化では、コードの局所性とページングの減少を向上させることによってアプリケーション・パフォーマンスを向上できます。「関数順序リストと IPO コードレイアウトの比較」も参照してください。

extern 関数とライブラリー関数のみ (スタティック関数ではありません)。

Windows*: すべてのインテル® アーキテクチャー

Linux*: サポートされていません

関数のグループ化: リンカーがプログラムの extern とスタティック・ルーチン (関数) をプログラムのホットセクションまたはコールドセクションのいずれに配置するかを指定します。この最適化では、コードの局所性とページングの減少を向上させることによってアプリケーション・パフォーマンスを向上できます。

関数は、".text.hot" および ".text.unlikely" リンカーセクションに配置されます。カスタム・リンカー・スクリプトを使用している場合は、これらのセクションのメモリーの配置を指定する必要があります。

extern 関数とスタティック関数のみ (ライブラリー関数ではありません)。

Linux*: IA-32 アーキテクチャーおよびインテル® 64 アーキテクチャー

Windows*: サポートされていません

関数の順序設定: プロファイル情報を使用して、スタティックおよび extern ルーチンの順序設定を有効にします。リンカーがプログラムのルーチン (関数) をリンクする際の順序を指定します。この最適化では、コードの局所性とページングの減少を向上させることによってアプリケーション・パフォーマンスを向上できます。

extern 関数とスタティック関数のみ (ライブラリー関数ではありません)。

Linux* および Windows*: すべてのインテル® アーキテクチャー

データの順序設定: プロファイル情報に基づいてスタティック・グローバル・データ項目 の順序設定を有効にします。リンカーがプログラムのグローバルデータをリンクする際の順序を指定します。この最適化では、スタティック・グローバル・データの局所性の向上、大規模データセットのページングの減少、データキャッシュの使用の向上により、アプリケーション・パフォーマンスを向上できます。

スタティック・グローバル・データのみ

Linux* および Windows*: すべてのインテル® アーキテクチャー

上記にリストされた関数関連の順序設定の最適化は、各アプリケーションで 1 つのみ使用できます。ただし、データの順序設定については、いずれかの関数関連の順序設定とともに使用できます (関数の順序設定によるデータの順序設定、または関数のグループ化によるデータの順序設定など)。この場合、prof-gen オプションのキーワード globdata (データの順序設定で必要) を srcpos (関数関連の順序設定で必要) の代わりに指定します。

次のセクションでは、関数順序リスト関数のグループ化関数の順序設定データの順序設定の最適化のいずれかを実装するのに必要なコマンドを説明します。これらすべての最適化で [Q]ipo や相当するコンパイラー・オプションは指定しないでください。

関数順序リストの生成 (Windows*)

このセクションでは、関数順序リストの生成の例を紹介します。file1.cppfile2.cpp からなる C++ プログラムがあると仮定します。また、c:\profdata という名前でプロファイル・データ・ファイル用のディレクトリーを作成したと仮定します。Windows* アプリケーションの関数順序リストを生成して使用するには、次のようなコマンドを入力します。

  1. プログラムを /Qprof-gen:srcpos オプションでコンパイルします。/Qprof-dir オプションでプロファイル・ファイルのディレクトリーを指定します。このステップでは、インストルメント済み実行ファイルを作成します。

    コマンドの例

    icl /Femyprog /Qprof-gen=srcpos /Qprof-dir c:\profdata file1.cpp file2.cpp

  2. 1 つ以上の入力データセットを使用してインストルメント済みプログラムを実行します。ディレクトリーを実行ファイルが保存されているディレクトリーに変更します。プログラムが実行されるたびに、.dyn ファイルが作成されます。

    コマンドの例

    myprog.exe

  3. このステップに入る前に、すべての .dyn ファイルと .dpi ファイルを同じディレクトリーにコピーします。インストルメント済みプログラムの実行で得られたデータを profmerge ツールでマージして、pgopti.dpi ファイルを作成します。/prof_dir オプションで、.dyn ファイルのディレクトリーを指定します。

    コマンドの例

    profmerge /prof_dir c:\profdata

  4. proforder ツールを使用して、関数順序リストを生成します。デフォルトでは、関数順序リストは proford.txt ファイルに生成されます。

    コマンドの例

    proforder /prof_dir c:\profdata /o myprog.txt

  5. リンカーに ORDER オプションを指定し、生成されたプロファイル・フィードバックを使用してアプリケーションをコンパイルします。/Qprof-dir オプションでプロファイル・ファイルのディレクトリーを指定します。

    コマンドの例

    icl /Femyprog /Qprof-use /Qprof-dir c:\profdata file1.cpp file2.cpp /link -ORDER:@myprog.txt

関数のグループ化の使用 (Linux*)

このセクションでは、関数のグループ化の最適化を使用する一般的な例を紹介します。file1.cppfile2.cpp からなる C++ プログラムがあると仮定します。また、profdata という名前でプロファイル・データ・ファイル用のディレクトリーを作成したと仮定します。Linux* アプリケーションで関数のグループ化を使用するには、次のようなコマンドを入力します。

  1. -prof-gen オプションでプログラムをコンパイルします。-prof-dir オプションでプロファイル・ファイルのディレクトリーを指定します。このステップでは、インストルメント済み実行ファイルを作成します。

    コマンドの例

    icc -o myprog -prof-gen -prof-dir ./profdata file1.cpp file2.cpp

  2. 1 つ以上の入力データセットを使用してインストルメント済みプログラムを実行します。ディレクトリーを実行ファイルが保存されているディレクトリーに変更します。プログラムが実行されるたびに、.dyn ファイルが作成されます。

    コマンドの例

    ./myprog

  3. すべての .dyn ファイルと .dpi ファイルを同じディレクトリーにコピーします。必要に応じて、インストルメント済みプログラムの実行で得られたデータを profmerge ツールでマージして、pgopti.dpi ファイルを作成します。

  4. -prof-func-group オプションで関数のグループ化を指定し、-prof-use オプションでコンパイルのフィードバックを指定します。生成されたプロファイル・フィードバックに基づいてアプリケーションをコンパイルします。再度、-prof-dir オプションを使用して、プロファイル・ファイルの場所を指定します。

    コマンドの例

    icl /Femyprog file1.cpp file2.cpp -prof-func-group -prof-use -prof-dir ./profdata

関数の順序設定の使用

Linux* では、-prof-use が指定されると -prof-func-group がデフォルトで有効になります。

-prof-hotness-threshold コンパイラー・オプションにより、ホット領域に配置される関数の数をより細かく制御することができます。詳細は、コマンドライン・リファレンスを参照してください。

このセクションでは、関数の順序設定の最適化の例を紹介します。file1.cppfile2.cpp からなる C++ プログラムがあり、c:\profdata (Windows*) または ./profdata (Linux*) という名前のプロファイル・データ・ファイルのディレクトリーが作成されていると仮定します。アプリケーションで関数の順序設定を生成して使用するには、次のようなコマンドを入力します。

  1. -prof-gen=srcpos オプション (Linux*) または /Qprof-gen:srcpos オプション (Windows*) でプログラムをコンパイルします。[Q]prof-dir オプションでプロファイル・ファイルのディレクトリーを指定します。このステップでは、インストルメント済み実行ファイルを作成します。

    オペレーティング・システム

    コマンドの例

    Linux*

    icc -o myprog -prof-gen=srcpos -prof-dir ./profdata file1.cpp file2.cpp

    Windows*

    icl /Femyprog /Qprof-gen:srcpos /Qprof-dir c:\profdata file1.cpp file2.cpp

  2. 1 つ以上の入力データセットを使用してインストルメント済みプログラムを実行します。ディレクトリーを実行ファイルが保存されているディレクトリーに変更します。プログラムが実行されるたびに、.dyn ファイルが作成されます。

    オペレーティング・システム

    コマンドの例

    Linux*

    ./myprog

    Windows*

    myprog.exe

  3. すべての .dyn ファイルと .dpi ファイルを同じディレクトリーにコピーします。必要に応じて、インストルメント済みプログラムの実行で得られたデータを profmerge ツールでマージして、pgopti.dpi ファイルを作成します。

  4. [Q]prof-func-order オプションで関数の順序設定を指定し、[Q]prof-use オプションでコンパイルのフィードバックを指定します。生成されたプロファイル・フィードバックに基づいてアプリケーションをコンパイルします。再度、[Q]prof-dir オプションを使用して、プロファイル・ファイルの場所を指定します。

    オペレーティング・システム

    コマンドの例

    Linux*

    icpc -o myprog -prof-dir ./profdata file1.cpp file2.cpp -prof-func-order-prof-use

    Windows*

    icl /Femyprog /Qprof-dir c:\profdata file1.cpp file2.cpp /Qprof-func-order /Qprof-use

データの順序設定の使用

このセクションでは、データの順序設定の最適化の例を紹介します。file1.cppfile2.cpp からなる C++ プログラムがあり、c:\profdata (Windows*) または ./profdata (Linux*) という名前のプロファイル・データ・ファイルのディレクトリーが作成されていると仮定します。アプリケーションでデータの順序設定を使用するには、次のようなコマンドを入力します。

  1. -prof-gen=globdata オプション (Linux*) または /Qprof-gen:globdata オプション (Windows*) でプログラムをコンパイルします。そして、-prof-dir オプション (Linux*) または /Qprof-dir オプション (Windows*) でプロファイル・ファイルのディレクトリーを指定します。このステップでは、インストルメント済み実行ファイルを作成します。

    オペレーティング・システム

    コマンドの例

    Linux*

    icc -o myprog -prof-gen=globdata -prof-dir ./profdata file1.cpp file2.cpp

    Windows*

    icl /Femyprog /Qprof-gen=globdata /Qprof-dir c:\profdata file1.cpp file2.cpp

  2. 1 つ以上の入力データセットを使用してインストルメント済みプログラムを実行します。現在のディレクトリー以外の場所を指定した場合、実行ファイルが含まれているディレクトリーに変更してください。プログラムが実行されるたびに、.dyn ファイルが作成されます。

    オペレーティング・システム

    コマンドの例

    Linux*

    ./myprog

    Windows*

    myprog.exe

  3. すべての .dyn ファイルと .dpi ファイルを同じディレクトリーにコピーします。必要に応じて、インストルメント済みプログラムの実行で得られたデータを profmerge ツールでマージして、pgopti.dpi ファイルを作成します。

  4. [Q]prof-data-order オプションでデータの順序設定を指定し、[Q]prof-use オプションでコンパイルのフィードバックを指定します。生成されたプロファイル・フィードバックに基づいてアプリケーションをコンパイルします。再度、[Q]prof-dir オプションを使用して、プロファイル・ファイルの場所を指定します。

    オペレーティング・システム

    コマンドの例

    Linux*

    icpc -o myprog -prof-dir ./profdata file1.cpp file2.cpp -prof-data-order-prof-use

    Windows*

    icl /Femyprog /Qprof-dir c:\profdata file1.cpp file2.cpp /Qprof-data-order/Qprof-use