2009-01-05 7 views
139

Schnelle Frage: Was ist das Compiler-Flag, damit g ++ mehrere Instanzen von sich selbst erzeugen kann, um große Projekte schneller zu kompilieren (zum Beispiel 4 Quelldateien gleichzeitig für eine Mehrkern-CPU)?Kompilieren mit g ++ mit mehreren Kernen

Vielen Dank.

+0

Wird es wirklich helfen? Alle meine Kompilierjobs sind E/A-gebunden statt CPU-gebunden. –

+4

Selbst wenn sie I/O-gebunden sind, können Sie wahrscheinlich die I/O-Last höher halten, wenn die schweren CPU-Bits auftreten (mit nur einer g ++ - Instanz wird es Lulls geben) und möglicherweise I/O-Effizienzen, wenn der Scheduler mehr Auswahl hat darüber, was als nächstes von der Platte zu lesen ist. Nach meiner Erfahrung führt die umsichtige Verwendung von 'make -j' fast immer zu Verbesserungen. – Flexo

+1

@BrianKnoblauch Aber auf meiner Maschine (real oder in VirtualBox), es ist CPU gebunden, fand ich, dass die CPU durch 'Top' Befehl beim Kompilieren beschäftigt ist. –

Antwort

199

Sie können dies mit make machen - mit gnu make ist das -j Flag (das wird auch auf einem Einzelprozessor-Rechner helfen).

Wenn Sie zum Beispiel 4 parallele Jobs aus machen wollen:

make -j 4 

Sie auch gcc in einem Rohr mit

gcc -pipe 

Dies wird Pipeline die Kompilierung Stufen, die auch halten helfen wird, laufen die Kerne beschäftigt.

Wenn Sie weitere Maschinen zur Verfügung haben, können Sie auch distcc auschecken, die diese auch kompiliert.

+30

Ihre -j-Nummer sollte die 1,5fache Anzahl der Kerne sein, die Sie haben. –

+0

ja, so etwas macht Sinn, wenn es auch I/O gibt - obwohl einige tuning tun müssen, wenn Sie -pipe sowie – frankodwyer

+1

Dank verwenden. Ich habe versucht, "-j #" über CFLAGS/CPPFLAGS/CXXFLAGS an gcc zu übergeben. Ich hatte komplett vergessen, dass "-j #" ein Parameter für GNU make war (und nicht für GCC). – chriv

7

make wird dies für Sie tun. Untersuchen Sie die Schalter -j und -l in der Manpage. Ich glaube nicht g++ ist parallelisierbar.

+0

das könnte die lange Liste der Kompilierfehler erklären ... –

2

Ich bin mir nicht sicher über g ++, aber wenn Sie GNU Make verwenden, dann wird "make -j N" (wobei N die Anzahl der Threads ist, die make erstellen kann) erlauben, dass mpleple g ++ Jobs gleichzeitig ausgeführt werden Zeit (solange die Dateien nicht voneinander abhängen).

+2

nein N ist nicht die Anzahl der Threads! Viele Menschen missverstehen das, aber "-j N" sagt, wie viele Prozesse auf einmal erzeugt werden sollten, nicht Threads. Das ist der Grund, warum es nicht so performant ist wie MS cl-MT (wirklich Multithread). – Sebi2020

36

Es gibt keine solche Markierung, und wenn man sie hat, läuft sie gegen die Unix-Philosophie, jedes Werkzeug nur eine Funktion ausführen zu lassen und es gut auszuführen. Das Erstellen von Compiler-Prozessen ist konzeptionell die Aufgabe des Build-Systems. Was Sie wahrscheinlich für suchen, ist die -j (Jobs) Flag auf GNU machen, a la

make -j4

Oder Sie können pmake oder ähnliche parallel machen Systeme verwenden.

+0

http://www.gnu.org/software/make/manual/html_node/Parallel.html auch http://www.gnu.org/software/make/manual/html_node/Options-Summary.html#Options -Zusammenfassung –

+2

_ "Unix Pedanterie ist nicht hilfreich" _ Gute Sache, es war Pedanterie dann nicht, anonymer Herausgeber. Zurückgerollt. Rezensenten achten bitte mehr auf das, was Sie tun. –

11

Leute haben erwähnt make, aber bjam unterstützt auch ein ähnliches Konzept. Mit bjam -jx wird bjam angewiesen, bis zu x gleichzeitige Befehle zu erstellen.

Wir verwenden die gleichen Erstellungsskripte unter Windows und Linux, und diese Option halbiert unsere Build-Zeiten auf beiden Plattformen. Nett.

5

distcc kann auch verwendet werden, um Kompilierungen nicht nur auf der aktuellen Maschine, sondern auch auf anderen Maschinen in einer Farm zu verteilen, auf denen distcc installiert ist.

+0

+1, distcc ist ein nützliches Werkzeug für große Builds in seinem Arsenal. – Flexo

+0

Sieht so aus, als gäbe es auch ein paar, die "wie" distcc funktionieren: http://stackoverflow.com/questions/5374106/distributed-make/13770116#13770116 – rogerdpack