سؤال

سؤال سريع:ما هي علامة المترجم التي تسمح لـ g++ بإنشاء مثيلات متعددة لنفسها من أجل تجميع المشاريع الكبيرة بشكل أسرع (على سبيل المثال 4 ملفات مصدر في المرة الواحدة لوحدة المعالجة المركزية متعددة النواة)؟

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

المحلول

ويمكنك القيام بذلك مع make - مع حكومة الوحدة الوطنية جعله هو العلم -j (وهذا سوف يساعد أيضا على جهاز أحادي المعالجة)

.

وعلى سبيل المثال إذا كنت تريد 4 وظائف موازية من الماركة:

make -j 4

ويمكنك أيضا تشغيل دول مجلس التعاون الخليجي في أنبوب مع

gcc -pipe

وهذا الخط إرادة مراحل التحويل البرمجي، والتي سوف تساعد على الحفاظ النوى مشغول.

إذا كان لديك أجهزة إضافية متاحة أيضا، قد تحقق من distcc ، والتي سوف تزرع يجمع إلى أولئك كذلك.

نصائح أخرى

وليس هناك مثل هذا العلم، وجود واحد يعمل ضد فلسفة يونكس وجود كل أداة تؤدي وظيفة واحدة فقط وأداء جيدا. وضع البيض عمليات المترجم غير المفهوم وظيفة من نظام بناء. ما ربما كنت تبحث عن و-j (وظائف) العلم GNU جعل، على غرار

make -j4

وأو يمكنك استخدام pmake أو أنظمة جعل الموازي مماثلة.

وقد ذكر

والناس make لكن bjam كما يدعم مفهوم مماثل. باستخدام bjam -jx يكلف bjam لبناء ما يصل الى x الأوامر المتزامنة.

ونحن نستخدم نفس النصوص بناء على ويندوز ولينكس واستخدام هذا الخيار نصفين الأوقات بناء لدينا على كل المنابر. لطيفة.

وmake وسوف نفعل ذلك لك. التحقيق في مفاتيح -j و-l في صفحة رجل. لا أعتقد g++ غير موازاة.

وdistcc يمكن أن تستخدم أيضا لتوزيع يجمع ليس فقط على الجهاز الحالي، ولكن أيضا على الأجهزة الأخرى في مزرعة التي distcc تثبيت.

إذا باستخدام جعل، مخرج مع -j. من 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.

وعلى الأخص، إذا كنت تريد النصي أو تحديد عدد النوى المتوفرة لديك (اعتمادا على البيئة الخاصة بك، وإذا كنت تعمل في العديد من البيئات، وهذا يمكن أن يتغير الكثير) يمكنك استخدام كل مكان وظيفة بيثون cpu_count():

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

ومثل هذا:

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

إذا كنت طالبا لماذا 1.5 سوف أقتبس المستخدم جاهل الضوضاء في تعليق أعلاه:

<اقتباس فقرة>   

وعدد 1.5 هو بسبب مشكلة I ملزمة لاحظت / O. ومن كقاعدة عامة. حوالي 1/3 من فرص العمل سيكون في انتظار I / O، لذلك سيتم الوظائف المتبقية باستخدام النوى المتوفرة. وهناك عدد أكبر من النوى هو أفضل، ويمكن أن تذهب حتى يصل إلى 2X.

وأنا لست متأكدا من ز ++، ولكن إذا كنت تستخدم GNU جعل ثم "جعل -j N" (حيث N هو عدد المواضيع تجعل يمكن أن تخلق) سيسمح جعل لتشغيل multple ز ++ فرص العمل في نفس الوقت (طالما أن الملفات لا تعتمد على بعضها البعض).

جنو الموازي

كنت أصنع معيار التجميع الاصطناعي ولم أزعج نفسي بكتابة ملف Makefile، لذلك استخدمت:

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

توضيح:

  • {.} يأخذ وسيطة الإدخال ويزيل امتدادها
  • -t يطبع الأوامر التي يتم تشغيلها لإعطائنا فكرة عن التقدم
  • --will-cite يزيل طلب الاستشهاد بالبرنامج في حالة نشر النتائج باستخدامه...

parallel إنه مناسب جدًا لدرجة أنني أستطيع التحقق من الطابع الزمني بنفسي:

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

xargs -P يمكنه أيضًا تشغيل المهام بشكل متوازٍ، لكن من غير الملائم قليلًا إجراء معالجة الامتداد أو تشغيل أوامر متعددة باستخدامه: استدعاء أوامر متعددة من خلال xargs

تم سؤال الارتباط الموازي في: هل يمكن لدول مجلس التعاون الخليجي استخدام نوى متعددة عند الارتباط؟

لكى يفعل:أعتقد أنني قرأت في مكان ما أنه يمكن تقليل التجميع إلى مضاعفة المصفوفات، لذلك ربما يكون من الممكن أيضًا تسريع تجميع ملف واحد للملفات الكبيرة.لكن لا يمكنني العثور على مرجع الآن.

تم الاختبار في أوبونتو 18.10.

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