インテル® C++ コンパイラー 19.0 デベロッパー・ガイドおよびリファレンス
多くの場合、IPO ではリンク時のコンパイルで 1 つのオブジェクト・ファイルが生成されます。これは、プログラムが大規模だと効率が悪く、最悪の場合、アプリケーションで [Q]ipo コンパイラー・オプションを使用できないことがあります。
この問題を回避するには、次の 2 つの方法のいずれかを行います。1 つ目は、サイズベースのヒューリスティックです。このヒューリスティックでは、大規模なアプリケーションのリンク時のコンパイルにおいて複数のオブジェクト・ファイルを自動生成します。2 つ目の方法は、マルチオブジェクト IPO の処理をコンパイラーに手動で指示する方法です。
[Q]ipoN オプションを使用して、N の代わりに整数値を渡します。
[Q]ipo-separate コンパイラー・オプションを使用します。
リンク時のコンパイルで生成される実際のオブジェクト・ファイルの数は、[Q]ipo-c コンパイラー・オプションまたは [Q]ipo-S コンパイラー・オプションを指定しない限り表示されません。
いずれの方法を用いるにしても、最初にコンパイラーのデフォルト設定を使用して、結果を検証すると良いでしょう。デフォルトで期待していた結果が得られない場合は、異なるオブジェクト・ファイル数を生成して検証します。
[Q]ipo-jobs コンパイラー・オプションを使用して、並列 IPO ビルド中に実行されるプロセスやジョブの数を制御します。
[Q]ipo0 を指定した場合 (値を何も指定しない場合と同じ)、コンパイラーはヒューリスティックを使用し、アプリケーション・サイズに応じて作成するオブジェクト・ファイルの数を判断します。小さなアプリケーションでは 1 つのオブジェクト・ファイルを、大きなアプリケーションでは 2 つ以上のオブジェクト・ファイルを生成します。0 よりも大きな値を指定すると、ソースファイルの数を超える値を渡さない限り、コンパイラーは指定した数のオブジェクト・ファイルを生成します。ソースファイルの数を超える値を指定した場合は、コンパイラーは各ソースファイルのオブジェクト・ファイルを作成した後にオブジェクト・ファイルの生成を停止します。
次のコマンド例は、[Q]ipo2 オプションを使用して大規模なプログラムをコンパイルする方法を示します。
オペレーティング・システム |
コマンド例 |
---|---|
Windows* |
icl /Qipo2 /c a.cpp b.cpp |
Linux* |
icpc -ipo2 -c a.cpp b.cpp |
macOS* |
icpc -ipo2 -c a.cpp b.cpp |
上記のコマンド例を実行すると、コンパイラーは OS 依存の命名規則を使用してオブジェクト・ファイルを生成します。Linux* および macOS* では、ipo_out.o、ipo_out1.o、および ipo_out2.o が上記のコマンド例により生成されます。Windows* では、ファイル名に同じ規則が適用されますが、ファイルの拡張子は .obj になります。
「IPO の使用」または「リンクツールとオプション」にあるように、生成されたオブジェクト・ファイルをリンクします。
[Q]ipo-separate を使用すると、複数オブジェクトのコンパイルでコンパイラーがサポートする最大数のオブジェクト・ファイルを生成できます。オブジェクト・ファイルの最大数は、リンク行で渡された擬似オブジェクト・ファイルの数と同じです。
例えば、次のように指定します。
オペレーティング・システム |
コマンド例 |
---|---|
Windows* |
Icl -Qipo-separate -Qipo-c a.obj b.obj c.obj |
Linux* |
icpc -ipo-separate -ipo-c a.o b.o c.o |
macOS* |
icpc -ipo-separate -ipo-c a.o b.o c.o |
コンパイラーは、上記の命名規則を使用して複数のオブジェクト・ファイルを生成します。
「IPO の使用」または「リンクツールとオプション」にあるように、生成されたオブジェクト・ファイルをリンクします。