שיעור 36: פרויקט מסכם — אופטימיזציית kernel מקצה-לקצה
זהו השיעור המסכם של הקורס. לא נלמד מנגנון חדש — נחבר את כל מה שכבר למדנו לכדי תהליך אחד: איך לוקחים kernel נאיבי ואיטי והופכים אותו למהיר. הרשימה אינה קסם, היא רצף של בדיקות שכבר ראינו בנפרד. ראשית, coalescing: לוודא ש-threads עוקבים ניגשים לכתובות עוקבות בזיכרון הגלובלי (a[i] עם i כאינדקס גלובלי),
לשפר kernel זה כמו לשפץ בית: אי אפשר רק לצבוע ולקוות. בודקים מה באמת שבור — הצנרת, החשמל או הגג — ומתקנים את זה. ויש מד לחץ אחד שאסור להתעלם ממנו: המדידה (Nsight). בלי למדוד, אתה מתקן את הקיר הלא נכון.
- רשימת אופטימיזציה
- רצף בדיקות לשיפור kernel: coalescing, shared memory, צמצום divergence, כיוון occupancy, ומדידה ב-Nsight.
- צוואר בקבוק (bottleneck)
- המגבלה האמיתית שמאטה את ה-kernel. תיקון משהו אחר לא יעזור עד שמטפלים בו ספציפית.
- למדוד לפני
- להשתמש ב-Nsight כדי לזהות את צוואר הבקבוק לפני שמשנים קוד, במקום לנחש איזו אופטימיזציה דרושה.
- צמצום קריאות גלובליות
- העלאת נתונים חוזרים ל-shared memory מקצצת קריאות מהזיכרון הגלובלי האיטי, למשל מ-K ל-K/TILE ב-tiling.