異質資料平行運算 練習題 (Practice - Data Parallelism and CUDA C Program Structure)

Question 1 - Data Parallelism 的定義與灰階範例 [recall]

情境/題目:請定義 data parallelism,並寫出彩色轉灰階 (color-to-grayscale) 的亮度公式;為何說此計算「天生可平行」?

Question 2 - Data Parallelism vs Task Parallelism [recall]

情境/題目:data parallelism 與 task parallelism 的拆解依據各是什麼?哪一個是平行程式「可擴展性 (scalability)」的主要來源,為什麼?

Question 3 - SPMD 是不是 SIMD? [recall]

情境/題目:CUDA kernel 的程式設計風格是哪一種?它與 SIMD 有何不同?

Question 4 - 三種 Function Declaration Qualifiers [recall]

情境/題目:__global____device____host__ 三個限定詞分別表示函式在何處執行、可被誰呼叫、是否會啟動新 grid?沒有任何限定詞的函式預設是什麼?

Question 5 - cudaMalloc / cudaFree 參數 [recall]

情境/題目:要讓 float *A_d 指向 device 上 n 個 float 的空間,cudaMalloc 的兩個參數各應填什麼?為何第一參數要傳 (void**)&A_d 而非 A_dcudaFree 又傳什麼?

Question 6 - cudaMemcpy 參數順序與方向 [recall]

情境/題目:要把 host 陣列 A_h 搬到 device 的 A_d,以及把結果 C_d 搬回 C_h,分別怎麼寫 cudaMemcpy?參數順序是什麼?

Question 7 - Global Index 與邊界檢查 [recall]

情境/題目:在 1D vector addition kernel 中,每個 thread 的全域索引 i 如何計算?為何 kernel 內幾乎一定要加 if (i < n)

Question 8 - 編譯流程 NVCC 與 PTX [recall]

情境/題目:CUDA C 程式用 NVCC 編譯時,host code 與 device code 分別走哪條路徑?device code 會先被編成什麼中間檔?

Question 9 - 計算 grid 的 thread 數 (Ex.4) [application]

情境/題目:vector length = 8000,每個 thread 算一個輸出元素,block size = 1024,採用「最少 block 數覆蓋所有元素」的配置。grid 內共有多少 thread?

Question 10 - 分析 kernel launch 的 thread 計數 (Ex.9) [application]

情境/題目:foo_kernel<<<(N+128-1)/128, 128>>>(...)N = 200000,kernel 第 02 行算 i、第 04 行在 if (i<N) 內做運算。求:(a) 每 block thread 數;(b) grid 總 thread 數;(c) block 數;(d) 執行第 02 行的 thread 數;(e) 執行第 04 行的 thread 數。

Question 11 - 每個 thread 算多個元素的索引映射 (Ex.2 vs Ex.3) [application]

情境/題目:(a) 若每個 thread 處理「2 個相鄰」元素,其第一個元素的 index i 為何?(b) 若每個 block 把 2*blockDim.x 個元素分成兩個 section(所有 thread 先掃完第一段、再一起掃第二段),其第一個元素的 index i 又為何?

Question 12 - 為何 GPU vecAdd 可能比 CPU 還慢 [analysis]

情境/題目:vector addition 是「平行版的 Hello World」,但把它搬到 GPU 後實測往往比序列 CPU 版更慢。請用 arithmetic intensity 解釋原因,並說明真實應用如何讓 GPU 划得來。

Question 13 - Transparent Scalability 與 block 執行順序 [analysis]

情境/題目:CUDA 規定「programmer 不可假設 block 的執行順序」。這個限制如何帶來 transparent scalability?對比同一份 binary 在「小 GPU」與「大 GPU」上的行為,並說明 <<<gridDim, blockDim>>> 中的 block 數是由什麼決定。