Visual Studio 2017 を使用することをお勧めします

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

 

公開日: 2016年10月

Visual Studio 2017 RC の最新のドキュメントの詳細については、Visual Studio 2017 RC ドキュメントをご参照ください。

/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 を出力し、現在のコンパイラの警告レベル オプションに応じて終了または続行します。

System_CAPS_ICON_note.jpg メモ

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

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

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

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

診断メッセージ説明コンパイラの動作
C2813#import ディレクティブは /MP オプションと互換性がありません。コンパイラの警告レベル オプションで他の方法が指定されている場合を除き、コンパイルは終了します。
D9014processMax 引数に無効な値が指定されています。コンパイラは、無効な値を無視し、値が 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 と最大プロセス数の 7 の小さい方である 5 つのプロセスを使用します。 また、コンピューターに 2 つの有効なプロセッサがあり、次のコマンド ラインを指定するとします。

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

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

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

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

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

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

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

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

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

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

Visual Studio プロジェクトの設定

MSBUILD.exe ツール

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

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

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

  • プロジェクトの数が多く、各プロジェクトのファイルが少ない場合は、MSBuild ツールを使用します。

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

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

/Gm コンパイラ オプション

既定では、プロジェクトのビルドで、デバッグ ビルドの場合は /Gm コンパイラ オプション (インクリメンタル ビルド) が有効になり、リリース ビルドでは無効になります。 したがって、デバッグ ビルドの場合、/MP コンパイラ オプションは既定の /Gm コンパイラ オプションと競合するため、自動的に無効になります。

#import ディレクティブ
Command-Line Reference

表示: