שיעור 18: התנגשויות banks ב-shared memory
shared memory מהיר, אבל הוא מחולק ל-32 ערוצים מקבילים שנקראים banks. כל 32 ה-threads ב-warp יכולים לקרוא יחד בצעד אחד — אבל רק אם כל אחד פונה ל-bank אחר. כששניים פונים לאותו bank נוצרת התנגשות (bank conflict), והחומרה מאלצת אותם לחכות בתור. בשיעור נחשב בדיוק לאיזה bank כל thread פונה, נראה מתי נוצרת
דמיין 32 קופות בסופר ו-32 לקוחות. אם כל לקוח הולך לקופה אחרת — כולם משלמים בו-זמנית, מהר. אבל אם שני לקוחות נדחפים לאותה קופה, אחד מחכה לשני. ריפוד הוא כמו להזיז את התור באלכסון כך ששוב כל לקוח מקבל קופה לעצמו.
- bank
- אחת מ-32 יחידות הזיכרון המקבילות שמרכיבות shared memory. מילה באינדקס i שייכת ל-bank i % 32.
- התנגשות bank (bank conflict)
- כש-threads באותו warp ניגשים לכתובות שונות שנופלות לאותו bank, החומרה מסרילת אותן (n-way conflict = פי n זמן).
- broadcast
- כשכל ה-threads ב-warp קוראים בדיוק את אותה כתובת shared, הערך משודר לכולם בצעד אחד — בלי קנס.
- ריפוד (padding)
- הוספת עמודה מדומה, tile[N][N+1], שמזיזה כל שורה ב-bank אחד כדי שגישה לעמודה שלמה תיפול על 32 banks שונים.