/MP (Kompilacja z wieloma procesami)

Opcja /MP może skrócić całkowity czas kompilowania plików źródłowych w wierszu polecenia. Opcja /MP powoduje, że kompilator tworzy co najmniej jedną kopię samego siebie w osobnym procesie. Następnie te wystąpienia jednocześnie skompiluj pliki źródłowe. W niektórych przypadkach całkowity czas kompilowania plików źródłowych można znacznie zmniejszyć.

Składnia

/MP[processMax]

Argumenty

processMax
(Opcjonalnie) Maksymalna liczba procesów, które może utworzyć kompilator.

Argument processMax musi należeć do zakresu od 1 do 65536. W przeciwnym razie kompilator generuje komunikat ostrzegawczy D9014, ignoruje processMax argument i zakłada, że maksymalna liczba procesów wynosi 1.

Jeśli pominiesz processMax argument, kompilator pobiera liczbę wydajnych procesorów na komputerze z systemu operacyjnego i tworzy proces dla każdego procesora.

Uwagi

Opcja kompilatora /MP może znacznie skrócić czas kompilacji podczas kompilowania wielu plików. Aby poprawić czas kompilacji, kompilator tworzy processMax kopie samego siebie, a następnie używa tych kopii do kompilowania plików źródłowych w tym samym czasie. Opcja /MP dotyczy kompilacji, ale nie do łączenia ani generowania kodu w czasie połączenia. Domyślnie opcja jest wyłączona /MP .

Poprawa czasu kompilacji zależy od liczby procesorów na komputerze, liczby plików do skompilowania i dostępności zasobów systemowych, takich jak pojemność we/wy. Poeksperymentuj z opcją /MP określenia najlepszego ustawienia do utworzenia określonego projektu. Aby uzyskać porady ułatwiające podjęcie tej decyzji, zobacz Wytyczne.

Niezgodne opcje i funkcje językowe

Opcja jest niezgodna /MP z niektórymi opcjami kompilatora i funkcjami językowymi. Jeśli używasz opcji niezgodnego kompilatora z opcją /MP , kompilator wyświetla ostrzeżenie D9030 i ignoruje /MP opcję. Jeśli używasz funkcji języka niezgodnego, błąd kompilatora występuje błąd C2813 , a następnie kończy się lub kontynuuje w zależności od bieżącej opcji poziomu ostrzeżenia kompilatora.

Uwaga

Większość opcji jest niezgodna, ponieważ jeśli są one dozwolone, współbieżnie wykonując kompilatory będą zapisywać dane wyjściowe w tym samym czasie w konsoli lub w określonym pliku. W rezultacie dane wyjściowe przeplatałyby się i byłyby zwijone. W niektórych przypadkach kombinacja opcji pogorszyłaby wydajność.

W poniższej tabeli wymieniono opcje kompilatora i funkcje językowe, które są niezgodne z opcją /MP :

Opcja lub funkcja języka opis
#import preprocesor, dyrektywa Konwertuje typy w bibliotece typów na klasy C++, a następnie zapisuje te klasy w pliku nagłówkowym.
/E, /EP Kopiuje dane wyjściowe preprocesora do standardowych danych wyjściowych (stdout).
/Gm Przestarzałe. Umożliwia przyrostową ponowną kompilację.
/showIncludes Zapisuje listę plików dołączanych do standardowego błędu (stderr).
/Yc Zapisuje wstępnie skompilowany plik nagłówka.

Komunikaty diagnostyczne

Jeśli określisz opcję lub funkcję języka niezgodną z /MP opcją, zostanie wyświetlony komunikat diagnostyczny. W poniższej tabeli wymieniono komunikaty i zachowanie kompilatora:

Komunikat diagnostyczny opis Zachowanie kompilatora
C2813 Dyrektywa #import nie jest zgodna z opcją /MP . Kompilacja kończy się, chyba że opcja poziomu ostrzeżenia kompilatora określa inaczej.
D9014 Dla argumentu określono nieprawidłową processMax wartość. Kompilator ignoruje nieprawidłową wartość i przyjmuje wartość 1.
D9030 Określona opcja jest niezgodna z /MP. Kompilator ignoruje /MP opcję .

Wytyczne

Mierzenie wydajności

Użyj łącznego czasu kompilacji, aby zmierzyć wydajność. Czas kompilacji można zmierzyć za pomocą zegara fizycznego lub użyć oprogramowania, które oblicza różnicę między rozpoczęciem kompilacji a zatrzymaniem. Jeśli komputer ma wiele procesorów, zegar fizyczny może uzyskać dokładniejsze wyniki niż pomiar czasu oprogramowania.

Efektywne procesory

Komputer może mieć co najmniej jeden procesor wirtualny, który jest również znany jako efektywne procesory, dla każdego z procesorów fizycznych. Każdy procesor fizyczny może mieć co najmniej jeden rdzeń, a jeśli system operacyjny umożliwia hiperwątkowanie rdzenia, każdy rdzeń wydaje się być dwoma procesorami wirtualnymi.

Na przykład komputer ma jeden skuteczny procesor, jeśli ma jeden procesor fizyczny, który ma jeden rdzeń, a wielowątkowość jest wyłączona. Natomiast komputer ma osiem wydajnych procesorów, jeśli ma dwa procesory fizyczne, z których każdy ma dwa rdzenie, a wszystkie rdzenie mają włączoną funkcję hyperthreading. Oznacza to, (8 wydajnych procesorów) = (2 procesory fizyczne) x (2 rdzenie na procesor fizyczny) x (2 skuteczne procesory na rdzeń z powodu hiperwątku).

Jeśli pominiesz processMax argument w /MP opcji, kompilator uzyskuje liczbę wydajnych procesorów z systemu operacyjnego, a następnie tworzy jeden proces na efektywny procesor. Jednak kompilator nie może zagwarantować, który proces jest wykonywany na określonym procesorze; system operacyjny podejmuje decyzję.

Liczba procesów

Kompilator oblicza liczbę procesów, których będzie używać do kompilowania plików źródłowych. Ta wartość jest mniejsza niż liczba plików źródłowych, które określisz w wierszu polecenia, oraz liczbę procesów, które jawnie lub niejawnie określisz za pomocą /MP opcji . Możesz jawnie ustawić maksymalną liczbę procesów, jeśli podasz processMax argument /MP opcji. Możesz też użyć wartości domyślnej, która jest równa liczbie wydajnych procesorów na komputerze, jeśli pominięto processMax argument.

Załóżmy na przykład, że określisz następujący wiersz polecenia:

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

W tym przypadku kompilator używa pięciu procesów, ponieważ jest to mniej z pięciu plików źródłowych i maksymalnie siedem procesów. Alternatywnie załóżmy, że komputer ma dwa skuteczne procesory i określisz następujący wiersz polecenia:

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

W takim przypadku system operacyjny zgłasza dwa procesory, więc kompilator używa dwóch procesów w obliczeniach. W rezultacie kompilator używa dwóch procesów do wykonania kompilacji, ponieważ jest to mniej dwóch procesów i trzech plików źródłowych.

Pliki źródłowe i kolejność kompilacji

Pliki źródłowe mogą nie być kompilowane w tej samej kolejności, w jakiej są wyświetlane w wierszu polecenia. Mimo że kompilator tworzy zestaw procesów zawierających kopie kompilatora, system operacyjny planuje wykonanie każdego procesu. Opcja /MP nie może zagwarantować, że pliki źródłowe zostaną skompilowane w określonej kolejności.

Plik źródłowy jest kompilowany, gdy proces jest dostępny do skompilowania. Jeśli istnieje więcej plików niż procesy, pierwszy zestaw plików jest kompilowany przez dostępne procesy. Pozostałe pliki są przetwarzane po zakończeniu procesu obsługi poprzedniego pliku i jest dostępny do pracy nad jednym z pozostałych plików.

Nie należy wielokrotnie określać tego samego pliku źródłowego w wierszu polecenia. Na przykład może wystąpić wiele specyfikacji, jeśli narzędzie automatycznie tworzy plik make oparty na informacjach o zależnościach w projekcie. Jeśli nie określisz /MP opcji, kompilator przetwarza listę plików sekwencyjnie i ponownie kompiluje każde wystąpienie pliku. Jeśli jednak określisz /MP opcję, różne wystąpienia kompilatora mogą jednocześnie skompilować ten sam plik. Różne wystąpienia mogą próbować zapisywać w tym samym pliku wyjściowym w tym samym czasie. Jedno wystąpienie kompilatora uzyskuje wyłączny dostęp do zapisu do pliku wyjściowego i kończy się powodzeniem, a inne wystąpienia kompilatora kończą się niepowodzeniem z powodu błędu dostępu do pliku.

Korzystanie z bibliotek typów (#import)

Kompilator nie obsługuje użycia #import dyrektywy z przełącznikiem /MP . Jeśli to możliwe, wykonaj następujące kroki, aby obejść ten problem:

  • Przenieś wszystkie #import dyrektywy w różnych plikach źródłowych do co najmniej jednego pliku, a następnie skompiluj /MP te pliki bez opcji . Wynik jest zestawem wygenerowanych plików nagłówkowych.

  • W pozostałych plikach źródłowych wstaw #include dyrektywy określające wygenerowane nagłówki, a następnie skompiluj pozostałe pliki źródłowe przy użyciu /MP opcji .

Ustawienia projektu programu Visual Studio

Narzędzie MSBuild

Program Visual Studio używa MSBuild narzędzia (msbuild.exe) do tworzenia rozwiązań i projektów. Opcja /maxcpucount:number wiersza polecenia narzędzia MSBuild (lub /m:number) może jednocześnie kompilować wiele projektów. Opcja kompilatora /MP może jednocześnie kompilować wiele jednostek kompilacji. Jeśli jest to odpowiednie dla aplikacji, zwiększ czas kompilacji rozwiązania przy użyciu elementów lub i /MP/maxcpucount.

Czas kompilacji rozwiązania częściowo zależy od liczby procesów, które wykonują kompilację. Argument number/maxcpucount opcji MSBuild określa maksymalną liczbę projektów do skompilowania w tym samym czasie. processMax Podobnie argument /MP opcji kompilatora określa maksymalną liczbę jednostek kompilacji do kompilacji w tym samym czasie. /maxcpucount Jeśli opcja określa projekty P, a /MP opcja określa procesy C, maksymalna liczba procesów P x C jest wykonywana w tym samym czasie.

Wytyczne dotyczące decydowania o tym, czy należy używać programu MSBuild, czy /MP technologii, są następujące:

  • Jeśli w każdym projekcie istnieje wiele projektów z kilkoma plikami, użyj narzędzia MSBuild z opcją /maxcpucount .

  • Jeśli w każdym projekcie istnieje kilka projektów z wieloma plikami, użyj /MP opcji .

  • Jeśli liczba projektów i plików na projekt jest zrównoważona, użyj programu MSBuild i /MP. Początkowo ustaw /maxcpucount opcję na liczbę projektów do skompilowania i /MP opcję liczby procesorów na komputerze. Zmierz wydajność, a następnie dostosuj ustawienia, aby uzyskać najlepsze wyniki. Powtarzaj ten cykl, dopóki nie będziesz zadowolony z łącznego czasu kompilacji.

Zobacz też

#import Dyrektywy
Dokumentacja wiersza polecenia programu MSBuild
/Zf (Szybsze generowanie plików PDB)