Kann man das "Linken" beschleunigen?



  • Hallo,

    bei der Kompilierung von c-Dateien kann man um den Vorgang zu beschleunigen pro Core auf dem Build-Rechner eine c-Datei gleichzeitig kompilieren, z.B. bei 4 Cores (Quadcore) werden dann 4 c-Dateien gleichzeitig kompiliert.

    Gerade bei vielen c-Dateien ist das komplette neu erstellen dann wesentlich schneller.
    Wenn man nur eine c-Datei ändert, dann hat man die Möglichkeit auch nur diese erneut zu kompilieren und die anderen o-Dateien wiederzuverwenden.

    Diese Situation führt dazu, dass bei Änderungen nicht mehr die Kompile-Zeit maßgeblich ist, sondern die Link-Zeit, die jetzt im Verhältnis viel länger dauert.
    Gerade wenn man sehr viele o-Dateien linken muss macht das Linken viel aus.

    Leider scheint es so, dass der Linker auf dem Build-Rechner nur einen Core nutzt. Gibt es eine Möglichkeit den Link-Vorgang deutlich zu beschleunigen?

    Beispielsweise:
    a) Wie bringt man den Linker dazu alle Cores zu verwenden?
    b) Kann man das Linken in "Häppchen" aufteilen, so dass die "Häppchen" parallel gelinkt werden können?

    Hinweis: Die Toolchain ist GNU/GCC basiert.



  • Ich wüßte nicht, daß man das Linken auf mehrere Cores (effizient) verteilen könnte, denn es wird ja nur genau eine Datei erzeugt (im Gegensatz zum gleichzeitigen Kompilieren mehrere Source Dateien).
    Du könntest aber "Inkrementelles Linken" ausprobieren: http://gcc.gnu.org/wiki/GoldIncrementalLinking



  • Googles Gold verwendet schon Threads die Symbole parallel aufzulösen, der lohnt sich selbst wenn du einen komplette Rebuild machst.



  • Dieser Thread wurde von Moderator/in SeppJ aus dem Forum C (C89, C99 und C11) in das Forum Rund um die Programmierung verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • happychen schrieb:

    Googles Gold verwendet schon Threads die Symbole parallel aufzulösen, der lohnt sich selbst wenn du einen komplette Rebuild machst.

    Fall es für jemanden nicht klar sein sollte: Gold ist normaler Bestandteil der GNU Binutils. Wer Binutils installiert hat, sollte Gold über "ld.gold" aufrufen können. Man kann die Binutils auch so konfigurieren, dass Gold als Standardlinker verwendet wird. Wird aber selten gemacht, da die Kompatiblität zum klassischen ld.bfd nicht ganz perfekt ist und Gold nicht so viele Architekturen unterstützt. Der Linux-Kernel etwa lässt sich nicht mit Gold linken. Sollte für die allermeisten Anwendungsgebiete aber nicht sonderlich relevant sein.


Log in to reply