سؤال

هذا جزء من إخراج Cachegrind. تم تنفيذ هذا الجزء من الكود لمدة 1224 مرة. ELMG1 عبارة عن مجموعة من الحجم الطويل غير الموقّع من 16 × 20. حجم ذاكرة التخزين المؤقت MACHE L1 هو 32 كيلو بايت ، وحجم خط ذاكرة التخزين المؤقت 64B ومجموعة 8 اتجاهات.

  1. لـ (i = 0 ؛ i <20 ؛ i ++) 78،336 2،448 2 50،184 0 0 1،224 0 0
  2. {
  3. telm01 = elmg1 [i] ؛ 146،880 0 0 73،440 0 0 24،480 0 0
  4. telm31 = (telm01 << 3) ^ val1 ؛ 97،920 0 0 48،960 0 0 24،480 0 0
  5. telm21 = (telm01 << 2) ^ (val1 >> 1) ؛ 146،880 1،224 1 48،960 0 0 24،480 0 0
  6. telm11 = (telm01 << 1) ^ (val1 >> 2) ؛ 146،880 0 0 48،960 0 0 24،480 0 0
  7. }

أ. السبب في أنني وضعته هنا ، هو أنه في السطر الثالث داخل الحلقة ، أرى عددًا من Misses I1 (واحد L2 تفوت كذلك). إنه أمر محير إلى حد ما ولم أستطع تخمين السبب؟

أحاول تحسين (الوقت) جزءًا من التعليمات البرمجية. ما سبق هو مجرد مقتطف صغير. أعتقد في ذاكرة البرنامج الخاصة بي وصولًا إلى كلفتي كثيرًا. كما هو الحال في المثال أعلاه ELMG1 هو مجموعة من 16 × 20 من الحجم غير الموقّع. عندما أحاول استخدامه في التعليمات البرمجية ، هناك دائمًا بعض الأخطاء ، وفي برنامجي تحدث هذه المتغيرات كثيرًا. أي اقتراحات؟

أنا بحاجة إلى تخصيص و (تهيئة في بعض الأحيان) هذه الطور غير الموقّع. هل يمكنك اقتراح أي واحد يجب أن أفضّل أو إعلان Calloc أو Array ثم تهيئة صريحة. بالمناسبة سيكون هناك أي اختلاف في الطريقة التي يتعامل بها ذاكرة التخزين المؤقت لهم؟

شكرًا.

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

المحلول

هل حاولت فك الحلقة؟

  1. لن تقلق بشأن Misses L1 الآن. كما أن L2 يفتقد من بين 1224 مرة على ما يرام ، يتعين على وحدة المعالجة المركزية تحميل القيم في ذاكرة التخزين المؤقت في مرحلة ما.
  2. ما هي النسبة المئوية ل L2 التي يكلف هذا الرمز مقارنة مع بقية البرنامج؟
  3. استخدم Calloc () ، إذا كان حجم الصفيف هو نفسه دائمًا واستخدمت الثوابت للحجم ، فيمكن للمترجم تحسين صفر الصفيف. أيضا الشيء الوحيد الذي من شأنه أن يؤثر على استخدام خطوط ذاكرة التخزين المؤقت هو المحاذاة ، وليس كيف تم بدء ذلك.

تحرير: الرقم الذي يصعب قراءة بهذه الطريقة وقراءةهم خطأ في المرة الأولى.

دعنا نتأكد من أنني أقرأ الأرقام المناسبة للخط 5:

Ir    146,880
I1mr  1,224
ILmr  1
Dr    48,960
D1mr  0
DLmr  0
Dw    24,480
D1mw  0
DLmw  0

يتم تقسيم ذاكرة التخزين المؤقت L1 إلى اثنين من ذاكرة التخزين المؤقت 32kbyte واحدة للرمز I1 وواحد من البيانات D1. IL & DL هي ذاكرة التخزين المؤقت L2 أو L3 التي يتم مشاركتها بواسطة كل من البيانات والتعليمات.

العدد الكبير من I1MR هو تعليمات تفتقد لا تفوت البيانات ، وهذا يعني أن رمز الحلقة يتم طرده من ذاكرة التخزين المؤقت للتعليمات I1.

I1 يفتقد في السطر 1 و 5 إجمالي 3672 وهو 3 مرات 1224 ، لذلك في كل مرة يتم تشغيل الحلقة ، تحصل على 3 i1 ذاكرة التخزين المؤقت مع 64Byte Cache Lines وهذا يعني أن حجم رمز الحلقة يتراوح بين 128-192 بايت لتغطية 3 خطوط ذاكرة التخزين المؤقت. لذا فإن هؤلاء I1 يفتقد في السطر 5 هو أن رمز الحلقة يعبر خط ذاكرة التخزين المؤقت الأخير.

أوصي باستخدام Kcachegrind لعرض نتائج Cachegrind

تحرير: المزيد عن خطوط ذاكرة التخزين المؤقت.

لا يبدو رمز الحلقة هذا أنه يتم الاتصال بـ 1224 مرة بنفسه ، وهذا يعني أن هناك المزيد من التعليمات البرمجية التي تدفع هذا الرمز من ذاكرة التخزين المؤقت I1.

يتم تقسيم ذاكرة التخزين المؤقت 32kbyte i1 إلى 512 خطوط ذاكرة التخزين المؤقت (64Bytes لكل منها). يعني الجزء "8-Way Set Associative" أن كل عنوان ذاكرة يتم تعيينه إلى 8 فقط من أصل 512 خطوط ذاكرة التخزين المؤقت. إذا كان البرنامج بأكمله هو ملف تعريف واحد مستمر من 32 كيلو بايت من الذاكرة ، فسيتم إتلاف كل ذلك مع ذاكرة التخزين المؤقت I1 ولن يتم إخراج أي منها. هذا ليس هو الحال ، وسيكون هناك أكثر من 8 64Byte كتل من التعليمات البرمجية التي تمثل نفس خطوط ذاكرة التخزين المؤقت 8. دعنا نقول أن برنامجك بأكمله يحتوي على 1MBYTE من التعليمات البرمجية (ويشمل ذلك المكتبات) ، فإن كل مجموعة من 8 خطوط ذاكرة التخزين المؤقت ستتضمن حوالي 32 (1MBYTE/32KBYTE) من الشفرة التي تمسك بها نفس خطوط ذاكرة التخزين المؤقت 8.

اقرأ هذا المقال LWN.NET لجميع التفاصيل الدائرية حول ذاكرة التخزين المؤقت لوحدة المعالجة المركزية

لا يمكن للمترجم دائمًا اكتشاف وظائف البرنامج التي ستكون النقاط الساخنة (تسمى عدة مرات) والتي ستكون كودسفيس (أي رمز معالج الأخطاء ، والذي لا يعمل أبدًا أبدًا). يحتوي GCC على سمات الوظيفة حار بارد مما سيتيح لك تحديد الوظائف على أنها ساخنة/باردة ، سيسمح هذا للمترجم بتجميع الوظائف الساخنة معًا في كتلة واحدة من الذاكرة للحصول على استخدام أفضل لذاكرة التخزين المؤقت (أي رمز البارد لن يدفع الرمز الساخن من ذاكرة التخزين المؤقت).

على أي حال ، لا يستحق تلك الفطائر I1 الوقت الذي يدعو للقلق.

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