Frage

Kurze Frage: Was ist der Compiler-Flag zu ermöglichen g ++ mehrere Instanzen von mir selbst, um laichen großen Projekten schneller zu kompilieren (zum Beispiel 4-Quelldateien zu einem Zeitpunkt für einen Multi-Core-CPU)

?
War es hilfreich?

Lösung

Sie können mit macht dies tun - mit Gnu macht es den Parameter -J (dies wird auch auf einer Einprozessor-Maschine helfen)

.

Zum Beispiel, wenn Sie wollen 4 parallele Jobs aus machen:

make -j 4

Sie können auch gcc in einem Rohr laufen mit

gcc -pipe

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

Wenn Sie auch zur Verfügung zusätzliche Maschinen haben, können Sie überprüfen distcc , die denen kompiliert aus dem Bauernhof wird als auch.

Andere Tipps

Es gibt keine solche Fahne, und man läuft mit gegen die Unix-Philosophie jedes Werkzeug mit ausführen nur eine Funktion und eine gute Leistung. Compiler Prozesse Laichen ist vom Konzept her die Aufgabe des Build-Systems. Was Sie wahrscheinlich suchen die -j (Jobs) Flag auf GNU machen, a la

make -j4

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

Die Menschen haben make erwähnt, aber bjam unterstützt auch ein ähnliches Konzept. Mit bjam -jx anweist bjam aufzubauen gleichzeitige Befehle x.

Wir verwenden die gleichen Build-Skripte unter Windows und Linux und mit dieser Option halbiert unsere Bauzeiten auf beiden Plattformen. Nizza.

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

distcc kann auch kompiliert werden verteilen nicht nur auf der aktuellen Maschine, sondern auch auf anderen Maschinen in einem landwirtschaftlichen Betrieb, distcc installiert hat.

Wenn machen mit, die Ausgabe mit -j. Von man make:

  -j [jobs], --jobs[=jobs]
       Specifies the number of jobs (commands) to run simultaneously.  
       If there is more than one -j option, the last one is effective.
       If the -j option is given without an argument, make will not limit the
       number of jobs that can run simultaneously.

Und vor allem, wenn Sie Skript zu wollen oder die Anzahl des Kerns identifizieren Sie zur Verfügung haben (abhängig von Ihrer Umgebung, und wenn Sie in vielen Umgebungen laufen, kann dies viel ändern) können Sie überall vorhandene Python-Funktion cpu_count() verwenden:

https://docs.python.org/3/library /multiprocessing.html#multiprocessing.cpu_count

Wie folgt aus:

make -j $(python3 -c 'import multiprocessing as mp; print(int(mp.cpu_count() * 1.5))')

Wenn Sie sich fragen, warum 1.5 ich oben Benutzer artless-Rauschen in einem Kommentar zitieren:

  

Die 1,5-Nummer ist wegen der erwähnten I / O Bindung Problem. Es ist eine Faustregel. Über ein Drittel der Arbeitsplätze für I / O warten, so bleiben die übrigen Arbeitsplätze die verfügbaren Kerne verwendet werden. Eine Zahl, die größer als der Kern ist besser und man konnte sogar so hoch wie 2x gehen.

Ich bin nicht sicher über g ++, aber wenn Sie mit GNU „make -j N“ Machen Sie dann (wobei N die Anzahl der Threads ist machen kann erstellen) können make multple g ++ Jobs zur gleichen Zeit laufen (so lange, wie die Dateien voneinander abhängig sind nicht).

GNU parallel

Ich mache ein synthetisches Compilation Benchmark und couldn ‚t belästigt wird ein Makefile zu schreiben, so dass ich verwendet:

sudo apt-get install parallel
ls | grep -E '\.c$' | parallel -t --will-cite "gcc -c -o '{.}.o' '{}'"

Erklärung:

  • {.} nimmt das Eingabeargument und entfernt seine Erweiterung
  • -t druckt die Befehle ausführen, um uns eine Vorstellung von Fortschritt geben
  • --will-cite entfernt die Anforderung, die Software zu zitieren, wenn Sie Ergebnisse zu veröffentlichen verwenden es ...

parallel ist so bequem, dass ich auch ein Zeitstempel überprüft mich tun könnte:

ls | grep -E '\.c$' | parallel -t --will-cite "\
  if ! [ -f '{.}.o' ] || [ '{}' -nt '{.}.o' ]; then
    gcc -c -o '{.}.o' '{}'
  fi
"

xargs -P können auch Aufträge parallel laufen, aber es ist etwas weniger bequem, die Erweiterung Manipulation zu tun oder mehrere Befehle laufen mit ihm: Aufruf mehrerer Befehle durch xargs

wurde Parallel Verknüpfung gebeten unter: Verwendung mehrerer Kerne gcc kann bei der Verknüpfung

ERLEDIGEN: Ich glaube, ich irgendwo gelesen, dass Kompilierung reduziert werden kann Multiplikation Matrix, so vielleicht ist es auch möglich ist, einzelne Datei Kompilierung für große Dateien zu beschleunigen. Aber ich kann nicht einen Verweis jetzt finden.

Getestet in Ubuntu 18.10.

scroll top