Verwendung von make mit -j4 oder -j8

Lesezeit: 5 Minuten

Ich habe 4 Prozessoren und kompiliere eine prozessorhungrige Anwendung. Ich habe das mit gelesen make mit dem -j4 Schalter wurde für OpenCV empfohlen; sollte ich stattdessen verwenden -j8? Was ist der Vorteil der Herstellung für mehrere Prozessoren?

  • Siehe auch stackoverflow.com/q/4778389/1172302

    – Nikos Alexandris

    30. Juni 2013 um 11:08 Uhr

  • Tl;dr: make -j $(nproc)

    – Hansenrik

    1. November 2017 um 17:20 Uhr

  • Auch Sie können hinzufügen alias make="make -j $(nproc)" zu Ihrer .bashrc

    – Tharindu Sathischandra

    15. März um 2:46 Uhr

Benutzeravatar von MadScientist
Verrückter Wissenschaftler

Die obigen Antworten sind alle größtenteils richtig. Allerdings sind die Details etwas irreführend. Beispielsweise ist es nicht erforderlich, einen zusätzlichen Job für einen “Verwaltungsthread” hinzuzufügen (Hinweis: make ist nicht wirklich multithreaded). make zählt sich nie als Job im Sinne von -jalso, wie Huygens oben sagt, wenn Sie sagen -j5 Sie erhalten 5 Kompilierungsjobs, die ausgeführt werden, nicht 4 plus make.

Der Grund, warum die meisten Leute verwenden [number of cores] + [some padding] hat nichts zu tun mit make oder was es braucht, sondern eher mit der Natur des Compilers. Ein Compiler ist wirklich nur ein sehr kompliziertes Textübersetzungswerkzeug: Er liest Text in einer Form ein und konvertiert ihn in “Text” (binär) in einer anderen Form. Vieles davon (insbesondere wenn Ihre Sprache komplexer wird, wie C++), erfordert viel CPU. Aber es erfordert auch viel Disk-I/O. Platten-I/O ist langsam, während also ein Compiler auf einige Daten von der Platte wartet, plant der Kernel die Ausführung anderer Jobs. Aus diesem Grund können Sie sinnvollerweise mehr als die Anzahl der gleichzeitig ausgeführten Kernkompilierungen ausführen.

Genau wie groß man werden kann -j bevor Sie anfangen, abnehmende Renditen zu sehen (Ihre Builds werden tatsächlich langsamer, irgendwann mit mehr -j) hängt vollständig von Ihrer Hardware, der Art der Builds, die Sie erstellen, usw. ab. Der einzige Weg, dies sicher zu wissen, ist das Experimentieren.

Jedoch, [number of cores]+[a few] ist normalerweise eine gute Annäherung.

  • Wenn die zu erstellenden Dateien sehr groß sind, [cores]+[something >0] könnte einen Engpass verursachen, da jeder Thread sehr ausgelastet sein wird, sobald alle IO-Operationen abgeschlossen sind. Ich verwende -j Kerne als max.

    – Peregring-lk

    13. Dezember 2018 um 18:00 Uhr

  • Es ist nützlich zu laufen vmstat und beachten Sie die Sperrwerte. Auch die Compiler-Optionen können dies beeinflussen. Das heißt, -O0 benötigt weniger CPU als -O3, sodass I/O bei nicht optimierten Builds ein größerer Faktor ist. Ich frage mich, ob Abhängigkeitsinformationen verwendet werden könnten, um den Festplatten-Cache zu optimieren. Ein Artikel und Code; ändern benchmark.sh und ändere die NPROC Variable. Die Codestruktur ist synthetisch im Vergleich zu echten Builds, aber sie ist ein großartiger Ausgangspunkt für Experimente und Evaluierungen.

    – ungekünstelter Lärm

    29. September 2019 um 14:42 Uhr


  • Ich denke, es lohnt sich hinzuzufügen, dass es nicht schwer ist, auf beiden Seiten ein bisschen zu messen. Man kompiliert genug, dass das Ausprobieren von Kernen + 2 und Kernen – 2 einfach zu versuchen sein sollte. Ausprobieren ist wichtig, da sich die Geschwindigkeit von IO-Subsystemen in den letzten 5 Jahren radikal verändert hat.

    – Brian Bulkowski

    13. Februar 2020 um 0:29 Uhr

Vegers Benutzeravatar
Vegetar

Wie du sagst -j Flagge erzählt make dass es erlaubt ist, die bereitgestellte Menge an ‘Threads’ zu spawnen. Idealerweise wird jeder Thread auf einem eigenen Kern/CPU ausgeführt, sodass Ihre Multi-Core/CPU-Umgebung optimal genutzt wird.

make selbst kompiliert die Quelldateien nicht. Dies geschieht durch einen Compiler (gcc). Das Makefile (Eingabe für make) enthält eine Reihe von Zielen. Jedes Ziel hat eine Reihe von Abhängigkeiten (von anderen Zielen) und Regeln, wie das Ziel erstellt wird. make liest das/die Makefile(s) und verwaltet alle Ziele, Abhängigkeiten und Build-Regeln. Neben dem Kompilieren von Quelldateien können Sie verwenden make um jede Aufgabe auszuführen, die durch Shell-Befehle beschrieben werden kann.

Wenn Sie die zulässige Anzahl von Threads zu hoch einstellen, ist es nicht möglich, jeden Thread auf einem eigenen Kern zu planen. Zusätzliche Planungs-(Kontext-)Schalter sind erforderlich, damit alle Threads ausgeführt werden können. Diese zusätzliche Ressourcennutzung führt offensichtlich zu einer geringeren Leistung.

Es gibt mehrere Faustregeln, aber ich schätze, dass diese Einstellung auf insgesamt beläuft <number of cores> + 1 ist am häufigsten. Die Idee dahinter ist, dass alle Kerne ihren eigenen Thread haben und es einen zusätzlichen Verwaltungs-Thread gibt, der die Ziele behandelt und der als nächstes gebaut wird.

  • Veger gut erklärt. Vielen Dank für die Antwort.

    – Tom Taylor

    20. November 2018 um 14:26 Uhr

Benutzeravatar von SF
SF.

Eine CPU pro Thread plus ein Manager/Loader. Da ein Thread, der Festplattenoperationen durchführt, aus CPU-Sicht technisch fast im Leerlauf ist, addieren Sie einen zur Gesamtzahl der Kerne hinzu.

Wenn die CPU Hyperthreading verwendet, können Sie jeden Kern sicher als zwei Kerne zählen und die Anzahl der Threads verdoppeln, sodass ein Quad-Core-Intel Core i7 -j9 (acht virtuelle Kerne plus Manager) erhalten sollte. Auf einem Quad-Core-AMD verwenden Sie -j5

Das -j Die Option wird nur verwendet, um die Anwendungserstellung zu beschleunigen, sie bestimmt, wie viele Jobs make kann für den Build spawnen. Sie können entweder einstellen -j<nb core> oder noch höher -j<nb-core * 1.5> damit die Kompilierung parallel erfolgen kann.

Es hat keine Auswirkungen auf den kompilierten Code.

Bei einem 4-Core-System könnten Sie es versuchen make -j6. Wenn make parallele Builds ausführen kann, startet es bis zu 6 gleichzeitige Kompilierungsprozesse (z. B. 6 Aufrufe an gcc).

1415050cookie-checkVerwendung von make mit -j4 oder -j8

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy