الدرس 19: constant memory و registers
يقع نوعان سريعان من الذاكرة عند طرفي التسلسل الهرمي. في أحد الطرفين توجد registers: الذاكرة الأسرع، الخاصة بكل thread. كل متغير محلي بسيط داخل kernel (على سبيل المثال المجمِّع sum) يعيش في register، والوصول إليه شبه مجاني. لكن هناك عدد محدود من registers لكل SM، تتقاسمه جميع الـ threads النشطة. إذا
الـ register هو دفتر شخصي في جيب كل عامل — الأسرع، لكن إذا كتبت فيه أكثر من اللازم، فستضطر إلى تخزين صفحات في مستودع بعيد (هذا هو الـ spilling). أما constant memory فهي لوحة إعلانات واحدة يقرأ منها الجميع: إذا نظروا جميعاً إلى الإعلان نفسه، فيمكن قراءته بصوت عالٍ مرة واحدة للجميع.
- registers
- الذاكرة الأسرع، الخاصة بكل thread. المتغيرات المحلية البسيطة تعيش هنا. عددها محدود لكل SM.
- انسكاب registers (register spilling)
- عندما يحتاج kernel إلى registers أكثر مما هو متاح، يُخزَّن الفائض في local memory الموجودة في global DRAM البطيئة — وهذا غرامة في الأداء.
- constant memory
- منطقة صغيرة (64KB) للقراءة فقط من داخل الـ kernel، مُعلَنة بـ __constant__ وتُكتَب من الـ host. لها cache مخصص.
- broadcast من constant
- عندما تقرأ جميع الـ threads في warp القيمة نفسها من constant memory، تُبثّ القراءة من الـ cache في خطوة واحدة — بسرعة register.