الدرس 15: ذاكرة التخزين المؤقت للمعالج ومحلية الذاكرة
المعالج أسرع بكثير من الذاكرة الرئيسية. ولسد الفجوة يستخدم تسلسلاً هرمياً من ذاكرة التخزين المؤقت — L1 وL2 وL3 — يخزّن نسخاً من البيانات التي جرى الوصول إليها مؤخراً. وعندما يصل كود C++ إلى البيانات بترتيب صديق لذاكرة التخزين المؤقت، يمكن أن يقفز الأداء بمقدار 10–50×. في هذا الدرس نرى لماذا تتفوق حل
المعالج يتذكّر الأشياء التي وصلت إليها مؤخراً — اقرأ البيانات بالترتيب الذي تجلس به في الذاكرة وسيكون المعالج قد جهّز القطعة التالية قبل أن تطلبها حتى.
- cache line
- وحدة النقل بين الذاكرة الرئيسية وذاكرة التخزين المؤقت — 64 بايت في معظم المعالجات الحديثة. أي وصول إلى الذاكرة يحمّل الـ cache line بالكامل الذي يحتوي على ذلك العنوان.
- false sharing
- عندما يكتب اثنان من الـ threads إلى متغيرات مختلفة تتشارك الـ cache line ذاته، ما يسبب إبطالاً غير ضروري لذاكرة التخزين المؤقت في كل thread.
- المحلية المكانية
- ميل البرامج إلى الوصول إلى عناوين ذاكرة قريبة بعضها من بعض. الوصول التسلسلي إلى المصفوفة يستغل المحلية المكانية لأن الـ cache line بأكمله يُحمَّل دفعة واحدة.
- المحلية الزمنية
- ميل البرامج إلى الوصول إلى عنوان الذاكرة نفسه مراراً خلال فترة قصيرة. الحلقات التي تعيد استخدام المتغير نفسه تستغل المحلية الزمنية.
- prefetch
- آلية يحمّل بها المعالج (أو المترجِم) الـ cache lines مسبقاً قبل أن يطلبها الكود، عبر اكتشاف أنماط الوصول التسلسلية.