שיעור 4: כמה בלוקים צריך? כיסוי N איברים
בכל הפעלת GPU מסתתרת חידת ספירה קטנה: יש לך n פריטים לעבד, אבל threads מגיעים בבלוקים בגודל קבוע — אז כמה בלוקים צריך כדי לכסות את כולם בלי לפספס את האחרונים? זה השיעור על איך לוודא שיש מספיק threads. כבר יודעים להכריז על kernel ולהפעיל אותו עם <<<numBlocks, threadsPerBlock>>>, וגם שסך ה-threads = n
צריך להסיע 1000 אנשים באוטובוסים של 256 מקומות. 1000 חלקי 256 זה בערך 3.9, אבל אי אפשר להזמין 3.9 אוטובוסים — צריך 4 שלמים, אחרת הנוסעים האחרונים נשארים בחוץ. נוסחת התקרה תמיד מעגלת כלפי מעלה לאוטובוס שלם. נכון, באוטובוס הרביעי יישארו כמה מקומות ריקים — אלה ה-threads העודפים שפשוט יושבים בשקט.
- חלוקת תקרה
- חלוקה שמעגלת תמיד כלפי מעלה. בשלמים מבטאים אותה כ-(n + d - 1) / d כדי לקבל את מספר הקבוצות שמכסה את כל n האיברים.
- threads לבלוק
- מספר ה-threads בכל בלוק (המספר השני ב-<<<>>>). ערך נפוץ הוא 256. הוא המכנה בנוסחת מספר הבלוקים.
- גודל ה-grid
- מספר הבלוקים שמופעלים, numBlocks. נבחר כך שסך ה-threads (numBlocks כפול threadsPerBlock) יהיה לפחות n.
- שמירת גבולות
- התנאי if (i < n) בתוך ה-kernel, שגורם ל-threads העודפים (אלה שהאינדקס שלהם מעבר ל-n) לא לגעת בזיכרון.