大規模プログラムの IPO

たいていの場合、IPO ではリンク時のコンパイルで 1 つのオブジェクト・ファイルが生成されます。これは、プログラムが大規模だと効率が悪く、最悪の場合、アプリケーションで -ipo (Linux* および Mac OS* X) または /Qipo (Windows*) を使用できないことがあります。

この問題を回避するには、次の 2 つの方法のいずれかを行います。1 つめは、サイズベースのヒューリスティックです。このヒューリスティックでは、大規模なアプリケーションのリンク時のコンパイルにおいて複数のオブジェクト・ファイルを自動生成します。2 つめの方法は、マルチオブジェクト IPO の処理をコンパイラーに手動で指示する方法です。

いずれの方法を用いるにしても、最初にコンパイラーのデフォルト設定を使用して、結果を検証すると良いでしょう。デフォルトで期待していた結果が得られない場合は、さらに多くのオブジェクト・ファイルを生成して検証します。

-ipo-jobs (Linux および Mac OS X) オプションまたは /Qipo-jobs (Windows) オプションを使用して、並列ビルド中に実行されるコマンドやジョブを制御します。

-ipoN または /QipoN を使用した複数のオブジェクトファイルの作成

-ipo0 (Linux および Mac OS X) または /Qipo0 (Windows) を指定した場合 (値を何も指定しない場合と同じ)、コンパイラーはヒューリスティックを使用し、アプリケーション・サイズに応じて作成するオブジェクト・ファイルの数を判断します。小さなアプリケーションでは 1 つのオブジェクト・ファイルを、大きなアプリケーションでは 2 つ以上のオブジェクト・ファイルを生成します。0 よりも大きな値を指定すると、ソースファイルの数を超える値を渡さない限り、コンパイラーは指定した数のオブジェクト・ファイルを生成します。ソースファイルの数を超える値を指定した場合は、コンパイラーは各ソースファイルのオブジェクト・ファイルを作成した後にオブジェクト・ファイルの生成を停止します。

次のコマンド例は、-ipo2 (Linux および Mac OS X) または /Qipo2 (Windows) を使用して大規模なプログラムをコンパイルする方法を示します。

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

コマンド例

Linux および Mac OS X

icpc -ipo2 -c a.cpp b.cpp

Windows

icl /Qipo2 /c a.cpp b.cpp

上記のコマンド例では、コンパイラーは OS 依存の命名規則を使用してオブジェクト・ファイルを生成します。Linux および Mac OS X では、ipo_out.oipo_out1.oipo_out2.oipo_out3.o が上記のコマンド例により生成されます。Windows では、ファイル名に同じ規則が適用されますが、ファイルの拡張子は .obj になります。

「IPO の使用」または「リンクツールとオプション」「リンクツールとオプション」にあるように、生成されたオブジェクト・ファイルをリンクします。

最大オブジェクト・ファイル数

-ipo-separate (Linux および Mac OS X) または /Qipo-separate (Windows) を使用すると、最大数のオブジェクト・ファイルを生成できます。

例えば、次のようなコマンドを渡します。

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

コマンド例

Linux および Mac OS X

icpc -ipo-separate -ipo-c a.o b.o c.o

Windows

icl a.obj b.obj c.obj /Qipo-separate /Qipo-c

コンパイラーは、上記の命名規則を使用して複数のオブジェクト・ファイルを生成します。最初のオブジェクト・ファイルにはグローバル変数が含まれます。その他のオブジェクト・ファイルにはソースファイルで使用される関数またはルーチンのコードが含まれます。

「IPO の使用」または「リンクツールとオプション」「リンクツールとオプション」にあるように、生成されたオブジェクト・ファイルをリンクします。

大規模プログラムのコンパイルにおける注意事項

多くの大規模なプログラムでは、IPO を使用したコンパイルで、1 つの大きなオブジェクト・ファイルが生成されます。大きなオブジェクトを生成するコンパイルでは、効率性の面で問題が発生します。コンパイラーは、コンパイル中にメモリー使用を切り替えるため、大きなオブジェクト・ファイルでは、切り替えが不十分になり、メモリー不足メッセージが表示されたり、またはコンパイルに時間がかかります。複数の、比較的小さなオブジェクト・ファイルにするとシステムのリソースが効率良く使用されます。