計算架構與排程 練習題 (Practice - GPU Architecture, Block Scheduling, Synchronization and Transparent Scalability)



Question 1 - SM 與 Core 的組織 [recall]

情境:請描述一個現代 CUDA-capable GPU 的高階組織,並說明 Ampere A100 共有多少個 core,怎麼算出來的。

Question 2 - Block 如何指派到 SM [recall]

情境:當 kernel 啟動且 grid 的 block 數遠多於硬體能同時容納的數量時,CUDA runtime 如何把 thread 指派到 SM?指派的基本單位是什麼?

Question 3 - __syncthreads() 的使用規則 [recall]

情境:某 kernel 在 if-then-else 的 then 路徑與 else 路徑中各放了一個 __syncthreads(),由 threadIdx.x 的奇偶決定走哪條路徑。這段程式合法嗎?會發生什麼事?

Question 4 - Transparent Scalability [recall]

情境:為什麼同一份未修改的 CUDA binary,能在低階手機 GPU 與高階桌機 GPU 上以差異極大的速度執行?這個性質叫什麼?它的代價是什麼?

Question 5 - Warp 切分公式與 padding [recall]

情境:一個一維 block 含 48 個 thread。它會被切成幾個 warp?warp n 包含哪些 threadIdx?不足的部分如何處理?

Question 6 - 多維 Block 的 warp 線性化 [recall]

情境:一個 8×8(x、y 各 8)的二維 block 共 64 個 thread,會被切成幾個 warp?第一個 warp 從哪個 thread 開始、到哪個 thread 結束?

Question 7 - SIMD / SIMT 與 Processing Block [recall]

情境:解釋為什麼一個 warp 的執行行為被稱為 SIMD(或 NVIDIA 的 SIMT)。Ampere A100 的 SM 有 64 個 core,這些 core 是如何分組的?

Question 8 - Zero-overhead Scheduling 與 Oversubscription [recall]

情境:A100 的一個 SM 只有 64 個 core,卻可同時被指派最多 2048 個 thread。為何要這樣「超量訂閱」?warp 切換為何是「零開銷」的?

Question 9 - 32-thread Block 能否省略 __syncthreads() [recall]

情境:一位程式設計師說:「如果每個 block 只啟動 32 個 thread(剛好一個 warp),就可以省略所有 __syncthreads(),反正同一 warp 一定 lockstep。」這是好主意嗎?

Question 10 - 裝置屬性查詢 API [recall]

情境:你想寫一個能在多種 GPU 上自適應、並避開效能很差的 integrated GPU 的程式。要呼叫哪些 API?哪些 cudaDeviceProp 欄位能查到 SM 數量與 warp 大小?

Question 11 - Vector Add 的 Grid 大小與分歧 Warp [application]

情境:對長度 2000 的向量做加法,每個 thread 算一個輸出元素,block size = 512。(a) grid 中共有幾個 thread?(b) 因 if(i<n) 邊界檢查,會有幾個 warp 發生 control divergence?

Question 12 - Occupancy 計算(block-slot 與整除性) [application]

情境:某 GPU 每 SM 上限為 2048 threads、32 blocks、65,536 registers。在 register 不受限的前提下,下列兩種 block size 的 occupancy 各是多少?(a) 32 threads/block;(b) 768 threads/block。

Question 13 - Register 限制下的 Occupancy [application]

情境:GPU 每 SM 有 65,536 registers、最多 2048 threads。某 kernel 每個 thread 使用 64 個 register。不論 block size 設多少,這個 kernel 最高能達到多少 occupancy?另外,要達 full occupancy,每 thread 至多能用幾個 register?

Question 14 - Control Divergence 的影響隨資料規模變化 [analysis]

情境:同樣用 block size 64 處理向量加法。比較「向量長度 100」與「向量長度 10,000」兩種情況下,邊界檢查造成的 control divergence 對效能的相對影響,並解釋為何不同。

Question 15 - Performance Cliff:Register 用量的權衡 [analysis]

情境:一個 kernel 原本每 thread 用 31 registers、block size 512,在每 SM(2048 threads、65,536 registers)上跑出 100% occupancy。程式設計師多宣告兩個自動變數,使每 thread 變成 33 registers。請分析 occupancy 會如何變化,並說明這個「performance cliff」的成因與啟示。