7

Mam duży plik programu Visual Studio 2010 (.sln), który zawiera dużą liczbę projektów (~50). Każdy projekt składa się z około 20.cpp i .h plików. Budowa całego projektu zajmuje około 2 godzin na szybkim komputerze z procesorem Intel i7, a wszystkie zależności są buforowane lokalnie na szybkim dysku SSD.MSBuild - Jak zbudować wiele plików I projektów równolegle

Ja próbuje replicate an existing experiment I found on this topic i potrzebują wyjaśnienia, w jaki sposób:

  1. Pobierz Zrównoleglanie szukam pracy w Visual Studio (z GUI/IDE).
  2. Te zmiany działają również ze zautomatyzowanymi wersjami wiersza polecenia za pośrednictwem MSBuild.exe.

Po pierwsze, czy opcje /m i /maxcpucount są takie same? Mam read an article on the /m option,, który wydaje się równolegle budować więcej projektów projektów. Wydaje się, że taką samą opcję I ustawić za pomocą następujących działań w GUI:

  • Narzędzia
    • opcje
    • projekty i rozwiązania
    • zbudować i uruchomić
      • Maximum number of parallel project builds

Nie ma innej opcji, /MP, co mogę osiągnąć w GUI poprzez:

  • Projekty
    • Properties
    • Właściwości konfiguracyjne
    • C/C++
      • Ogólne
      • Multi-processor Compilation

Proszę, popraw mnie, jeśli się mylę, ale to sugeruje, że projekt będzie budował równolegle wiele plików .cpp, ale nie ma opcji określenia liczby, chyba że muszę ręcznie ustawić ją w polu tekstowym (np. : /MP 4 lub /MP4.

Wydaje się również, że aby działał /MP, należy wyłączyć minimalną odbudowę (np. Enabled Minimal Rebuild: No (/GM-)), a także nie działa ze wstępnie skompilowanymi nagłówkami. Pracowałem nad wstępnie skompilowanym zagadnieniem nagłówków, dzięki temu, że prekompilowane nagłówki były dedykowanym projektem, który najpierw buduje rozwiązanie, przed wszystkimi innymi projektami.

Na pytanie: W jaki sposób mogę zaimplementować te opcje dla równoległych kompilacji projektów w ramach rozwiązania, a plik równoległy (.cpp) buduje w ramach projektów, używając MSBuild za pomocą wiersza poleceń, i potwierdza, że ​​działają zgodnie z oczekiwaniami? Czy moje założenia powyżej również są prawidłowe? Moim końcowym celem jest przetestowanie budowania projektu aż do całkowitej liczby rdzeni będących w użyciu, lub nawet przeładowanie go, jeśli mój proces budowania jest związany z I/O, a nie z procesorem. mogę to zrobić dość łatwo w Linuksie poprzez:

NUMCPUS=`grep -c '^processor' /proc/cpuinfo` 
NUMJOBS="$(echo "$NUMCPUS*1.5" | bc)" 
NUMJOBS="$(printf '%.0f' $NUMJOBS)" 
alias pmake='time nice make -j$NUMJOBS' 

Pozwala mi to na moim 8-rdzeniowego komputera kolejce 12 Zadania kompilacji na raz, a make automatycznie buduje do 12 .cpp plików równolegle, obsługa niejawnych reguł kompilacji/zależności itp. Próbuję osiągnąć to samo w Visual Studio Professional i MSBuild. Kiedy moje kompilacje są związane z I/O, to podejście było najlepsze w utrzymywaniu wszystkich rdzeni przy użyciu ~100%.

Dziękuję.

+1

* Proszę mnie poprawić jeśli się mylę na tym * od szybkiego spojrzenia na to, co się tutaj dzieje, masz rację.Dzięki tym opcjom zarówno VS, jak i msbuild, budują wiele projektów w tym samym czasie (w zależności od zależności) i spawnują wiele procesów kompilacji dla każdego z tych projektów. Zauważ również, że dziennik będzie zawierał liczby dla każdego projektu, ponieważ rzeczy się teraz przeplatały. Jeśli naprawdę zależy Ci na czasach kompilacji, będziesz musiał wypróbować kilka kombinacji i zobaczyć, który z nich działa najlepiej na twoim komputerze. – stijn

+0

@stijn Dziękuję. Czy możesz potwierdzić, że opcje '/ m' i'/MP' są różne, czy są takie same? Próbuję skonfigurować kompilacje, aby budować 4 projekty w jednym rozwiązaniu, a każdy projekt próbuje skompilować 4 pliki '.ppp'. Byłoby to 16 'ci.exe' budowane równolegle na maszynie 8-rdzeniowej, ale zakładam, że ze względu na charakter zadań związany z I/O, zwiększenie liczby zadań powinno pomóc w utrzymaniu większej liczby procesorów przy 100%. – DevNull

+2

Te opcje są bardzo różne -/MP jest dla kompilacji C++,/m dla msbuild. Pomyśl o tym w ten sposób: msbuild może również budować projekty C# lub niestandardowe projekty dowolnego języka./MP jest tylko dla C++, więc nawet jeśli nie używasz msbuild, ale cl.exe bezpośrednio, nadal działa. – stijn

Odpowiedz

6

/MP przełącznik dla kompilatora (cl.exe) i opcją /m dla msbuild.exe są rzeczywiście do zrobienia. Oto kilka istotnych documentation wyciągi:

opcja

Przełącznik/MP powoduje kompilator, aby utworzyć jedną lub więcej kopii się, każdy w oddzielnym procesie. Następnie te kopie jednocześnie kompilują pliki źródłowe. Opcjonalny argument: Maksymalna liczba procesów, które kompilator może utworzyć. Jeśli pominięto argument processMax , kompilator pobiera liczbę efektywnych procesorów na komputerze z systemu operacyjnego i tworzy proces dla każdego procesora o wartości . Opcja/MP jest niekompatybilna z niektórymi opcjami kompilatora i funkcjami językowymi. W przypadku korzystania z opcji kompilatora niezgodnej z opcją/MP, kwestie ostrzeżenie kompilatora D9030 i ignoruje opcję/MP

Przykłady przypuszczać podać następujące polecenie:

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 mniejszy z pięciu plików źródłowych i maksymalnie siedmiu procesów. Alternatywnie, załóżmy, komputer ma dwa procesory i skutecznych podać następujące polecenie:

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

W tym przypadku system operacyjny zgłasza dwa procesory; dlatego, kompilator wykorzystuje do swoich obliczeń dwa procesy. W rezultacie kompilator wykona kompilację z dwoma procesami, ponieważ jest to mniejszy z dwóch procesów i trzech plików źródłowych.

Tak jak zauważyłeś, chodziło tylko o kompilator i nie było jeszcze mowy o msbuild, ponieważ kompilator jest samodzielnym narzędziem. Innymi słowy: załóżmy, że otwierasz 2 okna poleceń i w obu przypadkach wywołaj polecenie takie jak cl /MP3 a.cpp b.cpp c.cpp w tym samym czasie, będziesz miał 6 procesów kompilatora działających w tym samym czasie. Do czego dążysz i jakie jest też to, co może zrobić msbuild.

Wyjście z wywoływania msbuild /?:

/maxcpucount [n] określa maksymalną liczbę jednoczesnych procesów budować z. Jeśli przełącznik nie jest używany, domyślną wartością jest 1. Jeśli przełącznik zostanie użyty bez wartości MSBuild użyje maksymalnie liczby procesorów na komputerze w liczbie . (Skrócone:/M [n])

także bardziej odpowiednie informacje here, a zwłaszcza części, w której mówi

BuildInParallel logiczna jest opcjonalny parametr na zadaniu MSBuild. Gdy parametr BuildInParallel ma wartość true (jest to wartość domyślna), generowanych jest wiele procesów roboczych , aby zbudować tyle projektów w tym samym czasie, jak to możliwe, w tym samym . Aby to działało poprawnie, przełącznik/maxcpucount musi być ustawiony na wartość większą niż 1, a system musi być co najmniej dwurdzeniowy lub mieć dwa lub więcej procesorów.

Teraz, jeśli chcesz po prostu zadzwoń msbuild /m my.vcxproj na typowym projekcie nie będzie to nic specjalnego robić, ponieważ jest tylko jeden projekt budowy. Jednak jeżeli wewnątrz pliku msbuild istnieje wezwanie do zadania msbuild jak

<MsBuild Projects="@(ListOfProjects)" BuildInParallel="True"/> 

i M opcja/przechodzi do MSBuild następnie msbuild będzie tarło wielu innych procesów msbuild za zasadami określonymi powyżej. I przypadkowo dokładnie tak się dzieje podczas budowania rozwiązania z msbuild. Msbuild najpierw converts the solution do faktycznego pliku msbuild, który wywołuje zadanie MsBuild z listą projektów w rozwiązaniu. Jako takie projekty wielokrotne mogą być budowane równolegle i dla wielu procesów msbuild są tworzone. Z kolei jeśli są to projekty w C++ z ustawionym opcją/MP, każdy z tych projektów utworzy wiele procesów kompilacyjnych, dających maksymalnie równoległe kompilacje w postaci <max num cl processes> * <max num msbuild instances>. To zależy od twojej maszyny budującej, co jest optymalne, jeśli chcesz, możesz grać z opcjami (aby to zrobić skutecznie, każdy z twoich projektów zaimportowałby wspólny arkusz właściwości, w którym ustawisz opcję/MP, gdybyś musiał edytować wszystkie z nich osobno) i spójrz na raporty msbuild z czasu, kiedy kompilacja jest wykonywana. Zawsze zostawiam argumenty dla/m i/MP jako domyślne, ponieważ nie chcę, aby inni developerzy korzystali z moich projektów, aby mieć możliwe nieoptymalne konfiguracje, i ponieważ łatwo maksymalizują procesor.

+0

Piękny. Dzięki! – DevNull

2

Można to osiągnąć w wierszu poleceń poprzez wywołanie:

MSBuild /m:PARALLEL_PROJECT_COUNT /p:CL_MPCount=PARALLEL_FILE_COUNT 

Liczbę wynikających procesów będzie:

MSBuild = PARALLEL_PROJECT_COUNT Cl = PARALLEL_PROJECT_COUNT * PARALLEL_FILE_COUNT

Powiązane problemy