/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)