Share via


/MP (Erstellen mit mehreren Prozessen)

Die /MP Option kann die Gesamtzeit reduzieren, um die Quelldateien in der Befehlszeile zu kompilieren. Die /MP Option bewirkt, 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 die Warnmeldung D9014 aus, ignoriert das processMax Argument und geht davon aus, 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.

Hinweise

Die /MP Compileroption kann die Erstellungszeit beim Kompilieren vieler Dateien erheblich reduzieren. 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 verknüpfungs- oder Linkzeitcodegenerierung. 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, um die beste Einstellung zum Erstellen eines bestimmten Projekts zu ermitteln. 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, gibt der Compiler warnung D9030 aus und ignoriert die /MP Option. Wenn Sie ein inkompatibles Sprachfeature verwenden, gibt der Compiler den Fehler C2813 aus, und endet oder wird abhängig von der aktuellen Compilerwarnungsstufesoption fortgesetzt.

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
#import Präprozessordirektive Konvertiert die Typen in einer Typbibliothek in C++-Klassen und schreibt diese Klassen dann in eine Headerdatei.
/E, /EP Kopiert die Vorprozessorausgabe in die Standardausgabe (stdout).
/Gm Veraltet. Ermöglicht eine inkrementelle erneute Erstellung.
/showIncludes Schreibt eine Liste der einschließenden Dateien in den Standardfehler (stderr).
/Yc Schreibt eine vorkompilierte Headerdatei.

Diagnosenachrichten

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

Diagnosemeldung Beschreibung Compilerverhalten
C2813 Die #import Direktive 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 jeden seiner 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 Argument in der processMax/MP Option weglassen, ruft der Compiler die Anzahl der effektiven Prozessoren vom Betriebssystem ab und erstellt dann einen Prozess pro effektiven Prozessor. Der Compiler kann jedoch nicht garantieren, welcher Prozess auf einem bestimmten Prozessor ausgeführt wird; das Betriebssystem trifft 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 das 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 dies der geringere von zwei Prozessen 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 dieselbe Quelldatei nicht mehrmals in einer Befehlszeile an. Mehrere Spezifikationen können z. B. 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 unterschiedliche Compilerinstanzen dieselbe Datei gleichzeitig kompilieren. Die verschiedenen Instanzen können versuchen, gleichzeitig in dieselbe Ausgabedatei zu schreiben. Eine Compilerinstanz erwirbt exklusiven Schreibzugriff auf die Ausgabedatei und ist erfolgreich, und die anderen Compilerinstanzen schlagen mit einem Dateizugriffsfehler fehl.

Verwenden von Typbibliotheken (#import)

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

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

  • Fügen Sie in Der Standard neu erstellten Quelldateien Direktiven ein#include, die die generierten Kopfzeilen angeben, und kompilieren Sie dann die neu Standard erstellten Quelldateien mithilfe der /MP Option.

Visual Studio-Projekteinstellungen

Das MSBuild-Tool

Visual Studio verwendet das MSBuild Tool (msbuild.exe) zum Erstellen von Lösungen und Projekten. Die /maxcpucount:number Befehlszeilenoption /m:numberdes MSBuild-Tools kann mehrere Projekte gleichzeitig erstellen. Und die /MP Compileroption kann mehrere Kompilierungseinheiten gleichzeitig erstellen. Wenn dies für Ihre Anwendung geeignet ist, verbessern Sie die Buildzeit Ihrer Lösung, indem Sie entweder oder beide verwenden und /maxcpucountbeides /MP verwenden.

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

Die Richtlinie zur Entscheidung, ob MSBuild oder /MP Technologie verwendet werden soll, lautet wie folgt:

  • Wenn es viele Projekte mit wenigen Dateien in jedem Projekt gibt, verwenden Sie das MSBuild-Tool 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 MSBuild und /MP. 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.

Siehe auch

#import-Direktive
MSBuild-Befehlszeilenreferenz
/Zf (Schnellere PDB-Generierung)