多維 Grid 與資料 練習題 (Practice - Multidimensional Grid Organization)


Question 1 - dim3 與執行設定參數 [recall]

情境:呼叫 kernel 的 <<< , >>> 內兩個執行設定參數各代表什麼?它們的型別是什麼?1D 的 <<<ceil(n/256.0), 256>>> 寫法為何成立?

Question 2 - block 與 grid 尺寸上限 [recall]

情境:一個 block 最多可有幾個 thread?(32, 16, 2)(32, 32, 2) 哪個合法?gridDim.xgridDim.y/.z 的上限有何不同?

Question 3 - 四個內建變數的意義 [recall]

情境:gridDimblockDimblockIdxthreadIdx 分別代表什麼?哪些由 host 執行設定決定、哪些在 kernel 內可以改名?

Question 4 - Thread 對多維資料的映射公式 [recall]

情境:寫出 2D kernel 中由 thread 座標導出 rowcol 的公式,並說明軸向對應 (哪個對 x、哪個對 y) 以及為何需要 if 邊界檢查。

Question 5 - Row-major 線性化與動態陣列 [recall]

情境:4×4 矩陣 M 以 row-major 攤平後,M[j][i] 的 1D 索引是什麼?為何在 CUDA C 中動態配置的多維陣列必須由程式設計師「手動 flatten」?

Question 6 - colorToGrayscale 的索引計算 [recall]

情境:在 colorToGrayscaleConversion 中,輸出灰階索引 grayOffset 與輸入彩色起始偏移 rgbOffset 如何計算?為何兩者差一個倍數?

Question 7 - Blur kernel 的兩層 if 與 pixels 計數 [recall]

情境:blurKernelBLUR_SIZE 代表什麼?為什麼需要外層與內層兩個 if?為何最後要除以 pixels 而非固定的 (2*BLUR_SIZE+1)²

Question 8 - matrixMulKernel 的記憶體存取 [recall]

情境:在 matrixMulKernel(方陣 Width) 中,inner product 迴圈內 MN 的存取索引各是什麼?P 如何寫回?為何用區域變數 Pvalue 累加?

Question 9 - Row-major 與 column-major 索引 [application]

情境 (Exercise 4):一個 width=400、height=500 的 2D 矩陣存成 1D 陣列。求 row=20、col=10 元素的陣列索引:(a) row-major;(b) column-major。

Question 10 - 3D tensor 的線性化 [application]

情境 (Exercise 5):一個 width=400、height=500、depth=300 的 3D tensor 以 row-major 存成 1D 陣列。求元素 (x=10, y=20, z=5) 的陣列索引。

Question 11 - 啟動設定與邊界 block 行為 [application]

情境:要用 16×16 的 block 處理一張 62 (height/n) × 76 (width/m) 的圖片。grid 需要幾個 block?共產生幾個 thread?為何會有越界 thread?

Question 12 - M 連續 vs N stride 存取 [analysis]

情境:基本 matrixMulKernel 中,同一個 warp 內相鄰 thread (col 相差 1) 對 M[row*Width+k]N[k*Width+col] 的存取樣態有何不同?這對記憶體存取效率有何影響?

Question 13 - 每 thread 一列 vs 一行 vs 一元素 [analysis]

情境 (Exercise 1):除了「每 thread 算一個 P 元素」,還可設計「每 thread 算一整列」或「每 thread 算一整行」的 matmul kernel。比較其優缺點;並說明為何基本版 matmul 是 memory-bound。