שיעור 8: לולאת grid-stride וטיפול ב-N שרירותי
עד עכשיו הנחנו ש-thread אחד מטפל באיבר אחד, וש-if (i < n) שומר על הגבולות. אבל מה קורה כש-n גדול ממספר ה-threads שהפעלנו? אם יש מיליון איברים ורק 262,144 threads, חצי מהמערך לא יחושב. הפתרון הוא לולאת grid-stride: כל thread מתחיל באינדקס הגלובלי שלו, ואז קופץ קדימה בצעד של גודל הגריד כולו, blockDim.
דמיין/י 100 כיסאות לסדר אבל רק 10 מסדרים. במקום שכל אחד יסדר כיסא אחד ואז ילך הביתה, כל מסדר מתחיל בכיסא שלו וקופץ 10 כיסאות קדימה כל פעם: 1, 11, 21... כך 10 אנשים מכסים את כל 100 הכיסאות.
- לולאת grid-stride
- תבנית שבה כל thread מטפל בכמה איברים, וקופץ ביניהם בצעד של גודל הגריד כולו עד שהאינדקס חורג מ-n.
- צעד (stride)
- המרחק שבו האינדקס קופץ קדימה: blockDim.x * gridDim.x, כלומר מספר ה-threads הכולל בגריד.
- gridDim
- מספר ה-blocks בגריד. gridDim.x * blockDim.x נותן את סך כל ה-threads בממד אחד.
- N שרירותי
- קלט בכל גודל, גם גדול ממספר ה-threads. לולאת grid-stride מכסה אותו בלי לשנות את תצורת ההפעלה.