GNU make: czy liczba zadań powinna być równa liczbie rdzeni procesora w systemie?
Wydaje siÄ ™ byÄ ‡ pewne kontrowersje dotyczÄ ... ce tego, czy liczba jobăłw w GNU make 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 "pracujÄ...".
Czy lepiej używać -j4
Czy -j5
na systemie czterordzeniowym?
Czy widziałeś (lub zrobiłeś) jakiś benchmarking, który obsługuje jedną lub drugą?
7 answers
Powiedziałbym, że najlepszą rzeczą do zrobienia jest porównanie go z konkretnym środowiskiem i obciążeniem. Wydaje się, że jest zbyt wiele zmiennych (Rozmiar/liczba plików źródłowych, dostępna pamięć, buforowanie dysku, czy katalog źródłowy i nagłówki systemowe znajdują się na różnych dyskach, itp.) za uniwersalną odpowiedź.
Moje osobiste doświadczenie (na 2-rdzeniowym MacBooku Pro) jest takie, że-j2 jest znacznie szybszy niż-j1, ale poza tym (- j3, - j4 itp.) nie ma wymiernego przyspieszenia. Więc dla mojego środowiska" praca == liczba rdzeni " wydaje się być dobrą odpowiedzią. (YMMV)
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-03-23 11:53:47
Uruchomiłem mój projekt domu na moim 4-rdzeniowym laptopie hyperthreading i nagrałem wyniki. Jest to dość ciężki projekt kompilatora, ale zawiera test jednostkowy 17,7 sekundy na końcu. Kompilacje nie są zbyt intensywne; dostępnych jest bardzo dużo pamięci, a jeśli nie, reszta znajduje się na szybkim dysku SSD.
1 job real 2m27.929s user 2m11.352s sys 0m11.964s
2 jobs real 1m22.901s user 2m13.800s sys 0m9.532s
3 jobs real 1m6.434s user 2m29.024s sys 0m10.532s
4 jobs real 0m59.847s user 2m50.336s sys 0m12.656s
5 jobs real 0m58.657s user 3m24.384s sys 0m14.112s
6 jobs real 0m57.100s user 3m51.776s sys 0m16.128s
7 jobs real 0m56.304s user 4m15.500s sys 0m16.992s
8 jobs real 0m53.513s user 4m38.456s sys 0m17.724s
9 jobs real 0m53.371s user 4m37.344s sys 0m17.676s
10 jobs real 0m53.350s user 4m37.384s sys 0m17.752s
11 jobs real 0m53.834s user 4m43.644s sys 0m18.568s
12 jobs real 0m52.187s user 4m32.400s sys 0m17.476s
13 jobs real 0m53.834s user 4m40.900s sys 0m17.660s
14 jobs real 0m53.901s user 4m37.076s sys 0m17.408s
15 jobs real 0m55.975s user 4m43.588s sys 0m18.504s
16 jobs real 0m53.764s user 4m40.856s sys 0m18.244s
inf jobs real 0m51.812s user 4m21.200s sys 0m16.812s
Podstawowe wyniki:
- skalowanie do liczby rdzeni zwiększa wydajność niemal liniowo. Czas rzeczywisty spadł z 2,5 minuty do 1,0 minuty (2,5 x tak szybko), jednak czas potrzebny podczas kompilacji wzrósł z 2,11 do 2,50 minuty. System nie zauważył w tym bitu żadnego dodatkowego obciążenia.
- skalowanie od liczby rdzeni do liczby wątków znacznie zwiększyło obciążenie użytkownika, z 2,50 minuty do 4,38 minuty. To prawie podwojenie jest najprawdopodobniej spowodowane tym, że inne instancje kompilatora chciały używać tych samych zasobów procesora w tym samym czasie. System jest coraz bardziej obciążony żądaniami i przełączaniem zadań, powodując, że przechodzi do 17,7 sekundy czasu używany. Przewaga wynosi około 6,5 sekundy w czasie kompilacji 53,5 sekundy, co daje 12% speedup.
- skalowanie z liczby wątków do liczby wątków podwójnych nie dało znaczącego przyspieszenia. Czasy na 12 i 15 są najprawdopodobniej anomaliami statystycznymi, które można pominąć. Całkowity czas, jaki zajmuje, wzrasta nieznacznie, podobnie jak czas systemowy. Oba są najprawdopodobniej spowodowane zwiększonym przełączaniem zadań. Nie ma z tego żadnej korzyści.
Moim zdaniem teraz: jeśli zrobisz coś innego na komputer, użyj liczby rdzeni. Jeśli nie, użyj liczby wątków. Przekroczenie jej nie przynosi żadnych korzyści. W pewnym momencie staną się one ograniczone i zapadną się z tego powodu, co znacznie spowolni kompilację. Linia " inf " została dodana znacznie później, co dało mi podejrzenie, że było jakieś Dławienie termiczne dla zadań 8+. Pokazuje to, że dla tego rozmiaru projektu nie ma limitu pamięci ani przepustowości. Jest to jednak mały projekt, biorąc pod uwagę 8GB pamięci do kompilacji.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-09-17 15:01:08
Ja 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 używających tych samych ustawień i dały mi całkiem dobre wyniki do tej pory.
W każdym razie, musisz być ostrożny, ponieważ niektóre łańcuchy make-chains po prostu nie są kompatybilne z opcją --jobs
i mogą prowadzić do nieoczekiwanych rezultatów. Jeśli występują dziwne błędy zależności, po prostu spróbuj make
Bez --jobs
.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-05-20 19:17:56
Ostatecznie, będziesz musiał zrobić kilka benchmarków, aby określić najlepszą liczbę do wykorzystania dla Twojej kompilacji, ale pamiętaj, że procesor nie jest jedynym zasobem, który się liczy!
Jeśli masz kompilację, która w dużej mierze opiera się na dysku, to generowanie 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 obsługuje pamięć podręczną dysku, natywną obsługę kolejkowania poleceń przez dysk, itp.).
A potem masz" prawdziwe " rdzenie kontra hyper-threading. Możesz lub nie możesz skorzystać z zadań spawania dla każdego hyper-wątku. Ponownie, będziesz musiał benchmark, aby się dowiedzieć.
Nie mogę powiedzieć, że specjalnie próbowałem #rdzenie + 1 , ale na naszych systemach (Intel i7 940, 4 rdzenie hyperthreaded, dużo pamięci RAM i dyski VelociRaptor) i naszej kompilacji (wielkoskalowy C++, który jest na przemian związany z CPU i / o) jest bardzo mała różnica między-j4 i-j8. (Może o 15% lepiej... ale nawet dwa razy lepiej.)
Jeśli wyjeżdżam na lunch, użyję -j8, ale jeśli chcę używać mojego systemu do czegokolwiek innego podczas budowania, użyję niższej liczby. :)
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-03-23 19:12:14
Właśnie dostałem Athlona II X2 Regor proc Z Foxconnem M / B i 4GB pamięci G-Skill.
Umieściłem moje ' cat / proc / cpuinfo 'i' free ' na końcu tego, aby inni mogli zobaczyć moje specyfikacje. Jest to dwurdzeniowy Athlon II x2 z 4GB PAMIĘCI RAM.
uname -a on default slackware 14.0 kernel is 3.2.45.
Pobrałem następny krok źródło jądra (linux-3.2.46) do / archive4;
(tar -xjvf linux-3.2.46.tar.bz2
);
Cd ' D do katalogu (cd linux-3.2.46
);
I skopiował domyślną konfigurację jądra nad (cp /usr/src/linux/.config .
);
Używane make oldconfig
aby przygotować konfigurację jądra 3.2.46;
Następnie uruchomił make z różnymi zaklęciami-jX.
Testowałem timingi każdego biegu wydając make po poleceniu time, np., "time make-j2". Pomiędzy każdym uruchomieniem i' rm-rf ' drzewo linux-3.2.46 i ponownie go odtworzyć, skopiowane domyślne /usr/src / linux/.config do katalogu, uruchomił make oldconfig, a następnie ponownie przetestował mój 'make-jX'.
Zwykły "Marka":
real 51m47.510s
user 47m52.228s
sys 3m44.985s
bob@Moses:/archive4/linux-3.2.46$
Jak wyżej, ale z marką - j2
real 27m3.194s
user 48m5.135s
sys 3m39.431s
bob@Moses:/archive4/linux-3.2.46$
Jak wyżej ale z make-j3
real 27m30.203s
user 48m43.821s
sys 3m42.309s
bob@Moses:/archive4/linux-3.2.46$
Jak wyżej ale z make-j4
real 27m32.023s
user 49m18.328s
sys 3m43.765s
bob@Moses:/archive4/linux-3.2.46$
Jak wyżej ale z make-j8
real 28m28.112s
user 50m34.445s
sys 3m49.877s
bob@Moses:/archive4/linux-3.2.46$
'cat /proc/cpuinfo' daje:
bob@Moses:/archive4$ cat /proc/cpuinfo
processor : 0
vendor_id : AuthenticAMD
cpu family : 16
model : 6
model name : AMD Athlon(tm) II X2 270 Processor
stepping : 3
microcode : 0x10000c8
cpu MHz : 3399.957
cache size : 1024 KB
physical id : 0
siblings : 2
core id : 0
cpu cores : 2
apicid : 0
initial apicid : 0
fdiv_bug : no
hlt_bug : no
f00f_bug : no
coma_bug : no
fpu : yes
fpu_exception : yes
cpuid level : 5
wp : yes
flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmo
v pat pse36 clflush mmx fxsr sse sse2 ht syscall nx mmxext fxsr_opt pdpe1gb rd
tscp lm 3dnowext 3dnow constant_tsc nonstop_tsc extd_apicid pni monitor cx16 p
opcnt lahf_lm cmp_legacy svm extapic cr8_legacy abm sse4a misalignsse 3dnowpre
fetch osvw ibs skinit wdt npt lbrv svm_lock nrip_save
bogomips : 6799.91
clflush size : 64
cache_alignment : 64
address sizes : 48 bits physical, 48 bits virtual
power management: ts ttp tm stc 100mhzsteps hwpstate
processor : 1
vendor_id : AuthenticAMD
cpu family : 16
model : 6
model name : AMD Athlon(tm) II X2 270 Processor
stepping : 3
microcode : 0x10000c8
cpu MHz : 3399.957
cache size : 1024 KB
physical id : 0
siblings : 2
core id : 1
cpu cores : 2
apicid : 1
initial apicid : 1
fdiv_bug : no
hlt_bug : no
f00f_bug : no
coma_bug : no
fpu : yes
fpu_exception : yes
cpuid level : 5
wp : yes
flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmo
v pat pse36 clflush mmx fxsr sse sse2 ht syscall nx mmxext fxsr_opt pdpe1gb rd
tscp lm 3dnowext 3dnow constant_tsc nonstop_tsc extd_apicid pni monitor cx16 p
opcnt lahf_lm cmp_legacy svm extapic cr8_legacy abm sse4a misalignsse 3dnowpre
fetch osvw ibs skinit wdt npt lbrv svm_lock nrip_save
bogomips : 6799.94
clflush size : 64
cache_alignment : 64
address sizes : 48 bits physical, 48 bits virtual
power management: ts ttp tm stc 100mhzsteps hwpstate
' wolny ' daje:
bob@Moses:/archive4$ free
total used free shared buffers cached
Mem: 3991304 3834564 156740 0 519220 2515308
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-07-13 11:41:58
Tak jak ref:
Z Spawning Multiple Build Jobs
sekcji w LKD:
Gdzie n to liczba zadań do spawnowania. Zwyczajową praktyką jest wywoływanie jednego lub dwóch zadań na procesor. Na przykład na maszynie z podwójnym procesorem można wykonać
$ make j4
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-10-07 06:49:44
Z mojego doświadczenia wynika, że przy dodawaniu dodatkowych miejsc pracy muszą być pewne korzyści. Dzieje się tak po prostu dlatego, że wejście/wyjście dysku jest jednym z szyjek butelki oprócz procesora. Jednak nie jest łatwo zdecydować się na liczbę dodatkowych zadań, ponieważ jest to wysoce powiązane z liczbą rdzeni i typów używanych dysków.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-07-20 05:26:37