/MP
(Sestavení s více procesy)
Tato /MP
možnost může zkrátit celkovou dobu kompilace zdrojových souborů na příkazovém řádku. Tato /MP
možnost způsobí, že kompilátor vytvoří jednu nebo více kopií sebe sama, z nichž každý bude v samostatném procesu. Tyto instance pak současně kompilují zdrojové soubory. V některých případech se celková doba sestavení zdrojových souborů může výrazně snížit.
Syntaxe
/MP
[processMax
]
Argumenty
processMax
(Volitelné) Maximální počet procesů, které může kompilátor vytvořit.
Argument processMax
musí být v rozsahu od 1 do 65536. V opačném případě kompilátor vydá zprávu s upozorněním D9014, ignoruje processMax
argument a předpokládá, že maximální počet procesů je 1.
Pokud argument vynecháte processMax
, kompilátor načte počet efektivních procesorů v počítači z operačního systému a vytvoří proces pro každý procesor.
Poznámky
Možnost kompilátoru /MP
může výrazně zkrátit dobu sestavení při kompilaci mnoha souborů. Aby se zkrátil čas sestavení, kompilátor vytvoří až processMax
kopie samotného souboru a pak tyto kopie použije ke kompilaci zdrojových souborů současně. Tato /MP
možnost se vztahuje na kompilace, ale ne na generování kódu v době propojení nebo propojení. Ve výchozím nastavení /MP
je tato možnost vypnutá.
Zlepšení doby sestavení závisí na počtu procesorů na počítači, počtu souborů ke kompilaci a dostupnosti systémových prostředků, jako je kapacita vstupně-výstupních operací. Experimentujte s /MP
možností určit nejlepší nastavení pro sestavení konkrétního projektu. Rady, které vám pomůžou s rozhodováním, najdete v tématu Pokyny.
Nekompatibilní možnosti a jazykové funkce
Tato /MP
možnost není kompatibilní s některými možnostmi kompilátoru a jazykovými funkcemi. Pokud použijete nekompatibilní možnost kompilátoru /MP
s možností, kompilátor vydá upozornění D9030 a tuto možnost ignoruje /MP
. Pokud používáte nekompatibilní jazykovou funkci, kompilátor vydá chybu C2813 , skončí nebo pokračuje v závislosti na aktuální možnosti úrovně upozornění kompilátoru.
Poznámka:
Většina možností je nekompatibilní, protože pokud by byly povoleny, zapisují souběžně spouštěné kompilátory výstup do konzoly nebo do konkrétního souboru. Výsledkem je, že výstup bude intermixovaný a zkomolený. V některých případech by kombinace možností zhoršovala výkon.
Následující tabulka uvádí možnosti kompilátoru a jazykové funkce, které nejsou kompatibilní s /MP
možností:
Funkce možnosti nebo jazyka | Popis |
---|---|
#import Direktiva preprocesoru |
Převede typy v knihovně typů na třídy jazyka C++ a potom tyto třídy zapíše do souboru hlaviček. |
/E , /EP |
Zkopíruje výstup preprocesoru do standardního výstupu (stdout ). |
/Gm |
Zastaralé Povolí přírůstkové opětovné sestavení. |
/showIncludes |
Zapíše seznam souborů zahrnutí do standardní chyby (stderr ). |
/Yc |
Zapíše předkompilovaný soubor hlaviček. |
Diagnostické zprávy
Pokud zadáte možnost nebo jazykovou funkci, která není kompatibilní s /MP
možností, zobrazí se diagnostická zpráva. Následující tabulka uvádí zprávy a chování kompilátoru:
Diagnostická zpráva | Popis | Chování kompilátoru |
---|---|---|
C2813 | Direktiva #import není kompatibilní s /MP možností. |
Kompilace skončí, pokud možnost úrovně upozornění kompilátoru neurčuje jinak. |
D9014 | Pro argument je zadána processMax neplatná hodnota. |
Kompilátor ignoruje neplatnou hodnotu a předpokládá hodnotu 1. |
D9030 | Zadaná možnost není kompatibilní s /MP . |
Kompilátor tuto možnost ignoruje /MP . |
Pokyny
Měření výkonu
K měření výkonu použijte celkovou dobu sestavení. Čas sestavení můžete měřit pomocí fyzických hodin nebo můžete použít software, který vypočítá rozdíl mezi spuštěním a zastavením sestavení. Pokud má váš počítač více procesorů, může fyzické hodiny přinést přesnější výsledky než měření času softwaru.
Efektivní procesory
Počítač může mít jeden nebo více virtuálních procesorů, které se označují také jako efektivní procesory pro každý z jeho fyzických procesorů. Každý fyzický procesor může mít jedno nebo více jader a pokud operační systém umožňuje hyperthreading pro jádro, zdá se, že každé jádro je dva virtuální procesory.
Například počítač má jeden efektivní procesor, pokud má jeden fyzický procesor, který má jedno jádro, a hyperthreading je zakázán. Naproti tomu počítač má osm efektivních procesorů, pokud má dva fyzické procesory, z nichž každá má dvě jádra a všechna jádra mají povolené hyperthreading. To znamená, že (8 efektivních procesorů) = (2 fyzické procesory) x (2 jádra na fyzický procesor) x (2 efektivní procesory na jádro kvůli hyperthreadingu).
Pokud argument v /MP
této možnosti vynecháteprocessMax
, kompilátor získá z operačního systému počet efektivních procesorů a pak vytvoří jeden proces pro efektivní procesor. Kompilátor však nemůže zaručit, který proces se provádí na konkrétním procesoru; operační systém toto rozhodnutí provede.
Počet procesů
Kompilátor vypočítá počet procesů, které použije ke kompilaci zdrojových souborů. Tato hodnota je menší než počet zdrojových souborů, které zadáte na příkazovém řádku, a počet procesů, které explicitně nebo implicitně určíte s /MP
možností. Pokud zadáte processMax
argument /MP
možnosti, můžete explicitně nastavit maximální počet procesů. Nebo můžete použít výchozí hodnotu, která se rovná počtu efektivních procesorů v počítači, pokud argument vynecháte processMax
.
Předpokládejme například, že zadáte následující příkazový řádek:
cl /MP7 a.cpp b.cpp c.cpp d.cpp e.cpp
V tomto případě kompilátor používá pět procesů, protože je to méně než pět zdrojových souborů a maximálně sedm procesů. Případně předpokládejme, že váš počítač má dva efektivní procesory a zadáte následující příkazový řádek:
cl /MP a.cpp b.cpp c.cpp
V tomto případě operační systém hlásí dva procesory, takže kompilátor při výpočtu používá dva procesy. Kompilátor proto ke spuštění sestavení používá dva procesy, protože je to menší ze dvou procesů a tří zdrojových souborů.
Zdrojové soubory a pořadí sestavení
Zdrojové soubory nemusí být kompilovány ve stejném pořadí, v jakém se zobrazují na příkazovém řádku. Přestože kompilátor vytvoří sadu procesů, které obsahují kopie kompilátoru, plánuje operační systém při každém spuštění procesu. Možnost /MP
nezaručuje, že se zdrojové soubory zkompilují v určitém pořadí.
Zdrojový soubor je zkompilován, když je proces k dispozici ke kompilaci. Pokud existuje více souborů než procesů, první sada souborů je zkompilována dostupnými procesy. Zbývající soubory se zpracovávají, když proces dokončí zpracování předchozího souboru a je k dispozici pro práci na jednom ze zbývajících souborů.
Na příkazovém řádku nezadávejte stejný zdrojový soubor několikrát. K více specifikacím může dojít například v případě, že nástroj automaticky vytvoří soubor pravidel založený na informacích o závislostech v projektu. Pokud tuto možnost nezadáte /MP
, kompilátor zpracuje seznam souborů postupně a rekompiluje každý výskyt souboru. Pokud však zadáte /MP
možnost, mohou různé instance kompilátoru zkompilovat stejný soubor současně. Různé instance se mohou pokusit zapisovat do stejného výstupního souboru ve stejnou dobu. Jedna instance kompilátoru získá výhradní přístup k zápisu do výstupního souboru a úspěšně proběhne úspěšně a ostatní instance kompilátoru selžou s chybou přístupu k souboru.
Použití knihoven typů (#import
)
Kompilátor nepodporuje použití direktivy #import
s přepínačem /MP
. Pokud je to možné, při řešení tohoto problému postupujte takto:
Přesuňte všechny direktivy
#import
v různých zdrojových souborech do jednoho nebo více souborů a pak tyto soubory zkompilujte bez/MP
možnosti. Výsledkem je sada vygenerovaných souborů hlaviček.Ve zbývajících zdrojových souborech vložte
#include
direktivy, které určují vygenerované hlavičky, a potom zkompilujte zbývající zdrojové soubory pomocí/MP
této možnosti.
Nastavení projektu sady Visual Studio
Nástroj MSBuild
Visual Studio nástroj (msbuild.exe
) používá MSBuild
k sestavování řešení a projektů. Možnost /maxcpucount:number
příkazového řádku (nebo /m:number
) nástroje MSBuild může současně sestavovat více projektů. A možnost kompilátoru /MP
může současně sestavit více jednotek kompilace. Pokud je to vhodné pro vaši aplikaci, vylepšete dobu sestavení vašeho řešení pomocí obou nebo obou/MP
./maxcpucount
Čas sestavení řešení částečně závisí na počtu procesů, které sestavení provádějí. Argument number
/maxcpucount
možnosti MSBuild určuje maximální počet projektů, které se mají sestavit současně. processMax
Podobně argument možnosti kompilátoru /MP
určuje maximální počet jednotek kompilace, které se mají sestavit současně. Pokud možnost /maxcpucount
určuje projekty P a možnost určuje procesy jazyka /MP
C, provede se současně maximální počet procesů P x C.
Pokyny pro rozhodování, zda použít NÁSTROJ MSBuild nebo /MP
technologie, jsou následující:
Pokud je v každém projektu mnoho projektů s několika soubory, použijte nástroj MSBuild s
/maxcpucount
možností.Pokud v každém projektu existuje několik projektů s mnoha soubory, použijte tuto
/MP
možnost.Pokud je počet projektů a souborů na jeden projekt vyvážen, použijte MSBuild i
/MP
. Zpočátku nastavte/maxcpucount
možnost na počet projektů, které se mají sestavit, a/MP
možnost na počet procesorů v počítači. Změřte výkon a pak upravte nastavení tak, aby přineslo nejlepší výsledky. Tento cyklus opakujte, dokud nebudete spokojeni s celkovým časem sestavení.
Viz také
#import
směrnice
Referenční dokumentace příkazového řádku nástroje MSBuild
/Zf
(Rychlejší generování PDB)