/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 するプロセスの数が少なくなります。 オプションの引数を指定する場合は、プロセスの最大数を明示的にprocessMax/MP設定できます。 また、 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 オプションでは、ソース ファイルが特定の順序でコンパイルされることを保証できません。

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

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

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

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

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

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

Visual Studio プロジェクトの設定

MSBuild ツール

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

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

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

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

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

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

関連項目

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