/MP (Erstellen mit mehreren Prozessen)

Die /MP Option kann die Gesamtzeit reduzieren, um die Quelldateien in der Befehlszeile zu kompilieren. Die /MP Option führt dazu, dass der Compiler eine oder mehrere Kopien von sich selbst erstellt, jeweils in einem separaten Prozess. Anschließend kompilieren diese Instanzen gleichzeitig die Quelldateien. In einigen Fällen kann die Gesamtzeit zum Erstellen der Quelldateien erheblich reduziert werden.

Syntax

/MP[processMax]

Argumente

processMax
(Optional) Die maximale Anzahl von Prozessen, die der Compiler erstellen kann.

Das processMax -Argument muss zwischen 1 und 65536 liegen. Andernfalls gibt der Compiler Warnungsnachricht D9014 aus, ignoriert das processMax Argument, und wird davon ausgegangen, dass die maximale Anzahl von Prozessen 1 ist.

Wenn Sie das processMax -Argument weglassen, fragt der Compiler die Anzahl der effektiven Prozessoren auf dem Computer aus dem Betriebssystem ab und erstellt einen Prozess für jeden Prozessor.

Bemerkungen

Die /MP Compileroption kann die Buildzeit erheblich verringern, wenn Sie viele Dateien kompilieren. Zur Verbesserung der Buildzeit erstellt der Compiler bis zu processMax Kopien von sich selbst und verwendet dann diese Kopien, um die Quelldateien gleichzeitig zu kompilieren. Die /MP Option gilt für Kompilierungen, aber nicht für die Verknüpfung oder Verknüpfungszeitcodegenerierung. Standardmäßig ist die /MP Option deaktiviert.

Die Verbesserung der Buildzeit hängt von der Anzahl der Prozessoren auf einem Computer ab, der Anzahl der zu kompilierenden Dateien und der Verfügbarkeit von Systemressourcen, z.B. der E/A-Kapazität. Experimentieren Sie mit der /MP Option, die beste Einstellung zum Erstellen eines bestimmten Projekts zu bestimmen. Ratschläge, die Sie bei dieser Entscheidung unterstützen, finden Sie unter Richtlinien.

Inkompatible Optionen und Sprachfeatures

Die /MP Option ist mit einigen Compileroptionen und Sprachfeatures nicht kompatibel. Wenn Sie eine inkompatible Compileroption mit der /MP Option verwenden, wird die Compilerwarnung D9030 behoben und die /MP Option ignoriert. Wenn Sie ein inkompatibles Sprachfeature verwenden, wird der Compilerfehler C2813 beendet oder fortgesetzt, abhängig von der option für die aktuelle Compilerwarnung.

Hinweis

Die meisten Optionen sind nicht kompatibel, denn wenn sie zulässig wären, würden die gleichzeitig ausgeführten Compiler ihre Ausgabe zur gleichen Zeit auf die Konsole oder in eine bestimmte Datei schreiben. Daher wäre die Ausgabe vermischt und verstümmelt. In einigen Fällen würde die Kombination von Optionen die Leistung verschlechtern.

In der folgenden Tabelle sind Compileroptionen und Sprachfeatures aufgeführt, die mit der /MP Option nicht kompatibel sind:

Option oder Sprachfunktion BESCHREIBUNG
Präprozessoranweisung #import Konvertiert die Typen in einer Typbibliothek in C++-Klassen und schreibt diese Klassen dann in eine Headerdatei.
/E, /EP Kopiert die Preprocessor-Ausgabe in die Standardausgabe (stdout).
/Gm Veraltet. Ermöglicht eine inkrementelle erneute Erstellung.
/showIncludes Schreibt eine Liste mit Dateien in den Standardfehler (stderr).
/Yc Schreibt eine vorkompilierte Headerdatei.

Diagnosenachrichten

Wenn Sie eine Option oder Sprachfunktion angeben, die mit der /MP Option nicht kompatibel ist, erhalten Sie eine Diagnosenachricht. Die folgende Tabelle enthält die Meldungen und das Verhalten des Compilers:

Diagnosemeldung BESCHREIBUNG Compilerverhalten
C2813 Die #import Richtlinie ist nicht mit der /MP Option kompatibel. Die Kompilierung endet, sofern keine Option für Compilerwarnstufen etwas anderes angibt.
D9014 Ein ungültiger Wert ist für das processMax -Argument angegeben. Der Compiler ignoriert den ungültigen Wert und nimmt den Wert 1 an.
D9030 Die angegebene Option ist nicht kompatibel mit /MP. Der Compiler ignoriert die /MP Option.

Richtlinien

Messen der Leistung

Verwenden Sie die gesamte Buildzeit zum Messen der Leistung. Sie können die Buildzeit mit einer physischen Uhr messen, oder Sie können Software verwenden, die den Unterschied zwischen Start und Ende des Build berechnet. Wenn Ihr Computer über mehrere Prozessoren verfügt, kann eine physische Uhr genauere Ergebnisse als eine Software-Zeitmessung ergeben.

Effektive Prozessoren

Ein Computer kann über einen oder mehrere virtuelle Prozessoren verfügen, die auch als effektive Prozessoren bezeichnet werden, für jede ihrer physischen Prozessoren. Jeder physischer Prozessor kann einen oder mehrere Kerne haben, und wenn das Betriebssystem für einen Kern Hyperthreading ermöglicht, erscheint jeder Kern als zwei virtuelle Prozessoren.

Beispiel: Ein Computer verfügt über einen effektiven Prozessor, wenn er einen physischen Prozessor mit einem Kern besitzt und Hyperthreading deaktiviert ist. Im Gegensatz dazu besitzt ein Computer acht effektive Prozessoren, wenn er zwei physische Prozessoren mit jeweils zwei Kernen hat und alle Kerne Hyperthreading aktiviert haben. Das heißt, (8 effektive Prozessoren) = (2 physische Prozessoren) x (2 Kerne pro physischer Prozessor) x (2 effektive Prozessoren pro Kern aufgrund von Hyperthreading).

Wenn Sie das processMax Argument in der /MP Option auslassen, ruft der Compiler die Anzahl der effektiven Prozessoren aus dem Betriebssystem ab, und erstellt dann einen Prozess pro effektiven Prozessor. Der Compiler kann jedoch nicht garantieren, welche Prozesse auf einem bestimmten Prozessor ausgeführt werden; das Betriebssystem macht diese Entscheidung.

Anzahl der Prozesse

Der Compiler berechnet die Anzahl der Prozesse, die dazu verwendet werden, die Quelldateien zu kompilieren. Dieser Wert ist der geringere Wert der Anzahl der Quelldateien, die Sie in der Befehlszeile angeben, und die Anzahl der Prozesse, die Sie explizit oder implizit mit der /MP Option angeben. Sie können die maximale Anzahl von Prozessen explizit festlegen, wenn Sie das processMax Argument der /MP Option angeben. Oder Sie können die Standardeinstellung verwenden, die gleich der Anzahl der effektiven Prozessoren in einem Computer ist, wenn Sie das processMax -Argument weglassen.

Beispielsweise können Sie die folgende Befehlszeile angeben:

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

In diesem Fall verwendet der Compiler fünf Prozesse, da dies weniger als fünf Quelldateien und maximal sieben Prozesse ist. Beispiel: Ihr Computer hat zwei effektive Prozessoren und Sie geben die folgende Befehlszeile an:

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

In diesem Fall meldet das Betriebssystem zwei Prozessoren, sodass der Compiler zwei Prozesse in seiner Berechnung verwendet. Daher verwendet der Compiler zwei Prozesse, um den Build auszuführen, da das weniger als zwei Prozesse und drei Quelldateien ist.

Quelldateien und Buildreihenfolge

Die Quelldateien werden möglicherweise nicht in der gleichen Reihenfolge kompiliert, in denen sie in der Befehlszeile angezeigt werden. Obwohl der Compiler eine Reihe von Prozessen erstellt, die Kopien des Compilers enthalten, plant das Betriebssystem, wann jeder Prozess ausgeführt wird. Die /MP Option kann nicht garantieren, dass die Quelldateien in einer bestimmten Reihenfolge kompiliert werden.

Eine Quelldatei wird kompiliert, wenn ein Prozess für ihre Kompilierung verfügbar ist. Wenn mehr Dateien als Prozesse vorhanden sind, wird der erste Satz von Dateien von den verfügbaren Prozessen kompiliert. Die restlichen Dateien werden verarbeitet, wenn ein Prozess die Behandlung einer vorherigen Datei beendet und für die Verarbeitung einer der verbleibenden Dateien bereitsteht.

Geben Sie die gleiche Quelldatei mehrmals in einer Befehlszeile an. Mehrere Spezifikationen können beispielsweise auftreten, wenn ein Tool automatisch eine Makefile erstellt, die auf Abhängigkeitsinformationen in einem Projekt basiert. Wenn Sie die /MP Option nicht angeben, verarbeitet der Compiler die Liste der Dateien sequenziell und kompiliert jedes Vorkommen der Datei. Wenn Sie jedoch die /MP Option angeben, können verschiedene Compilerinstanzen die gleiche Datei gleichzeitig kompilieren. Die verschiedenen Instanzen können gleichzeitig versuchen, in die gleiche Ausgabedatei zu schreiben. Eine Compilerinstanz erhält exklusiven Schreibzugriff auf die Ausgabedatei und erfolgreich, und die anderen Compilerinstanzen schlagen mit einem Dateizugriffsfehler fehl.

Verwenden von Typbibliotheken (#import)

Der Compiler unterstützt die Verwendung der #import Richtlinie nicht mit dem /MP Schalter. Führen Sie wenn möglich die folgenden Schritte aus, um dieses Problem zu umgehen:

  • Verschieben Sie alle #import Richtlinien in Ihren verschiedenen Quelldateien in eine oder mehrere Dateien, und kompilieren Sie diese Dateien dann ohne /MP die Option. Das Ergebnis ist ein Satz generierter Headerdateien.

  • Fügen Sie #include in Ihren verbleibenden Quelldateien Direktiven ein, die die generierten Kopfzeilen angeben, und kompilieren Sie dann Ihre verbleibenden Quelldateien mithilfe der /MP Option.

Visual Studio Project Einstellungen

Das MSBuild Tool

Visual Studio verwendet das MSBuild Tool (msbuild.exe) zum Erstellen von Lösungen und Projekten. /m:numberDie /maxcpucount:number Befehlszeilenoption des MSBuild-Tools kann gleichzeitig mehrere Projekte erstellen. Und die /MP Compileroption kann mehrere Kompilierungseinheiten gleichzeitig erstellen. Wenn es für Ihre Anwendung geeignet ist, verbessern Sie die Buildzeit Ihrer Lösung mithilfe von beiden oder beides/MP./maxcpucount

Die Buildzeit der Projektmappe hängt teilweise von der Anzahl der Prozesse ab, die den Build ausführen. Das number Argument der /maxcpucount option MSBuild gibt die maximale Anzahl von Projekten an, die gleichzeitig erstellt werden sollen. Ebenso gibt das processMax Argument der /MP Compileroption die maximale Anzahl von Kompilierungseinheiten an, die gleichzeitig erstellt werden sollen. Wenn die /maxcpucount Option P-Projekte angibt und die /MP Option C-Prozesse angibt, werden maximal P x C-Prozesse gleichzeitig ausgeführt.

Die Richtlinie für die Entscheidung, ob MSBuild oder /MP Technologie verwendet werden soll, ist wie folgt:

  • Wenn in jedem Projekt viele Projekte mit wenigen Dateien vorhanden sind, verwenden Sie das tool MSBuild mit der /maxcpucount Option.

  • Wenn in jedem Projekt nur wenige Projekte mit vielen Dateien vorhanden sind, verwenden Sie die /MP Option.

  • Wenn die Anzahl der Projekte und Dateien pro Projekt ausgeglichen ist, verwenden Sie sowohl MSBuild als /MPauch . Legen Sie zunächst die /maxcpucount Option auf die Anzahl der Zu erstellenden Projekte und die /MP Option auf die Anzahl der Prozessoren auf Ihrem Computer fest. Messen Sie die Leistung und passen Sie dann die Einstellungen so an, dass sie zu optimalen Ergebnissen führen. Wiederholen Sie diesen Zyklus, bis Sie mit der Gesamtbuildzeit zufrieden sind.

Weitere Informationen

#import Richtlinie
MSBuild-Befehlszeilenreferenz
/Zf (Schnellere PDB-Generation)