שיעור 9: גרידים דו-ממדיים: אינדוקס מטריצות ותמונות
מטריצות ותמונות הן דו-ממדיות באופן טבעי, ולכן CUDA מאפשרת לארגן את ה-threads בגריד דו-ממדי. במקום ממד x יחיד, יש לנו threadIdx.x ו-threadIdx.y, blockIdx.x ו-blockIdx.y, וכן blockDim.x ו-blockDim.y. כל thread מחשב שורה ועמודה: row = blockIdx.y * blockDim.y + threadIdx.y, col = blockIdx.x * blockDim.x
תאטרון עם שורות וכיסאות. כדי למצוא מושב לפי מספר רץ אחד, סופרים: כל שורה מלאה תורמת width מושבים, אז המושב הוא שורה כפול width ועוד מספר העמודה. כל פקיד (thread) יודע בדיוק את השורה והעמודה שלו.
- גריד דו-ממדי
- ארגון ה-threads בשני ממדים (x ו-y), נוח למטריצות ולתמונות שבהן לכל איבר יש שורה ועמודה.
- row ו-col
- row מגיע מממד ה-y (blockIdx.y, threadIdx.y) ו-col מממד ה-x. ביחד הם הקואורדינטה הדו-ממדית של ה-thread.
- שיטוח row-major
- המרת (row, col) לאינדקס שטוח: idx = row * width + col, כי הזיכרון מאוחסן שורה אחרי שורה.
- dim3
- טיפוס של שלושה רכיבים (x, y, z) לתיאור גודל block או grid, למשל dim3 block(16, 16).