関数順序リストは、リンカーがプログラムの非スタティック関数をリンクする際の順序を指定するテキストです。このリストにより、ページングが減少し、コードのアクセス性が高まるため、プログラムのパフォーマンスが向上します。プロファイルに基づく最適化では、リンカーで使用する関数順序リストの生成をサポートしています。コンパイラーはプロファイル情報を使用して、順序を判定します。
関数順序リストを生成するには、profmerge および proforder ユーティリティーを使用します。
関数順序リストを作成するには、次のガイドラインに従ってください。
順序リストは非スタティック関数の順序にのみ影響します。
関数レベルのリンクを有効にするには、/Gy オプションを使用してコンパイルする必要があります (このオプションは、/O1 または /O2 オプションのいずれかを指定するとアクティブになります)。
インテル(R) コンパイラーは、次の 2 つの方法で、実行ファイル内の関数のレイアウトを最適化します。
関数順序リストを使用する。
-ipo (Linux*) または /Qipo (Windows) コンパイラー・オプションを使用する。
2 つの方法にはそれぞれ長所があります。proforder によって作成される関数順序リストを使用すると、非スタティック関数 (すなわち、リンカーに対して関数名を公開する外部関数およびライブラリー関数) のレイアウトを最適化できます。
スタティック関数の名前はオブジェクト・ファイルで利用できないため、リンカーは、これらの関数のレイアウト順序を直接操作できません。
コンパイラーは、他のコンパイラーでコンパイルされた関数 (ライブラリー関数など) のレイアウト順序を操作できません。IPO がアクティブな場合、関数レイアウトの最適化は自動的に実行されます。
代わりに、-ipo (Linux) または /Qipo (Windows) オプションを使用して、インテル(R) C++ コンパイラーでコンパイルされたすべての static または extern 関数のレイアウトを最適化できます。コンパイラーは、他のコンパイラーでコンパイルされた関数 (ライブラリー関数など) のレイアウト順序を操作できません。IPO がアクティブな場合、関数レイアウトの最適化は自動的に実行されます。
関数の型 |
/Qipo による |
proforder による |
---|---|---|
スタティック |
X |
影響なし |
外部関数 |
X |
X |
ライブラリー関数 |
影響なし |
X |
このセクションでは、関数順序リストを生成する一般的なプロセスの例を説明します。次のファイルからなる C++ プログラムがあると仮定します。
file1.cpp
file2.cpp
また、profdata という名前でプロファイル・データ・ファイル用のディレクトリーを作成したと仮定します。アプリケーションの関数順リストを生成して使用するには、次のようなコマンドを入力します。
-prof-genx (Linux) または /Qprof-genx (Windows) オプションを使用してプログラムをコンパイルします。
プラットフォーム |
コマンドの例 |
---|---|
Linux |
icpc -o myprog -prof-genx -prof-dir ./profdata file1.cpp file2.cpp |
Windows |
icl /Femyprog /Qprof-genx /Qprof-dir c:\profdata file1.cpp file2.cpp |
このステップでは、インストルメント済み実行ファイルを作成します。
1 つ以上の入力データセットを使用してインストルメント済みプログラムを実行します。現在のディレクトリー以外の場所を指定した場合、実行ファイルが含まれているディレクトリーに変更してください。
プラットフォーム |
コマンドの例 |
---|---|
Linux |
./myprog |
Windows |
myprog.exe |
プログラムが実行されるたびに、.dyn ファイルが作成されます。指定されたオプションによっては、このプロセスは時間がかかる場合もあります。
インストルメント済みプログラムを 1 回以上実行して、得られたデータを profmerge ユーティリティーを使用してマージし、pgopti.dpi ファイルを生成します。-prof-dir (Linux) または /Qprof-dir (Windows) オプションを使用して .dyn ファイルの場所を指定します。
プラットフォーム |
コマンドの例 |
---|---|
Linux |
profmerge -prof-dir ./profdat |
Windows |
profmerge /prof-dir c:\profdata |
proforder ユーティリティーを使用して、関数順序リストを生成します。(デフォルトでは、関数順序リストは proford.txt ファイルに生成されます。)
プラットフォーム |
コマンドの例 |
---|---|
Linux |
proforder -prof-dir ./profdata -o myprog.txt |
Windows |
proforder -prof-dir c:\profdata -o myprog.txt |
リンカーに ORDER オプションを指定し、生成されたプロファイル・フィードバックを使用してアプリケーションをコンパイルします。再び、-prof-dir (Linux) または /Qprof-dir (Windows) オプションを使用してプロファイル・ファイルの場所を指定します。
プラットフォーム |
コマンドの例 |
---|---|
Linux |
icpc -o myprog -prof-dir ./profdata file1.cpp file2.cpp -Xlinker -ORDER:@myprog.txt |
Windows |
icl /Femyprog /Qprof-dir c:\profdata file1.cpp file2.cpp /link -ORDER:@myprog.txt |