שיעור 19: constant memory ו-registers
שני סוגי זיכרון מהירים תופסים את שני הקצוות של ההיררכיה. בקצה האחד יש registers: הזיכרון המהיר ביותר, פרטי לכל thread. כל משתנה מקומי פשוט בתוך kernel (למשל מצבר sum) חי ב-register, וגישה אליו כמעט בחינם. אבל יש מספר מוגבל של registers לכל SM, והם מתחלקים בין כל ה-threads הפעילים. אם kernel דורש יות
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.