Wie viele machen Threads zu verwenden?

11

Wenn ich große Systeme auf einem Desktop- / Laptop-Computer (neu) baue, empfehle ich, makemehr als einen Thread zu verwenden, um die Kompilierungsgeschwindigkeit wie folgt zu beschleunigen:

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

Wo $Csoll die Anzahl der Kerne angegeben werden (von denen wir annehmen können, dass es sich um eine Zahl mit einer Ziffer handelt), über die die Maschine verfügt, während $Kich je 2nach 4Stimmung von bis variieren kann .

So könnte ich zum Beispiel sagen, make -j12wenn ich 4 Kerne habe, was bedeutet make, dass bis zu 12 Threads verwendet werden sollen.


Mein Grundprinzip ist, dass, wenn ich nur $CThreads verwende, Kerne inaktiv sind, während Prozesse damit beschäftigt sind, Daten von den Laufwerken abzurufen. Wenn ich jedoch die Anzahl der Threads nicht beschränke (dh make -j), besteht die Gefahr, dass ich Zeit damit verschwende, Kontexte zu wechseln, nicht genügend Speicherplatz zur Verfügung zu haben oder noch schlimmer . Nehmen wir an, die Maschine hat $MSpeicherplätze (wobei $Min der Größenordnung von 10 liegt).

Ich habe mich gefragt, ob es eine etablierte Strategie gibt, um die effizienteste Anzahl von Threads auszuwählen, die ausgeführt werden sollen.

Bitmaske
quelle
In vielen Fällen ist die richtige Antwort für die Anzahl der Threads die Anzahl der Kerne. Die einzige Möglichkeit, dies sicher zu wissen, besteht darin, einige Tests durchzuführen und die Anzahl der Threads zu variieren, bis Sie den Sweet Spot gefunden haben.
Robert Harvey
@ RobertHarvey: Ja, ich werde wahrscheinlich über Nacht ein Shell-Skript mit allen möglichen Einstellungen kompilieren lassen, aber ich dachte, ich würde fragen, ob es da draußen etwas Wissen darüber gibt.
Bitmaske
4
Viele Leute schlagen auch $ cores + 1 vor, sodass 1 Compiler-Prozess von der Festplatte liest, während 4 kompiliert werden. Ein generischer Vorschlag ist schwierig, hängt auch von der Codebasis (Überbeanspruchung von C ++ - Vorlagen im Vergleich zu kleinen Kompilierungseinheiten mit einigen C-Funktionen), der Compilerkette (vorkompilierte Header usw.?) Und der Build-Struktur (verknüpft sie nur eine große Sache in der.) Ab Ende oder mehrere kleinere Dinge dazwischen)
Johannes
1
Wenn Sie ernsthaft nach Leistung suchen, empfehlen wir Ihnen, eine RAM-Disk oder eine andere Methode zur Linderung Ihrer E / A einzurichten. Ich denke nicht, dass die CPU-Auslastung Ihr Hot Spot ist.
TMN
@ TMN: Wie hilft eine RAM-Disk? Linux ist ziemlich gut bei Sachen Cachen (Sie tun die Header - Dateien bedeuten, oder?), Nicht auf die Laufwerk - Cache zu erwähnen. Ich müsste zuerst alles in den shm laden, entweder manuell oder durch Ändern des Build-Skripts (was ein völliger Overkill wäre).
Bitmaske

Antworten:

15

Ich habe eine Reihe von Tests durchgeführt und llvm (im Debug + Asserts-Modus) auf einem Computer mit zwei Kernen und 8 GB RAM erstellt:

Kompilieren der llvm-Zeit in Abhängigkeit von der Anzahl der Jobs

Seltsamerweise scheint es bis 10 zu steigen und fällt dann plötzlich unter die Zeit, die zum Erstellen mit zwei Jobs benötigt wird (ein Job dauert ungefähr die doppelte Zeit, nicht in der Grafik enthalten).

Das Minimum scheint 7*$coresin diesem Fall zu sein.

Bitmaske
quelle
1
+1 für tatsächliche Tests und nicht spekulieren.
Martin Wickman
3

Ich verwende Gentoo Linux (quellenbasierte Distribution) und aus meiner Erfahrung kann ich sagen, dass (mit mehr oder weniger neuer Hardware) n*2 + xder beste Wert ist. Lassen Sie mich das erklären:

  • n*2: Selbst langsamere CPUs haben genug Leistung, um zwei Aufgaben gleichzeitig auszuführen. Die meisten Kompilierungsaufgaben sind sehr schnell erledigt.
  • +xDiese Anzahl hängt von Ihrem System ab (hauptsächlich Speicher und Festplatte). Wenn Sie über genügend RAM und eine schnelle Festplatte verfügen, stellen Sie diese ein x=n. Dies hängt jedoch vom Quellcode (Open Office, ich sehe Sie an!) Und der verwendeten Sprache ab (das Kompilieren von C / C ++ ist sehr speicherintensiv).

Sie müssen jedoch einige Tests mit einigen -jWerten ausführen , um die beste Anzahl zu erhalten. Versuchen Sie auch, andere Schritte des Erstellungsprozesses zu parallelisieren: Auspacken, Ausführen configureusw.

ercpe
quelle
Ich beschäftige mich momentan hauptsächlich mit C ++ und meine Festplatten sind nicht die schnellsten, denke ich.
Bitmaske
Beginnen Sie dann mit n * 1.5 und erhöhen Sie es, bis die Kompilierungszeiten nicht mehr abnehmen (stellen Sie sicher, dass Sie den Festplatten-Cache / Kompilierungs-Cache jedes Mal bereinigen). Denken Sie auch daran, ccache ( ccache.samba.org ) zu verwenden, um die Kompilierung zu beschleunigen.
Ercpe