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ą?

Author: Smi, 2010-03-23

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)

 47
Author: David Gelhar,
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.

 41
Author: dascandy,
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.

 26
Author: ereOn,
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. :)

 6
Author: ijprest,
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
 4
Author: sloMoses,
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

 2
Author: Nan Xiao,
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.

 1
Author: Matt,
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