/MP (複数のプロセスを使用したビルド)

/MP オプションを使用すると、コマンド ラインでソース ファイルをコンパイルする合計時間を短縮できます。 /MP オプションを指定すると、コンパイラはそれ自体の 1 つ以上のコピーを個別のプロセスで作成します。 その後、これらのインスタンスは同時にソース ファイルをコンパイルします。 場合によっては、ソース ファイルのビルドにかかる合計時間を大幅に短縮できます。

構文

/MP[processMax]

引数

processMax
(省略可能) コンパイラが作成できるプロセスの最大数。

processMax 引数は、1 ~ 65536 の範囲の値である必要があります。 それ以外の場合、コンパイラは警告メッセージ D9014 を発行し、 processMax 引数を無視し、プロセスの最大数が 1 であると想定します。

processMax 引数を省略した場合、コンパイラはオペレーティング システムからコンピューター上の 有効なプロセッサ の数を取得し、プロセッサごとにプロセスを作成します。

解説

/MP コンパイラ オプションを使用すると、多数のファイルをコンパイルするときのビルド時間を大幅に短縮できます。 ビルド時間を向上させるために、コンパイラはそれ自身のコピーを最大 processMax 個作成し、それらのコピーを同時に使用してソース ファイルをコンパイルします。 /MP オプションはコンパイルには適用されますが、リンクやリンク時のコード生成には適用されません。 既定では、 /MP オプションはオフになっています。

ビルド時間の向上は、コンピューター上のプロセッサ数、コンパイルするファイルの数、および I/O 容量などのシステム リソースの可用性に依存します。 /MP オプションを試して、特定のプロジェクトをビルドするための最適な設定を決定します。 この判断を行う際に役立つアドバイスについては、 ガイドラインをご覧ください。

互換性のないオプションと言語機能

/MP オプションは、一部のコンパイラ オプションや言語機能と互換性がありません。 /MP オプションと互換性のないコンパイラ オプションを使用すると、コンパイラは警告D9030を発行し、/MP オプションを無視します。 互換性のない言語機能を使用する場合、コンパイラはエラー C2813 を出力し、現在のコンパイラの警告レベル オプションに応じて終了または続行します。

Note

ほとんどのオプションは、許可されると、同時に実行される複数のコンパイラによって、コンソールや特定のファイルに同時に出力が書き込まれることになるため、互換性がありません。 その結果、出力にさまざまな情報が混在し、文字が正しく表示されません。 オプションの組み合わせによっては、パフォーマンスが低下する場合もあります。

次の表に、 /MP オプションと互換性のないコンパイラ オプションと言語機能を示します。

オプションまたは言語機能 説明
#import プリプロセッサ ディレクティブ タイプ ライブラリの型を C++ クラスに変換し、それらのクラスをヘッダー ファイルに書き込みます。
/E, /EP プリプロセッサ出力を標準出力 (stdout) にコピーします。
/Gm 削除されました。 インクリメンタル リビルドを有効にします。
/showIncludes インクルード ファイルの一覧を標準エラー (stderr) に書き込みます。
/Yc プリコンパイル済みヘッダー ファイルを書き込みます。

診断メッセージ

/MP オプションと互換性のないオプションまたは言語機能を指定すると、診断メッセージが表示されます。 次の表に、メッセージと、コンパイラの動作を示します。

診断メッセージ 説明 コンパイラの動作
C2813 #import ディレクティブは、/MP オプションと互換性がありません。 コンパイラの警告レベル オプションで他の方法が指定されている場合を除き、コンパイルは終了します。
D9014 processMax 引数に無効な値が指定されています。 コンパイラは、無効な値を無視し、値が 1 であると見なします。
D9030 指定されたオプションは、 /MPと互換性がありません。 コンパイラは、 /MP オプションを無視します。

ガイドライン

パフォーマンスの計測

合計ビルド時間を使用して、パフォーマンスを計測します。 物理クロックを使用してビルド時間を計測することも、ソフトウェアを使用してビルドの開始時と停止時の差を計算することもできます。 お使いのコンピューターに複数のプロセッサがある場合は、ソフトウェアによる時間の計測よりも、物理クロックの方がより正確な計測結果が生成される可能性があります。

有効なプロセッサ

コンピューターで、物理プロセッサごとに 1 つまたは複数の仮想プロセッサ ("有効なプロセッサ" とも呼ばれます) を使用できます。 各物理プロセッサは 1 つまたは複数のコアを持つことができ、オペレーティング システムでコアのハイパースレッディングが有効になっている場合、各コアは 2 つの仮想プロセッサとして表示されます。

たとえば、コンピューターに 1 つのコアを持つ物理プロセッサが 1 つ搭載されており、ハイパースレッディングが無効になっている場合、有効なプロセッサは 1 つです。 これに対し、コンピューターに 2 つの物理プロセッサがあり、それぞれが 2 つのコアを持ち、すべてのコアのハイパースレッディングが有効になっている場合、コンピューターの有効なプロセッサは 8 つになります。 つまり、(8 つの有効なプロセッサ) = (2 つの物理プロセッサ) x (物理プロセッサあたり 2 コア) x (ハイパースレッディングによりコアあたり 2 つの有効なプロセッサ)。

/MP オプションで processMax 引数を省略すると、コンパイラはオペレーティング システムから有効なプロセッサの数を取得し、有効なプロセッサごとに 1 つのプロセスを作成します。 ただし、コンパイラは特定のプロセッサで実行されるプロセスを保証できません。オペレーティング システムがその決定を行います。

プロセスの数

コンパイラは、ソース ファイルをコンパイルするために使用するプロセスの数を計算します。 この値は、コマンド ラインで指定するソース ファイルの数と、 /MP オプションを使用して明示的または暗黙的に指定するプロセスの数が少なくなります。 /MP オプションのprocessMax引数を指定する場合は、プロセスの最大数を明示的に設定できます。 また、 processMax 引数を省略した場合は、既定値を使用できます。これは、コンピューター内の有効なプロセッサ数と等しくなります。

たとえば、次のようなコマンド ラインを指定したとします。

cl /MP7 a.cpp b.cpp c.cpp d.cpp e.cpp

この場合、コンパイラは 5 つのプロセスを使用します。これは、ソース ファイルが 5 つ未満で、最大 7 つのプロセスであるためです。 また、コンピューターに 2 つの有効なプロセッサがあり、次のコマンド ラインを指定するとします。

cl /MP a.cpp b.cpp c.cpp

この場合、オペレーティング システムは 2 つのプロセッサを報告するため、コンパイラはその計算で 2 つのプロセスを使用します。 その結果、コンパイラは 2 つのプロセスを使用してビルドを実行します。これは、2 つのプロセスと 3 つのソース ファイルの方が少ないためです。

ソース ファイルとビルド順序

ソース ファイルは、コマンド ラインで表示される順序と同じ順序でコンパイルされない可能性があります。 コンパイラは、コンパイラのコピーが含まれている一連のプロセスを作成しますが、オペレーティング システムが各プロセスを実行するタイミングをスケジュールします。 /MP オプションでは、ソース ファイルが特定の順序でコンパイルされることを保証できません。

ソース ファイルは、ソース ファイルをコンパイルするプロセスが利用可能になったときにコンパイルされます。 プロセスよりも多くのファイルがある場合は、利用可能なプロセスによってファイルの最初のセットがコンパイルされます。 残りのファイルは、プロセスが前のファイルの処理を終了し、残りのファイルのいずれかを処理できるようになると処理されます。

コマンド ラインで同じソース ファイルを複数回指定しないでください。 たとえば、ツールがプロジェクトの依存関係情報に基づいて makefile を自動的に作成する場合など、複数の仕様が発生する可能性があります。 /MP オプションを指定しない場合、コンパイラはファイルの一覧を順番に処理し、ファイルが出現するたびに再コンパイルします。 ただし、 /MP オプションを指定すると、異なるコンパイラ インスタンスが同じファイルを同時にコンパイルする可能性があります。 異なるインスタンスが同じ出力ファイルに同時に書き込もうとすることがあります。 1 つのコンパイラ インスタンスが出力ファイルへの排他的書き込みアクセス権を取得して成功し、他のコンパイラ インスタンスはファイル アクセス エラーで失敗します。

タイプ ライブラリの使用 (#import)

コンパイラは、/MP スイッチでの #import ディレクティブの使用をサポートしていません。 可能であれば、次の手順に従って、この問題を回避してください。

  • さまざまなソース ファイル内のすべての #import ディレクティブを 1 つ以上のファイルに移動し、 /MP オプションを指定せずにそれらのファイルをコンパイルします。 これにより、一連のヘッダー ファイルが生成されます。

  • 残りのソース ファイルに、生成されたヘッダーを指定 #include ディレクティブを挿入し、 /MP オプションを使用して残りのソース ファイルをコンパイルします。

Visual Studio プロジェクトの設定

MSBuild ツール

Visual Studio では、 MSBuild ツール (msbuild.exe) を使用してソリューションとプロジェクトをビルドします。 MSBuild ツールの /maxcpucount:number (または /m:number) コマンド ライン オプションを使用すると、複数のプロジェクトを同時にビルドできます。 また、 /MP コンパイラ オプションでは、複数のコンパイル ユニットを同時にビルドできます。 アプリケーションに適している場合は、 /MP/maxcpucountの両方を使用して、ソリューションのビルド時間を短縮します。

ソリューションのビルド時間は、部分的に、ビルドを実行するプロセスの数に依存しています。 /maxcpucount MSBuild オプションのnumber引数は、同時にビルドするプロジェクトの最大数を指定します。 同様に、/MP コンパイラ オプションのprocessMax引数では、同時にビルドするコンパイル 単位の最大数を指定します。 /maxcpucount オプションで P プロジェクトを指定し、/MP オプションで C プロセスを指定した場合、最大P x C プロセスが同時に実行されます。

MSBuild または /MP テクノロジのどちらを使用するかを決定するためのガイドラインは次のとおりです。

  • 各プロジェクトにファイルが少ないプロジェクトが多数ある場合は、 /maxcpucount オプションで MSBuild ツールを使用します。

  • 各プロジェクトに多数のファイルを含むプロジェクトが少ない場合は、 /MP オプションを使用します。

  • プロジェクトあたりのプロジェクト数とファイル数のバランスが取れている場合は、MSBuild と /MP の両方を使用します。 最初に、 /maxcpucount オプションをビルドするプロジェクトの数に設定し、 /MP オプションをコンピューター上のプロセッサの数に設定します。 パフォーマンスを測定し、最適な結果を得られるように、設定を調整します。 合計ビルド時間に満足するまで、そのサイクルを繰り返します。

関連項目

#import ディレクティブ
MSBuild コマンド ライン リファレンス
/Zf (PDB の生成の高速化)