make-j4 lub-j8

Mam 4 procesory i kompiluję aplikację głodną procesorów, czytałem, że używanie make z przełącznikiem-j4 było zalecane dla OpenCV, czy powinienem raczej używać -j8 i jaka jest zaleta robienia dla wielu procesorów?

Author: Veger, 2013-03-08

4 answers

Jak mówisz flaga -j mówi make, że jest dozwolone odradzać podaną ilość 'wątków'. Idealnie każdy wątek jest wykonywany na własnym core / CPU, więc środowisko wielordzeniowe / CPU jest wykorzystywane w pełni.

make sam nie kompiluje plików źródłowych. Jest to wykonywane przez kompilator (gcc). Plik Makefile (wejście dla make) zawiera zestaw celów. Każdy cel ma zestaw zależności (od innych celów) i zasady budowania celu. make odczytuje plik(y) Makefile i zarządza wszystkimi celami, zależnościami i regułami budowania. Oprócz kompilacji plików źródłowych możesz użyć make do wykonania dowolnego zadania, które można opisać poleceniami powłoki.

Jeśli ustawisz zbyt dużą liczbę wątków, nie będzie możliwe zaplanowanie każdego wątku na własnym rdzeniu. Dodatkowe przełączniki harmonogramu (kontekstowe) są wymagane, aby umożliwić wykonanie wszystkich wątków. To dodatkowe wykorzystanie zasobów oczywiście skutkuje niższą wydajnością.

Istnieje wiele zasad, ale myślę, że najczęściej spotykane jest ustawienie całkowitej kwoty na <number of cores> + 1. Ideą jest to, że wszystkie rdzenie mają swój własny wątek i istnieje jeden dodatkowy wątek zarządzający, który obsługuje cele i który jest następny do zbudowania.

 52
Author: Veger,
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-03-08 08:04:41

Powyższe odpowiedzi są w większości poprawne. Szczegóły są jednak nieco mylące. Na przykład, nie ma potrzeby dodawania dodatkowego zadania dla "wątku zarządzającego" (Uwaga: make nie jest w rzeczywistości wielowątkowy). make nigdy nie liczy się jako zadanie do celów -j, więc, jak mówi Huygens powyżej, jeśli powiesz -j5 dostaniesz 5 zadań kompilacji uruchomionych, a nie 4 plus make.

Powód, dla którego większość ludzi używa [liczba rdzeni] + [niektóre wyściółki] nie ma nic wspólnego z make ani z tym, czego potrzebuje, ale raczej z naturą kompilatora. Kompilator jest tak naprawdę bardzo skomplikowanym narzędziem do tłumaczenia tekstu: czyta tekst w jednej formie i konwertuje go na" tekst " (binarny) w innej formie. Wiele z nich (zwłaszcza, że twój język staje się bardziej złożony, jak C++), wymaga dużo CPU. Ale wymaga to również dużej ilości operacji We/Wy dyskowych. operacje We/Wy dyskowe są powolne, więc podczas gdy jeden kompilator czeka na pewne dane z dysku, jądro rozkłada inne zadania do uruchomienia. Dlatego można z pożytkiem mieć więcej niż liczba rdzeni kompiluje uruchomionych w tym samym czasie.

Dokładnie to, jak duży możesz uzyskać -j, zanim zaczniesz widzieć malejące zyski (Twoje Kompilacje zaczynają się wolniej, w pewnym momencie, z większą liczbą -j), zależy całkowicie od Twojego sprzętu, rodzajów kompilacji, które robisz, itp. Jedynym sposobem na upewnienie się jest eksperymentowanie.

Jednak[liczba rdzeni]+[kilka] jest zazwyczaj dobrym przybliżeniem.

 79
Author: MadScientist,
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
2016-05-30 03:59:52

Opcja -j jest używana tylko do przyspieszenia kompilacji aplikacji, określa ile zadań make może się pojawić dla kompilacji. Możesz ustawić -j<nb core> lub nawet wyższy -j<nb-core * 1.5>, aby kompilacja przebiegała równolegle.

Nie ma to wpływu na skompilowany kod.

Dla systemu 4 rdzeniowego, można spróbować make -j6. Jeśli make może uruchamiać równoległe Kompilacje, uruchomi do 6 jednoczesnych kompilacji (np. 6 wywołań do gcc).

 3
Author: Huygens,
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-03-08 08:01:36

Jeden procesor na wątek plus jeden menedżer / ładowacz. Ponieważ wątek wykonujący operacje dyskowe jest technicznie prawie bezczynny z punktu widzenia procesora, dodaj jeden do całkowitej liczby rdzeni.

Jeśli procesor używa hyperthreading, można bezpiecznie policzyć każdy rdzeń jako Dwa rdzenie i podwoić liczbę wątków, więc czterordzeniowy Intel Core i7 powinien uzyskać -j9 (osiem wirtualnych rdzeni plus menedżer.) Na czterordzeniowym AMD-J5

 3
Author: SF.,
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
2017-04-22 15:37:30