لماذا تعمل إحدى نواة وحدة المعالجة المركزية بشكل أبطأ من غيرها؟

StackOverflow https://stackoverflow.com/questions/859747

سؤال

كنت أقوم بمقارنة تطبيق علمي كبير، ووجدت أنه يعمل في بعض الأحيان بشكل أبطأ بنسبة 10% مع نفس المدخلات.بعد الكثير من البحث، وجدت أن التباطؤ حدث فقط عندما كان يعمل على النواة رقم 2 لوحدة المعالجة المركزية رباعية النواة (على وجه التحديد، Intel Q6600 الذي يعمل بسرعة 2.4 جيجا هرتز).التطبيق عبارة عن خيط واحد ويقضي معظم وقته في إجراءات الرياضيات المصفوفة كثيفة الاستخدام لوحدة المعالجة المركزية.

الآن بعد أن علمت أن أحد النوى أبطأ من النوى الأخرى، يمكنني الحصول على نتائج قياس دقيقة عن طريق ضبط تقارب المعالج على نفس النواة لجميع عمليات التشغيل.ومع ذلك، ما زلت أريد أن أعرف لماذا يكون أحد النواة أبطأ.

لقد قمت بتجربة العديد من حالات الاختبار البسيطة لتحديد الجزء البطيء من وحدة المعالجة المركزية، ولكن حالات الاختبار تم تشغيلها في أوقات متطابقة، حتى على النواة البطيئة رقم 2.فقط التطبيق المعقد أظهر التباطؤ.فيما يلي حالات الاختبار التي جربتها:

  • الضرب والإضافة بالنقطة العائمة:

    accumulator = accumulator*1.000001 + 0.0001;
    
  • الدوال المثلثية:

    accumulator = sin(accumulator);
    accumulator = cos(accumulator);
    
  • إضافة عدد صحيح:

    accumulator = accumulator + 1;
    
  • نسخ الذاكرة أثناء محاولة تفويت ذاكرة التخزين المؤقت L2:

    int stride = 4*1024*1024 + 37;  // L2 cache size + small prime number
    for(long iter=0; iter<iterations; ++iter) {
        for(int offset=0; offset<stride; ++offset) {
            for(i=offset; i<array_size; i += stride) {
                array1[i] = array2[i];
            }
        }
    }
    

السؤال: لماذا تكون إحدى نواة وحدة المعالجة المركزية أبطأ من غيرها، وما هو جزء وحدة المعالجة المركزية الذي يسبب هذا التباطؤ؟

يحرر: وأظهرت المزيد من الاختبارات بعض هايسنبوغ سلوك.عندما أقوم بتعيين تقارب المعالج بشكل صريح، فإن تطبيقي لا يتباطأ في النواة رقم 2.ومع ذلك، إذا اختار التشغيل على النواة رقم 2 دون تحديد تقارب المعالج بشكل واضح، فسيتم تشغيل التطبيق بشكل أبطأ بنسبة 10٪ تقريبًا.وهذا ما يفسر لماذا لم تظهر حالات الاختبار البسيطة الخاصة بي نفس التباطؤ، حيث أنها جميعها تحدد بشكل واضح تقارب المعالج.لذا، يبدو أن هناك بعض العمليات التي ترغب في العيش على النواة رقم 2، ولكنها تبتعد عن الطريق إذا تم تعيين تقارب المعالج.

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

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

المحلول

قد يكون لديك تطبيقات اختارت أن تكون متصلة بنفس المعالج (CPU Affinity).

غالبًا ما ترغب أنظمة التشغيل في العمل على نفس المعالج حيث يمكنها تخزين جميع بياناتها مؤقتًا على نفس ذاكرة التخزين المؤقت L1.إذا قمت بتشغيل العملية الخاصة بك على نفس النواة التي يقوم نظام التشغيل الخاص بك بالكثير من العمل عليها، فقد تواجه تأثير التباطؤ في أداء وحدة المعالجة المركزية لديك.

يبدو أن بعض العمليات تريد الالتزام بنفس وحدة المعالجة المركزية.أشك في أنها مشكلة في الأجهزة.

ليس من الضروري أن يكون نظام التشغيل الخاص بك هو الذي يقوم بهذا العمل، فقد يكون هناك برنامج خفي آخر في الخلفية يقوم بذلك.

نصائح أخرى

تحتوي معظم وحدات المعالجة المركزية الحديثة على اختناق منفصل لكل نواة وحدة المعالجة المركزية بسبب ارتفاع درجة الحرارة أو ميزات توفير الطاقة.يمكنك محاولة إيقاف تشغيل توفير الطاقة أو تحسين التبريد.أو ربما وحدة المعالجة المركزية لديك سيئة.في جهاز i7 الخاص بي، أحصل على حوالي 2-3 درجات حرارة أساسية مختلفة عن النوى الثمانية المُبلغ عنها في "المستشعرات".عند التحميل الكامل لا يزال هناك اختلاف.

الاحتمال الآخر هو أن العملية يتم ترحيلها من مركز إلى آخر أثناء التشغيل.أقترح ضبط تقارب وحدة المعالجة المركزية على النواة "البطيئة" ومعرفة ما إذا كانت سريعة بهذه الطريقة.

منذ سنوات مضت، قبل أيام تعدد النواة، اشتريت لنفسي جهاز Athlon MP ثنائي المقبس من أجل "تطوير الويب".فجأة تباطأت خوادم الويب Plone/Zope/Python الخاصة بي إلى حد الزحف.أظهر بحث جوجل أن مترجم CPython لديه قفل مترجم عالمي، ولكن سلاسل Python مدعومة بسلاسل عمليات نظام التشغيل.تم توزيع مؤشرات ترابط نظام التشغيل بالتساوي بين وحدات المعالجة المركزية (CPUs)، ولكن يمكن لوحدة معالجة مركزية واحدة فقط الحصول على القفل في كل مرة، وبالتالي يمكن لجميع المعالجات الأخرى الحصول على القفل كان على العمليات أن تنتظر.

أدى ضبط تقارب وحدة المعالجة المركزية الخاصة بـ Zope إلى أي وحدة معالجة مركزية إلى حل المشكلة.

لقد لاحظت شيئًا مشابهًا على جهاز الكمبيوتر المحمول الخاص بي Haswel.كان النظام هادئًا، ولا يوجد X قيد التشغيل، فقط المحطة الطرفية.تنفيذ نفس الكود مع مختلف numactl --physcpubin أعطى الخيار بالضبط نفس النتائج على جميع النوى، باستثناء واحد.لقد غيرت تردد النوى إلى Turbo، إلى قيم أخرى، لم يساعد أي شيء.كانت جميع النوى تعمل بالسرعة المتوقعة، باستثناء واحدة كانت تعمل دائمًا بشكل أبطأ من النوى الأخرى.نجا هذا التأثير من إعادة التشغيل.

لقد أعدت تشغيل الكمبيوتر وأوقفت تشغيل HyperThreading في BIOS.عندما عاد عبر الإنترنت كان الأمر جيدًا مرة أخرى.ثم قمت بتشغيل HyperThreading ولا بأس حتى الآن.

بيزار.لا فكرة عما يمكن أن يكون.

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