Wydaje się, że istnieją pewne kontrowersje co do tego, czy liczba zadań w make GNU ma być równa liczbie rdzeni, czy też można zoptymalizować czas kompilacji, dodając jedno dodatkowe zadanie, które można ustawić w kolejce, podczas gdy inne „działają” .
Czy lepiej jest użyć -j4
lub -j5
na systemie czterordzeniowy?
Czy widziałeś (lub zrobiłeś) jakieś testy porównawcze, które obsługują jedną lub drugą?
make `nproc`
do stworzenia skryptu niezależnego od procesora :)Odpowiedzi:
Powiedziałbym, że najlepszą rzeczą do zrobienia jest porównanie go samodzielnie w konkretnym środowisku i obciążeniu pracą. Wygląda na to, że istnieje zbyt wiele zmiennych (rozmiar / liczba plików źródłowych, dostępna pamięć, pamięć podręczna dysku, czy katalog źródłowy i nagłówki systemowe znajdują się na różnych dyskach itp.), Aby uzyskać jedną odpowiedź dla wszystkich.
Moje osobiste doświadczenie (na 2-rdzeniowym MacBooku Pro) jest takie, że -j2 jest znacznie szybsze niż -j1, ale poza tym (-j3, -j4 itd.) Nie ma mierzalnego przyspieszenia. Tak więc dla mojego środowiska „praca == liczba rdzeni” wydaje się być dobrą odpowiedzią. (YMMV)
źródło
Uruchomiłem projekt domowy na moim 4-rdzeniowym laptopie z technologią hyperthreading i zapisałem wyniki. Jest to projekt dość obciążający kompilator, ale zawiera na końcu test jednostkowy trwający 17,7 sekundy. Kompilacje nie są zbyt intensywne we / wy; jest bardzo dużo dostępnej pamięci, a jeśli nie, reszta jest na szybkim dysku SSD.
Podstawowe wyniki:
Domyślam się teraz: jeśli robisz coś innego na swoim komputerze, użyj liczby rdzeni. Jeśli nie, użyj liczby wątków. Przekroczenie tego nie przynosi żadnych korzyści. W pewnym momencie staną się ograniczone w pamięci i z tego powodu zapadną się, co znacznie spowolni kompilację. Wiersz „inf” został dodany znacznie później, co dało mi podejrzenie, że w 8+ zadaniach było jakieś dławienie termiczne. To pokazuje, że dla tego rozmiaru projektu nie obowiązuje żaden limit pamięci ani przepustowości. Jest to jednak mały projekt, biorąc pod uwagę 8 GB pamięci do wkompilowania.
źródło
Osobiście używam
make -j n
gdzie n to „liczba rdzeni” + 1.Nie mogę jednak podać naukowego wyjaśnienia: widziałem wiele osób korzystających z tych samych ustawień i jak dotąd dały mi całkiem niezłe wyniki.
W każdym razie musisz być ostrożny, ponieważ niektóre łańcuchy produkcji po prostu nie są zgodne z tą
--jobs
opcją i mogą prowadzić do nieoczekiwanych wyników. Jeśli doświadczasz dziwnych błędów zależności, po prostu spróbujmake
bez--jobs
.źródło
Ostatecznie będziesz musiał wykonać kilka testów porównawczych, aby określić najlepszą liczbę do użycia w swojej kompilacji, ale pamiętaj, że procesor nie jest jedynym zasobem, który ma znaczenie!
Jeśli masz kompilację, która w dużym stopniu opiera się na dysku, na przykład tworzenie wielu zadań w systemie wielordzeniowym może być w rzeczywistości wolniejsze , ponieważ dysk będzie musiał wykonać dodatkową pracę, przesuwając głowicę dysku w przód iw tył, aby obsłużyć wszystkie różne zadania (w zależności od wielu czynników, takich jak to, jak dobrze system operacyjny obsługuje pamięć podręczną dysku, natywna obsługa kolejkowania poleceń przez dysk itp.).
A potem mamy „prawdziwe” rdzenie w porównaniu z hiperwątkowością. Możesz lub nie skorzystać na spawnowaniu zadań dla każdego hiperwątku. Ponownie, będziesz musiał wykonać test porównawczy, aby się dowiedzieć.
Nie mogę powiedzieć, że specjalnie wypróbowałem #cores + 1 , ale w naszych systemach (Intel i7 940, 4 rdzenie hyperthreaded, dużo pamięci RAM i dyski VelociRaptor) i naszej kompilacji (kompilacja C ++ na dużą skalę, na przemian z procesorem i I / O bound) jest bardzo mała różnica między -j4 i -j8. (Może o 15% lepiej ... ale nigdzie nie jest nawet dwa razy tak dobre).
Jeśli wyjeżdżam na lunch, użyję -j8, ale jeśli chcę użyć mojego systemu do czegokolwiek innego podczas tworzenia, użyję niższej liczby. :)
źródło
-j 8
Właśnie dostałem procesor Athlon II X2 Regor z Foxconn M / B i 4 GB pamięci G-Skill.
Na końcu umieszczam moje „cat / proc / cpuinfo” i „free”, aby inni mogli zobaczyć moje specyfikacje. To dwurdzeniowy Athlon II x2 z 4 GB pamięci RAM.
Pobrałem źródło jądra następnego kroku (linux-3.2.46) do / archive4;
wyodrębniono (
tar -xjvf linux-3.2.46.tar.bz2
);cd do katalogu (
cd linux-3.2.46
);i skopiowałem domyślną konfigurację jądra przez (
cp /usr/src/linux/.config .
);używany
make oldconfig
do przygotowania konfiguracji jądra 3.2.46;następnie uruchomiono make z różnymi inkantacjami -jX.
Sprawdziłem czasy każdego uruchomienia, wydając polecenie make po czasie, np. „Time make -j2”. Pomiędzy każdym uruchomieniem 'rm -rf' drzewo linux-3.2.46 i wyodrębniłem je ponownie, skopiowałem domyślny /usr/src/linux/.config do katalogu, uruchomiłem make oldconfig i ponownie wykonałem test 'make -jX' .
zwykły „marka”:
jak wyżej, ale z make -j2
jak wyżej, ale z make -j3
jak wyżej, ale z make -j4
jak wyżej, ale z make -j8
„cat / proc / cpuinfo” daje:
„darmowe” plony:
źródło
make -j
robi w tym systemie? Make ma na celu sprawdzenie obciążenia i skalowanie liczby procesów na podstawie obciążenia.make -j
w ogóle nie ogranicza liczby zleceń. Jest to zwykle katastrofalne w przypadku projektów o średnim lub dużym rozmiarze, ponieważ szybko rozwidla się więcej zadań, niż może być obsługiwanych przez pamięć RAM. Opcja, którą musisz ograniczyć ze względu na obciążenie, to-l [load]
w połączeniu z-j
Obie się nie mylą. Aby być w zgodzie ze sobą i autorem kompilowanego oprogramowania (na samym poziomie oprogramowania obowiązują różne ograniczenia wielowątkowe / jednowątkowe), sugeruję użycie:
Uwagi:
nproc
to polecenie linux, które zwróci liczbę rdzeni / wątków (nowoczesny procesor) dostępnych w systemie. Umieszczenie go pod znacznikami `jak powyżej, przekaże numer do polecenia make.Dodatkowe informacje: Jak ktoś wspomniał, użycie wszystkich rdzeni / wątków do kompilacji oprogramowania może dosłownie zapchać komputer niemal do śmierci (brak odpowiedzi), a nawet może zająć więcej czasu niż użycie mniejszej liczby rdzeni. Jak widziałem, jeden użytkownik Slackware napisał tutaj, że ma dwurdzeniowy procesor, ale nadal zapewniał testy do j 8, które przestały być inne na j 2 (tylko 2 rdzenie sprzętowe, które CPU może wykorzystać). Aby uniknąć braku odpowiedzi, sugeruję uruchomienie go w następujący sposób:
Spowoduje to przekazanie wyniku
nproc
domake
i odjęcie 2 rdzeni od wyniku.źródło
Po prostu jako ref:
Z
Spawning Multiple Build Jobs
sekcji w LKD :źródło
Z mojego doświadczenia wynika, że przy dodawaniu dodatkowych miejsc pracy muszą istnieć pewne korzyści związane z wydajnością. Dzieje się tak po prostu dlatego, że dyskowe operacje we / wy są jedną z wąskich gardeł obok procesora. Jednak nie jest łatwo zdecydować o liczbie dodatkowych zadań, ponieważ jest to silnie powiązane z liczbą rdzeni i typami używanego dysku.
źródło
Wiele lat później większość z tych odpowiedzi jest wciąż poprawna. Jednak nastąpiła pewna zmiana: użycie większej liczby zadań niż rdzeni fizycznych daje teraz naprawdę znaczące przyspieszenie. Jako dodatek do tabeli Dascandy, oto moje czasy kompilacji projektu na AMD Ryzen 5 3600X w systemie Linux. (The Powder Toy, commit c6f653ac3cef03acfbc44e8f29f11e1b301f1ca2)
Zalecam sprawdzenie siebie, ale na podstawie opinii innych odkryłem, że używanie logicznej liczby rdzeni do liczenia zadań działa dobrze w Zen. Poza tym system nie wydaje się tracić czasu reakcji. Wyobrażam sobie, że dotyczy to również ostatnich procesorów Intela. Zwróć uwagę, że mam również dysk SSD, więc może warto samemu przetestować procesor.
Testy przeprowadzone na Ubuntu 19.10 z Ryzen 5 3600X, Samsung 860 Evo SSD (SATA) i 32 GB RAM
Uwaga końcowa: inne osoby z 3600X mogą mieć lepsze czasy niż ja. Podczas tego testu miałem włączony tryb Eco, zmniejszając nieco prędkość procesora.
źródło
TAK! Na moim 3950x uruchamiam -j32 i oszczędza to godziny kompilacji! Nadal mogę oglądać youtube, przeglądać internet itp. Podczas kompilacji bez żadnej różnicy. Procesor nie zawsze jest powiązany, nawet z 1 TB 970 PRO nvme lub 1 TB Auros Gen4 NVMe i 64 GB 3200C14. Nawet jeśli tak jest, nie zauważam, że interfejs użytkownika jest mądry. Planuję testować z -j48 w najbliższej przyszłości w niektórych dużych nadchodzących projektach. Spodziewam się, podobnie jak Ty, pewnej imponującej poprawy. Ci, którzy nadal mają czterordzeniowy procesor, mogą nie uzyskać takich samych korzyści ...
Sam Linus właśnie podwyższył poziom do 3970x i możesz postawić swojego dolnego dolara, on ma co najmniej -j64.
źródło