Wenn ich große Systeme auf einem Desktop- / Laptop-Computer (neu) baue, empfehle ich, make
mehr als einen Thread zu verwenden, um die Kompilierungsgeschwindigkeit wie folgt zu beschleunigen:
$ make -j$[ $K * $C ]
Wo $C
soll 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 $K
ich je 2
nach 4
Stimmung von bis variieren kann .
So könnte ich zum Beispiel sagen, make -j12
wenn ich 4 Kerne habe, was bedeutet make
, dass bis zu 12 Threads verwendet werden sollen.
Mein Grundprinzip ist, dass, wenn ich nur $C
Threads 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 $M
Speicherplätze (wobei $M
in 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.
quelle
Antworten:
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:
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*$cores
in diesem Fall zu sein.quelle
Ich verwende Gentoo Linux (quellenbasierte Distribution) und aus meiner Erfahrung kann ich sagen, dass (mit mehr oder weniger neuer Hardware)
n*2 + x
der 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.+x
Diese 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 einx=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
-j
Werten ausführen , um die beste Anzahl zu erhalten. Versuchen Sie auch, andere Schritte des Erstellungsprozesses zu parallelisieren: Auspacken, Ausführenconfigure
usw.quelle