Ilu tworzy wątki do użycia?

11

Kiedy (ponownie) buduję duże systemy na komputerze stacjonarnym / laptopie, mówię, makeaby użyć więcej niż jednego wątku, aby przyspieszyć kompilację:

$ make -j$[ $K * $C ]

Gdzie $Cma wskazać liczbę rdzeni (które możemy założyć, aby być liczbą z jednej cyfry) maszyna ma, natomiast $Kjest czymś różnić od 2celu 4, w zależności od mojego nastroju.

Na przykład mogę powiedzieć make -j12, że jeśli mam 4 rdzenie, wskazuję makena użycie do 12 wątków.


Moje uzasadnienie jest takie, że jeśli używam tylko $Cwą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 $Mgigantyczną pamięć (gdzie $Mjest rzędu 10).

Zastanawiałem się więc, czy istnieje ustalona strategia wyboru najbardziej wydajnej liczby wątków do uruchomienia.

maska ​​bitowa
źródło
W wielu przypadkach poprawną odpowiedzią na liczbę wątków będzie liczba rdzeni. Ale jedynym sposobem, aby się upewnić, jest przeprowadzenie testów, zmieniając liczbę wątków, aż znajdziesz odpowiednie miejsce.
Robert Harvey
@RobertHarvey: Tak, prawdopodobnie pójdę i skompiluję skrypt powłoki z różnymi ustawieniami w ciągu nocy, ale pomyślałem, że zapytam, czy jest jakaś wiedza na ten temat.
maska ​​bitowa
4
wiele osób sugeruje również $ rdzeni + 1, więc 1 proces kompilatora czyta z dysku podczas 4 kompilacji. Ogólna sugestia jest trudna, zależy również od podstawy kodu (nadużycie szablonu C ++ vs. małe jednostki kompilacyjne z kilkoma funkcjami C), łańcucha kompilatora (prekompilowane nagłówki itp.) I struktury kompilacji (czy łączy tylko jedną wielką rzecz w koniec lub wiele mniejszych rzeczy pomiędzy)
John
1
Jeśli poważnie szukasz wydajności, sugeruję zastanowienie się nad konfiguracją dysku RAM lub inną metodą na złagodzenie twojego wejścia / wyjścia. Nie sądzę, aby wykorzystanie procesora było twoim ulubionym miejscem.
TMN
@TMN: Jak pomaga dysk RAM? Linux jest całkiem dobry w buforowaniu rzeczy (masz na myśli pliki nagłówkowe, prawda?), Nie wspominając o pamięci podręcznej napędu. Najpierw musiałbym załadować wszystko do shm, ręcznie lub przez zmianę skryptu kompilacji (co byłoby całkowitą przesadą).
maska ​​bitowa

Odpowiedzi:

15

Przeprowadziłem serię testów, budując lvvm (w trybie Debug + Asserts) na maszynie z dwoma rdzeniami i 8 GB pamięci RAM:

kompilowanie czasu llvm w zależności od liczby zadań

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*$corestym przypadku wydaje się, że minimum .

maska ​​bitowa
źródło
1
+1 za rzeczywiste testowanie i bez spekulacji.
Martin Wickman
3

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 + xjest 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.
  • +xliczba ta zależy od systemu (głównie pamięci i dysku). Jeśli masz wystarczającą ilość pamięci RAM i szybki dysk, ustaw x=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 -jwartościami, aby uzyskać najlepszą liczbę. Spróbuj także zrównoleglić inne etapy procesu kompilacji: rozpakowywanie, uruchamianie configurei tak dalej.

ercpe
źródło
Obecnie najbardziej interesuje mnie C ++, a moje dyski nie są najszybsze.
maska ​​bitowa
Następnie zacznij od n * 1.5 i zwiększaj ją, aż czasy kompilacji przestaną maleć (pamiętaj, aby wyczyścić pamięć podręczną dysku / pamięć podręczną kompilacji za każdym razem). Pomyśl także o użyciu ccache ( ccache.samba.org ) w celu przyspieszenia kompilacji.
ercpe