الدرس 13: التسلسل الهرمي للذاكرة
يمتلك الـ GPU عدة أنواع من الذاكرة تختلف في السرعة والنطاق ومدة الحياة. الـ registers هي الذاكرة الأسرع: كل متغير محلي بسيط في الـ kernel يوجد في register، خاص بـ thread واحد ويبقى موجوداً فقط أثناء تشغيل الـ thread. الـ shared memory، المُعلَنة بـ __shared__، توجد على الشريحة (on-chip) ومشتركة بين
تخيّل مطبخاً: الـ registers هي يداك — الأسرع، لكنها لك وحدك ولِلحظة فقط. الـ shared memory هي طاولة العمل المشتركة لفريق واحد في المطبخ — سريعة ويمكن لكل الفريق الوصول إليها، لكن ليس لفريق في مطبخ آخر. الـ global memory هي الثلاجة العملاقة في المستودع — ضخمة وتخدم الجميع، لكن المشي إليها بطيء. الـ constant memory هي لوحة الوصفة المعلَّقة على الحائط التي يقرأها الجميع لكن لا أحد يغيّرها.
- registers
- الذاكرة الأسرع، خاصة بـ thread واحد. كل متغير محلي بسيط في الـ kernel يوجد هنا ويبقى موجوداً فقط أثناء تشغيل الـ thread.
- shared memory
- ذاكرة على الشريحة (on-chip) مُعلَنة بـ __shared__، مشتركة بين جميع الـ threads في الـ block نفسه. أسرع بكثير من global، لكنها لا تتجاوز الـ blocks.
- global memory
- الـ DRAM الخاصة بالـ device: كبيرة، بطيئة، يمكن الوصول إليها من الـ grid بأكمله وتبقى محفوظة بين عمليات الإطلاق. تُنسَخ البيانات إلى هنا من الـ host.
- constant memory
- ذاكرة للقراءة فقط (read-only) مُعلَنة بـ __constant__ ومُخزَّنة في الـ cache. ممتازة عندما تقرأ جميع الـ threads القيمة نفسها.