سؤال

اليوم عندما كنت في صف تنظيم الكمبيوتر، تحدث المعلم عن شيء مثير للاهتمام بالنسبة لي.عندما يتعلق الأمر بالحديث عن لماذا تعمل ذاكرة التخزين المؤقت، قال ما يلي:

for (i=0; i<M; i++)
   for(j=0; j<N; j++)
      X[i][j] = X[i][j] + K; //X is double(8 bytes)

وليس من الجيد تغيير السطر الأول بالثاني.ما هي آرائكم حول هذا؟ولماذا هو هكذا؟

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

المحلول

ومحلية المرجعية. لأنه يتم تخزين البيانات حسب الصفوف، لكل صف الأعمدة ي هي في عناوين الذاكرة المجاورة. سوف OS عادة تحميل صفحة كاملة من الذاكرة إلى ذاكرة التخزين المؤقت وعنوان المجاور المراجع من المرجح أن أشير إلى أن نفس الصفحة. إذا كنت زيادة تلاه مؤشر صف في الحلقة الداخلية فمن الممكن أن هذه الصفوف سيكون على صفحات مختلفة (لأنها تكون مفصولة ي الزوجي لكل منهما) وقد يكون مخبأ لجلب باستمرار في ورمي بعيدا صفحات من الذاكرة لأنه يحيل البيانات. وهذا ما يسمى سحق وهو سيء للأداء.

في الممارسة ومع أكبر، مخابئ الحديثة، وأحجام الصفوف / الأعمدة يحتاج إلى أن تكون كبيرة إلى حد معقول قبل هذا من شأنه أن يدخل حيز اللعب، لكنه ما زال الممارسات الجيدة.

[تحرير] الجواب أعلاه هو محدد لC وقد تختلف عن لغات أخرى. الوحيد الذي أعرفه هو مختلف هو FORTRAN. مخازن FORTRAN الامور في النظام الرئيسي العمود (ما سبق هو الخلاف الرئيسي) وسيكون الصحيحة لتغيير ترتيب البيانات في FORTRAN. إذا كنت تريد الكفاءة / الحاجة، فإنه من المهم أن نعرف كيف لغتك تنفذ تخزين البيانات.

نصائح أخرى

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

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

وهناك بالطبع ثروة من المعلومات حول هذا الموضوع متاح، انظر على سبيل المثال هذا دخول ويكيبيديا على المكان من مرجع . أو، أعتقد، الخاص نص الكتاب دراستك. :)

في C، المصفوفات ن الأبعاد هي صف كبير، وهذا يعني أن مؤشر الماضي في مصفوفة تمثل المساحات المجاورة في الذاكرة. وهذا يختلف عن بعض اللغات الأخرى، FORTRAN على سبيل المثال، والتي هي كبرى العمود. في FORTRAN، انها أكثر كفاءة تكرار خلال مصفوفة 2D مثل هذا:

do jj = 1,N
  do ii = 1,M
    x(ii,jj) = x(ii,jj) + K;
  enddo
enddo

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

من خلال تخطيط حلقتك كما هي، يمكنك قراءة البايتات بالترتيب الذي تم تخزينها به في الذاكرة.وهذا يعني أنها موجودة في ذاكرة التخزين المؤقت، ويمكن قراءتها بسرعة كبيرة بواسطة وحدة المعالجة المركزية.إذا قمت بالتبديل بين السطرين 1 و2، فستقرأ كل بايت "N" في كل مرة حول الحلقة.وحدات البايت التي تقرأها لم تعد متتالية في الذاكرة، وبالتالي قد لا تكون موجودة في ذاكرة التخزين المؤقت.يتعين على وحدة المعالجة المركزية جلبها من ذاكرة الوصول العشوائي (الأبطأ)، وبالتالي ينخفض ​​أدائك.

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