/MP (Erstellen mit mehreren Prozessen)

Aktualisiert: November 2007

Die /MP-Option kann die Gesamtzeit für die Kompilierung der Quelldateien in der Befehlszeile reduzieren. Mit der /MP-Option wird der Compiler veranlasst, jeweils in einem getrennten Prozess eine oder mehrere Kopien von sich selbst zu erstellen. Diese Kopien kompilieren dann gleichzeitig die Quelldateien. Infolgedessen kann die Gesamtzeit für die Erstellung der Quelldateien bedeutend reduziert werden.

/MP[processMax]

Argumente

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

    Das processMax-Argument muss einen Wert im Bereich von 1 bis 65536 besitzen. Anderenfalls gibt der Compiler Warnmeldung D9014 aus, ignoriert das processMax-Argument und geht davon aus, dass die maximale Anzahl der Prozesse 1 beträgt.

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

Hinweise

Wenn Sie zahlreiche Dateien kompilieren, kann die /MP-Compileroption die Buildzeit beträchtlich reduzieren. Zur Verkürzung der Buildzeit erstellt der Compiler bis zu der mit dem Wert processMax angegebenen Anzahl 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 das Verknüpfen oder die Codegenerierung beim Verknüpfen. Standardmäßig ist die /MP-Option deaktiviert.

Die Verbesserung der Buildzeit hängt ab von der Anzahl der Prozessoren auf einem Computer, 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 bestimmen. Ratschläge, die Sie bei dieser Entscheidung unterstützen, finden Sie unter Richtlinien.

Nicht kompatible Optionen und Sprachfeatures

Die /MP-Option ist mit einigen Compileroptionen und Sprachfeatures nicht kompatibel. Wenn Sie eine nicht kompatible Compileroption mit der /MP-Option verwenden, gibt der Compiler Warnung D9030 aus und ignoriert die /MP-Option. Wenn Sie ein nicht kompatibles Sprachfeature verwenden, gibt der Compiler Fehler C2813 aus. Anschließend wird er dann je nach der aktuellen Option für die Warnstufe des Compilers beendet oder 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 der Konsole oder in eine bestimmte Datei schreiben. Als Ergebnis würde sich die Ausgabe vermischen und würde verstümmelt. In einigen Fällen würde die Kombination von Optionen die Leistung verschlechtern.

In der folgenden Tabelle werden Compileroptionen und Sprachfeatures aufgelistet, die mit der /MP-Option nicht kompatibel sind:

Option oder Sprachfeature

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 Präprozessorausgabe in die Standardausgabe (stdout).

/Gm

Ermöglicht eine inkrementelle erneute Erstellung.

/showIncludes

Schreibt eine Liste von Includedateien in den Standardfehler (stderr).

/Yc

Schreibt eine vorkompilierte Headerdatei.

Diagnosemeldungen

Wird eine mit der /MP-Option nicht kompatible Option bzw. ein nicht kompatibles Sprachfeature angegeben, erhalten Sie eine Diagnosemeldung. In der folgenden Tabelle werden die Meldungen und das Verhalten des Compilers aufgelistet:

Diagnosemeldung

Beschreibung

Compilerverhalten

C2813

Die #import-Direktive ist nicht kompatibel mit der /MP-Option.

Die Kompilierung endet, sofern nicht durch eine Option für die Warnstufe des Compilers etwas anderes angegeben wird.

D9014

Für das processMax-Argument wurde ein ungültiger Wert angegeben.

Der Compiler ignoriert den ungültigen Wert und geht vom Wert 1 aus.

D9030

Die angegebene Option ist mit /MP nicht kompatibel.

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 mit Software die Differenz zwischen Anfang und Ende des Builds berechnen. Wenn der Computer mehrere Prozessoren besitzt, führt eine physische Uhr möglicherweise zu genaueren Ergebnissen als eine Zeitmessung per Software.

Effektive Prozessoren

Ein Computer kann für jeden seiner physischen Prozessoren einen oder mehrere virtuelle Prozessoren besitzen, die auch als effektive Prozessoren bekannt sind. Jeder physische Prozessor kann einen oder mehrere Kerne besitzen, und wenn das Betriebssystem für einen Kern Hyperthreading ermöglicht, erscheint jeder Kern als zwei virtuelle Prozessoren.

Ein Computer besitzt z. B. 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 besitzt und für alle Kerne Hyperthreading aktiviert ist. Das heißt: (8 effektive Prozessoren) = (2 physische Prozessoren) x (2 Kerne pro physischem Prozessor) x (2 effektive Prozessoren pro Kern wegen Hyperthreading).

Wenn Sie das processMax-Argument in der /MP-Option nicht angeben, ruft der Compiler die Anzahl der effektiven Prozessoren vom Betriebssystem ab und erstellt dann für jeden effektiven Prozessor einen Prozess. Der Compiler kann jedoch nicht gewährleisten, dass Prozesse auf einem bestimmten Prozessor ausgeführt werden. Diese Entscheidung wird vom Betriebssystem getroffen.

Anzahl der Prozesse

Der Compiler berechnet die Anzahl der Prozesse, mit denen er die Quelldateien kompiliert. Der Wert ist der niedrigere der beiden folgenden Werte: der Anzahl der Quelldateien, die Sie in der Befehlszeile angeben, und der Anzahl der Prozesse, die Sie mit der /MP-Option explizit oder implizit angeben. Sie können die maximale Anzahl von Prozessen mit dem processMax-Argument der /MP-Option festlegen. Sie haben auch die Möglichkeit, das processMax-Argument nicht anzugeben und den Standard zu verwenden, der der Anzahl der effektiven Prozessoren in einem Computer entspricht.

Angenommen, Sie geben z. B. die folgende Befehlszeile an:

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

In diesem Fall verwendet der Compiler fünf Prozesse, da es sich bei fünf Quelldateien und maximal sieben Prozessen um den niedrigeren Wert handelt. Gehen Sie alternativ davon aus, dass der Computer zwei effektive Prozessoren hat und Sie die folgende Befehlszeile angeben:

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

In diesem Fall meldet das Betriebssystem zwei Prozessoren. Daher verwendet der Compiler zwei Prozesse in seiner Berechnung. Als Ergebnis führt der Compiler den Build mit zwei Prozessen aus, da es sich bei zwei Prozessen und drei Quelldateien um den niedrigeren Wert handelt.

Quelldateien und Buildreihenfolge

Die Quelldateien werden möglicherweise nicht in der gleichen Reihenfolge kompiliert, in der sie in der Befehlszeile angezeigt werden. Auch wenn der Compiler einen Satz mit Prozessen erstellt, die Kopien des Compilers enthalten, plant das Betriebssystem die Ausführungszeiten für die einzelnen Prozesse. Infolgedessen können Sie 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 es mehr Dateien als Prozesse gibt, wird der erste Dateisatz von den verfügbaren Prozessen kompiliert. Die restlichen Dateien werden verarbeitet, wenn ein Prozess die Behandlung einer vorherigen Datei abgeschlossen hat und für die Bearbeitung einer der restlichen Dateien verfügbar ist.

Geben Sie nicht mehrmals die gleiche Quelldatei in einer Befehlszeile an. Dies könnte z. B. eintreten, 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 eine Datei mit jedem Vorkommen erneut. Wenn Sie aber die /MP-Option angeben, wird dieselbe Datei von verschiedenen Compilern möglicherweise zur gleichen Zeit kompiliert. Infolgedessen versuchen die verschiedenen Compiler, zur gleichen Zeit in die gleiche Ausgabedatei zu schreiben. Ein Compiler erhält exklusiven Schreibzugriff für die Ausgabedatei und kann den Vorgang erfolgreich abschließen. Die anderen Compiler sind nicht erfolgreich und geben einen Dateizugriffsfehler aus.

Verwenden von Typbibliotheken (#import)

Der Compiler unterstützt nicht die Verwendung der #import-Direktive mit dem /MP-Schalter. Führen Sie nach Möglichkeit die folgenden Schritten aus, um dieses Problem zu umgehen:

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

  • Fügen Sie in den restlichen Quelldateien #include-Direktiven ein, die die generierten Header angeben, und kompilieren Sie dann die restlichen Quelldateien mit der /MP-Option.

Visual Studio-Projekteinstellungen

Das Tool VCBUILD.exe

Visual Studio verwendet das Tool VCBUILD.exe, um Projektmappen und Projekte zu erstellen. Das Tool VCBUILD.exe kann Projekte gleichzeitig erstellen, und die Compileroption /MP kann Kompilierungseinheiten gleichzeitig erstellen. Wenn es für Ihre Anwendung angebracht ist, verkürzen Sie die Buildzeit Ihrer Projektmappe dadurch, dass Sie /MP oder VCBuild oder beide verwenden.

Die Buildzeit der Projektmappe hängt teilweise von der Anzahl der Prozesse ab, die den Build ausführen. Die /M-Option des Tools VCBUILD.exe gibt die maximale Anzahl von Projekten an, die gleichzeitig erstellt werden können. Entsprechend gibt das processMax-Argument der /MP-Option die maximale Anzahl der Kompilierungseinheiten an, die gleichzeitig erstellt werden können. Wenn die /M-Option P Projekte und die /MP-Option C Prozesse angibt, werden maximal PxC Prozesse gleichzeitig ausgeführt.

Für die Entscheidung, ob die VCBuild-Technologie oder die /MP-Technologie zu verwenden ist, gilt folgende Richtlinie:

  • Wenn es viele Projekte mit wenigen Dateien in jedem Projekt gibt, verwenden Sie das Tool VCBuild.

  • Wenn es wenige Projekte mit vielen Dateien in jedem Projekt gibt, verwenden Sie die /MP-Option.

  • Wenn die Anzahl von Projekten und Dateien pro Projekt ausgeglichen ist, verwenden Sie sowohl VCBuild als auch /MP. Legen Sie zunächst die /M-Option auf die Anzahl der zu erstellenden Projekte fest, die /MP-Option auf die Anzahl der Prozessoren auf dem Computer. Messen Sie die Leistung, und passen Sie dann die Einstellungen an, um die besten Ergebnisse zu erzielen. Wiederholen Sie diesen Zyklus, bis Sie mit der Buildgesamtzeit zufrieden sind.

Die Compileroption /Gm

Standardmäßig aktiviert ein Projektbuild die Compileroption /Gm (inkrementelle Builds) für Debugbuilds und deaktiviert sie für Releasebuilds. Daher ist die Compileroption /MP in Debugbuilds automatisch deaktiviert, weil sie zu einem Konflikt mit der Standardcompileroption /Gm führt.

Siehe auch

Referenz

The #import Directive

Weitere Ressourcen

VCBUILD-Verweis