سؤال

هل حاول أي شخص استخدامه gold بدلاً من ld?

gold وعود أن تكون أسرع بكثير من ld, ، لذلك قد يساعد في تسريع دورات الاختبار لتطبيقات C ++ الكبيرة ، ولكن هل يمكن استخدامها كبديل للمنزل؟

يستطيع gcc/g++ اتصل مباشرة gold.?

هل هناك أي حشرات أو مشاكل معروفة؟

رغم gold هو جزء من Gnu BinuTils منذ فترة ، لم أجد تقريبًا "قصص نجاح" أو حتى "Howtos" في الويب.

(تحديث: روابط مضافة إلى الذهب والمدونة تشرح ذلك)

هل كانت مفيدة؟

المحلول

في الوقت الحالي ، تقوم بتجميع مشاريع أكبر على Ubuntu 10.04. هنا يمكنك تثبيت ودمجته بسهولة مع binutils-gold الحزمة (إذا قمت بإزالة هذه الحزمة ، فستحصل على قديمة ld). ستعمل GCC تلقائيًا على استخدام الذهب بعد ذلك.

بعض التجارب:

  • الذهب لا يبحث في /usr/local/lib
  • الذهب لا يفترض libs مثل pthread أو RT ، وكان عليه أن يضيفها باليد
  • إنه أسرع ويحتاج إلى ذاكرة أقل (في وقت لاحق مهم في مشاريع Big C ++ مع الكثير من التعزيز وما إلى ذلك)

ما الذي لا يعمل: لا يمكن تجميع أشياء kernel وبالتالي لا توجد وحدات kernel. يقوم Ubuntu بذلك تلقائيًا عبر DKMS إذا قام بتحديث برامج تشغيل الملكية مثل FGLRX. هذا فشل مع ld-gold (عليك إزالة الذهب ، وإعادة تشغيل DKMS ، وإعادة التثبيت ld-gold.

نصائح أخرى

نظرًا لأن الأمر استغرق مني بعض الوقت لمعرفة كيفية استخدام الذهب بشكل انتقائي (أي ليس على مستوى النظام باستخدام Symlink) ، سأقوم بنشر الحل هنا. إنه يعتمد على http://code.google.com/p/chromium/wiki/linuxfasterbuilds#linking_using_gold .

  1. اصنع دليلًا حيث يمكنك وضع نص غراء ذهبي. انا استخدم ~/bin/gold/.
  2. ضع نص الغراء التالي هناك واسمه ~/bin/gold/ld:

    #!/bin/bash
    gold "$@"
    

    من الواضح ، اجعلها قابلة للتنفيذ ، chmod a+x ~/bin/gold/ld.

  3. تغيير مكالماتك إلى gcc إلى gcc -B$HOME/bin/gold مما يجعل GCC يبحث في الدليل المحدد لبرامج المساعد مثل ld وبالتالي يستخدم البرنامج النصي الغراء بدلاً من الافتراض النظام ld.

هل يمكن لـ GCC/G ++ استدعاء الذهب مباشرة.؟

فقط لاستكمال الإجابات: هناك خيار من مجلس التعاون الخليجي -fuse-ld=gold (نرى DOC DOC). على الرغم من ذلك ، AFAIK ، من الممكن تكوين GCC أثناء البناء بطريقة لن يكون للخيار أي تأثير.

كمطور Samba ، كنت أستخدم رابط الذهب بشكل حصري تقريبًا على Ubuntu و Debian و Fedora منذ عدة سنوات حتى الآن. تقييمي:

  • الذهب عدة مرات (محسوس: 5-10 مرات) أسرع من الرابط الكلاسيكي.
  • في البداية ، كانت هناك بعض المشكلات ، ولكن ذهب منذ ما يقرب من أوبونتو 12.04.
  • حتى أن رابط الذهب وجد بعض مشاكل التبعية في الكود لدينا ، حيث يبدو أنها أكثر صحة من المشكلات الكلاسيكية فيما يتعلق ببعض التفاصيل. انظر ، على سبيل المثال هذا السامبا الالتزام.

لم أستخدم الذهب بشكل انتقائي ، لكنني كنت أستخدم Symlinks أو آلية البدائل إذا كان التوزيع يوفرها.

يمكنك الارتباط ld إلى gold (في دليل ثنائي محلي إذا كان لديك ld مثبتة لتجنب الكتابة فوق):

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

أو

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

الحد الأدنى من المعيار الاصطناعي

النتيجة: كان الذهب حوالي 2x إلى 3x أسرع لجميع القيم التي جربتها.

توليد الكائنات

#!/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.

إعطاء مدخل من النوع:

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

هذا يولد رئيسيًا:

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

حيث يتم تعريف كل وظيفة في منفصلة f_n.c الملف ويضيف n_int_file_is مرات 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); }

هذا يؤدي إلى:

n_int_file_is x n_ints_per_file x n_funcs

الانتقال على الرابط.

ثم قارنت:

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

لمختلف التوائم المدخلات ، والتي أعطت:

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

بعض الحدود التي كنت أحاول تخفيفها:

  • في ملف 100K C ، تحصل كلتا الطريقتين على فشل mallocs من حين لآخر
  • لا يمكن لـ GCC تجميع وظيفة مع إضافات 1M

تم اختباره على Ubuntu 18.10 ، GCC 8.2.0 ، Lenovo ThinkPad P51 كمبيوتر محمول ، Intel Core I7-7820HQ CPU (4 CORES / 8 THELMS) ، 2X Samsung M471A2K43BB1-CRC RAM (2x 16GIB) ).

لقد لاحظت أيضًا 2x في بناء تصحيح GEM5: https://gem5.googlesource.com/public/gem5/+/fafe4e80b76e93e3d0d05797904c19928587f5b5

يبدو أن بعض المشاريع غير متوافقة مع الذهب ، بسبب بعض الاختلافات غير المتوافقة بين LD والذهب. مثال: OpenFoam ، انظر http://www.openfoam.org/mantisbt/view.php؟id=685 .

تحول Dragonflybsd إلى الذهب كرابط افتراضي. لذلك يبدو أنه جاهز لمجموعة متنوعة من الأدوات.
المزيد من التفاصيل:http://phoronix.com/scan.php؟page=news_item&px=dragonflybsd-gold-linker

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top