Frage

Hat jemand versucht zu benutzen gold statt ld?

gold href="http://www.airs.com/blog/archives/38" rel="noreferrer"> verspricht viel schneller zu sein als ld, so dass es Test zu beschleunigen helfen kann Zyklen für große C ++ Anwendungen, sondern kann es als Drop-in-Ersatz für ld verwendet werden?

Kann gcc / g++ direkt Anruf gold.?

Gibt es Know Bugs oder Probleme?

Obwohl gold Teil des GNU binutils seit einer Weile ist, ich habe so gut wie keine „Erfolgsgeschichten“ oder sogar „Howtos“ im Web gefunden.

( Update: hinzugefügt Links zu Gold und Blog-Eintrag erklärt, es )

War es hilfreich?

Lösung

Im Moment ist es kompiliert größere Projekte auf Ubuntu 10.04. Hier können Sie installieren und integrieren sie leicht mit dem binutils-gold Paket (wenn Sie das Paket entfernen, erhalten Sie Ihre alte ld). Gcc wird Gold automatisch dann verwenden.

Einige Erfahrungen:

  • Gold sucht nicht in /usr/local/lib
  • Gold geht nicht davon aus Libs wie Pthread oder rt, hatte sie von Hand hinzufügen
  • es ist schneller und benötigt weniger Speicher (der spätere Zeitpunkt ist wichtig, sich auf große C ++ Projekte mit viel Schub usw.)

Was nicht funktioniert: Es kann nicht Kompilierung Kernel Sachen und deshalb keine Kernel-Module. Ubuntu tut dies automatisch über DKMS wenn es proprietäre Treiber wie fglrx aktualisiert. Dies scheitert mit ld-gold (Sie haben Gold zu entfernen, neu starten DKMS, wieder installieren ld-gold.

Andere Tipps

Wie es mir ein wenig dauerte, während, um herauszufinden, wie selektiv Gold verwenden (das heißt nicht systemweit einen Symlink verwenden), werde ich die Lösung hier posten. Es basiert auf http://code.google.com/p/chromium/wiki/ LinuxFasterBuilds # Linking_using_gold .

  1. Erstellen Sie eine Verzeichnis, in dem Sie einen Gold Leim Skript setzen können. Ich verwende ~/bin/gold/.
  2. gebe folgende Kleber Skript gibt und nennen Sie es ~/bin/gold/ld:

    #!/bin/bash
    gold "$@"
    

    Offensichtlich ist es ausführbar machen, chmod a+x ~/bin/gold/ld.

  3. Ändern Sie Ihre Anrufe zu gcc zu gcc -B$HOME/bin/gold die gcc Blick in das angegebene Verzeichnis für Hilfsprogramme wie ld macht und nutzt somit den Leim Skript anstelle des Systems-default ld.

  

Kann gcc / g ++ direkt Anruf Gold.?

Nur die Antworten ergänzen: Es gibt eine Option -fuse-ld=gold gcc (siehe gcc doc ). Obwohl, AFAIK ist es möglich, zu konfigurieren gcc während des Build in einer Art und Weise, dass die Option keine Auswirkungen hat.

Als Samba-Entwickler, ich habe schon jetzt den Gold-Linker mit fast ausschließlich auf Ubuntu, Debian, Fedora und seit mehreren Jahren. Meine Einschätzung:

  • Gold ist oft (gefühlt: 5-10 mal). Schneller als die klassischen Linker
  • Am Anfang gab es ein paar Probleme, aber die sind seit etwa Ubuntu 12.04 gegangen.
  • Das Gold Linker fand sogar einige Abhängigkeitsprobleme in unserem Code, da es richtiger ist als die klassische eine in Bezug auf einige Details zu sein scheint. Siehe z.B. dieser Samba begeht .

Ich habe selektiv nicht verwendet Gold, sondern habe Symlinks oder den Alternativen Mechanismus wurde unter Verwendung, wenn die Verteilung es bietet.

Sie könnten ld zu gold verknüpfen (in einem lokalen Binärverzeichnis wenn Sie ld Überschreiben zu vermeiden installiert ist):

ln -s `which gold` ~/bin/ld

oder

ln -s `which gold` /usr/local/bin/ld

Minimal synthetischer Benchmark

Ergebnis: Gold war über 2x 3x schneller für alle Werte, die ich versucht habe,

.

erzeugen Objekte

#!/usr/bin/env bash
set -eu

# CLI args.

# Each of those files contains n_ints_per_file ints.
n_int_file_is="${1:-10}"
n_ints_per_file="${2:-10}"

# Each function adds all ints from all files.
# This leads to n_int_file_is x n_ints_per_file x n_funcs relocations.
n_funcs="${3:-10}"

# Do a debug build, since it is for debug builds that link time matters the most,
# as the user will be recompiling often.
cflags='-ggdb3 -O0 -std=c99 -Wall -Wextra -pedantic'

# Cleanup previous generated files objects.
./clean

# Generate i_*.c, ints.h and int_sum.h
rm -f ints.h
echo 'return' > int_sum.h
int_file_i=0
while [ "$int_file_i" -lt "$n_int_file_is" ]; do
  int_i=0
  int_file="${int_file_i}.c"
  rm -f "$int_file"
  while [ "$int_i" -lt "$n_ints_per_file" ]; do
    echo "${int_file_i} ${int_i}"
    int_sym="i_${int_file_i}_${int_i}"
    echo "unsigned int ${int_sym} = ${int_file_i};" >> "$int_file"
    echo "extern unsigned int ${int_sym};" >> ints.h
    echo "${int_sym} +" >> int_sum.h
    int_i=$((int_i + 1))
  done
  int_file_i=$((int_file_i + 1))
done
echo '1;' >> int_sum.h

# Generate funcs.h and main.c.
rm -f funcs.h
cat <<EOF >main.c
#include "funcs.h"

int main(void) {
return
EOF
i=0
while [ "$i" -lt "$n_funcs" ]; do
  func_sym="f_${i}"
  echo "${func_sym}() +" >> main.c
  echo "int ${func_sym}(void);" >> funcs.h
  cat <<EOF >"${func_sym}.c"
#include "ints.h"

int ${func_sym}(void) {
#include "int_sum.h"
}
EOF
  i=$((i + 1))
done
cat <<EOF >>main.c
1;
}
EOF

# Generate *.o
ls | grep -E '\.c$' | parallel --halt now,fail=1 -t --will-cite "gcc $cflags -c -o '{.}.o' '{}'"

GitHub Upstream .

ein Eingang vom Typ Gegeben:

./generate-objects [n_int_file_is [n_ints_per_file [n_funcs]]]

Dies erzeugt ein Haupt das tut:

return f_0() + f_1() + ... + f_(n_funcs)()

, wobei jede Funktion in einer separaten f_n.c-Datei definiert ist, und fügt n_int_file_is mal n_ints_per_file extern Ints:

int f_0() { return i_0_0 + i_0_1 + ... + i_(n_int_file_is)_(n_ints_per_file); }

Dies führt zu:

n_int_file_is x n_ints_per_file x n_funcs

Verlagerungen auf den Link.

Dann habe ich im Vergleich:

gcc -ggdb3 -O0 -std=c99 -Wall -Wextra -pedantic               -o main *.o
gcc -ggdb3 -O0 -std=c99 -Wall -Wextra -pedantic -fuse-ld=gold -o main *.o

für verschiedene Eingangs Drillinge, die haben:

10000 10 10
nogold: wall=3.70s user=2.93s system=0.75s max_mem=556356kB
gold:   wall=1.43s user=1.15s system=0.28s max_mem=703060kB

1000 100 10
nogold: wall=1.23s user=1.07s system=0.16s max_mem=188152kB
gold:   wall=0.60s user=0.52s system=0.07s max_mem=279108kB

100 1000 10
nogold: wall=0.96s user=0.87s system=0.08s max_mem=149636kB
gold:   wall=0.53s user=0.47s system=0.05s max_mem=231596kB

10000 10 100
nogold: wall=11.63s user=10.31s system=1.25s max_mem=1411264kB
gold:   wall=6.31s user=5.77s system=0.53s max_mem=2146992kB

1000 100 100
nogold: wall=7.19s user=6.56s system=0.60s max_mem=1058432kB
gold:   wall=4.15s user=3.81s system=0.34s max_mem=1697796kB

100 1000 100
nogold: wall=6.15s user=5.58s system=0.57s max_mem=1031372kB
gold:   wall=4.06s user=3.76s system=0.29s max_mem=1652548kB

Einige Grenzen Ich habe versucht, zu mildern:

  • bei 100k C-Dateien, beide Methoden erhalten fehlgeschlagen mallocs gelegentlich
  • GCC kann keine Funktion mit 1M Ergänzungen kompilieren

Getestet auf Ubuntu 18.10, GCC 8.2.0, Lenovo ThinkPad P51 Laptop, Intel Core i7-7820HQ CPU (4 Kerne / 8 Threads), 2x Samsung M471A2K43BB1-CRC-RAM (2x 16GiB), Samsung MZVLB512HAJQ-000L7 SSD (3000 MB / s).

Ich habe beobachtet, auch 2x in dem Debug-Build von gem5: https: // gem5.googlesource.com/public/gem5/+/fafe4e80b76e93e3d0d05797904c19928587f5b5

scheinen einige Projekte mit Gold unvereinbar zu sein, weil einige inkompatible Unterschiede zwischen ld und Gold. Beispiel: OpenFOAM finden Sie unter http://www.openfoam.org/mantisbt/view. php? id = 685 .

DragonFlyBSD umgeschaltet, um Gold als Standard-Linker. So scheint es für eine Vielzahl von Werkzeugen bereit zu sein.
Mehr Details: http://phoronix.com/scan.php?page=news_item&px=DragonFlyBSD -Gold-Linkers

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top