Kiedy (ponownie) buduję duże systemy na komputerze stacjonarnym / laptopie, mówię, make
aby użyć więcej niż jednego wątku, aby przyspieszyć kompilację:
$ make -j$[ $K * $C ]
Gdzie $C
ma wskazać liczbę rdzeni (które możemy założyć, aby być liczbą z jednej cyfry) maszyna ma, natomiast $K
jest czymś różnić od 2
celu 4
, w zależności od mojego nastroju.
Na przykład mogę powiedzieć make -j12
, że jeśli mam 4 rdzenie, wskazuję make
na użycie do 12 wątków.
Moje uzasadnienie jest takie, że jeśli używam tylko $C
wątków, rdzenie będą bezczynne, podczas gdy procesy będą zajęte pobieraniem danych z dysków. Ale jeśli nie ograniczę liczby wątków (tj. make -j
) Ryzykuję marnowanie czasu na przełączanie kontekstów, zabraknie pamięci lub gorzej . Załóżmy, że maszyna ma $M
gigantyczną pamięć (gdzie $M
jest rzędu 10).
Zastanawiałem się więc, czy istnieje ustalona strategia wyboru najbardziej wydajnej liczby wątków do uruchomienia.
źródło
Odpowiedzi:
Przeprowadziłem serię testów, budując lvvm (w trybie Debug + Asserts) na maszynie z dwoma rdzeniami i 8 GB pamięci RAM:
Co dziwne, wydaje się, że wspina się do 10, a następnie nagle spada poniżej czasu potrzebnego do zbudowania z dwoma zadaniami (jedno zadanie zajmuje podwójny czas, nieuwzględnione na wykresie).
W
7*$cores
tym przypadku wydaje się, że minimum .źródło
Używam Gentoo Linux (dystrybucja oparta na źródłach) i z własnego doświadczenia mogę powiedzieć, że (z mniej lub bardziej nowoczesnym sprzętem)
n*2 + x
jest najlepszą wartością. Pozwól mi wyjaśnić to:n*2
: Nawet wolniejsze procesory mają wystarczającą moc, aby wykonywać 2 zadania jednocześnie. większość zadań kompilacji jest wykonywana bardzo szybko.+x
liczba ta zależy od systemu (głównie pamięci i dysku). Jeśli masz wystarczającą ilość pamięci RAM i szybki dysk, ustawx=n
. Zależy to jednak od kodu źródłowego (Open Office, patrzę na Ciebie!) I używanego języka (kompilacja C / C ++ wymaga dużej ilości pamięci).Musisz jednak przeprowadzić kilka testów z pewnymi
-j
wartościami, aby uzyskać najlepszą liczbę. Spróbuj także zrównoleglić inne etapy procesu kompilacji: rozpakowywanie, uruchamianieconfigure
i tak dalej.źródło