效能考量 練習題 (Practice - Performance Considerations)


Question 1 - 為什麼 DRAM 很慢 [recall]

情境/題目:從硬體角度說明為什麼 DRAM 的存取延遲約為「數十奈秒」,而且這個延遲長年來並未隨製程進步而下降?

Question 2 - DRAM Burst 的意義 [recall]

情境/題目:什麼是 DRAM burst?為什麼「聚焦使用 burst 內的資料」能讓 DRAM 的供給速率遠高於隨機存取?

Question 3 - Memory Coalescing 的定義 [recall]

情境/題目:用一句話定義 memory coalescing,並說明為什麼「同一個 warp 內的 threads」是進行合併(carpool 共乘)的完美候選者。

Question 4 - Row-Major 與 Stride 口訣 [recall]

情境/題目:C/CUDA 的多維陣列以什麼順序線性化?要快速判斷某個 global memory 存取是否 coalesced,有什麼一行口訣?

Question 5 - Banks 與 Channels 的角色 [recall]

情境/題目:DRAM 系統中 channel 與 bank 各是什麼?除了 burst 之外,它們各自提供哪種平行性?

Question 6 - DDR 頻寬公式 [recall]

情境/題目:寫出 DDR bus 的頻寬計算公式,並解釋「DDR」為什麼能在固定時脈下提供雙倍傳輸。

Question 7 - 為何需要多個 Bank [recall]

情境/題目:若 cell array 存取延遲與資料傳輸時間的比值為 R,單一 bank 的 bus 利用率是多少?要跑滿 bus 至少需要幾個 bank?為什麼實務上 bank 數還要更多?

Question 8 - Interleaved Distribution 與 Occupancy [recall]

情境/題目:interleaved data distribution 把陣列元素灑到 channel/bank 的順序為何?另外,要把 DRAM 頻寬「跑滿」需要同時滿足哪三個條件?

Question 9 - Thread Coarsening 的定義與陷阱 [recall]

情境/題目:什麼是 thread coarsening?COARSE_FACTOR 與 coarsening loop 各代表什麼?套用時要避免哪三個陷阱?

Question 10 - 優化清單與資源權衡 [recall]

情境/題目:列出 Table 6.1 的六項通用優化。所有優化共同的「本質」是什麼?在套用任何優化前必須先做什麼?

Question 11 - 判斷存取是否合併 [application]

情境/題目:矩陣乘法中,col = blockIdx.x*blockDim.x + threadIdx.x。索引 M[k*Width + col]M[col*Width + k] 各自是否 coalesced?若 M 因 column-major 而 uncoalesced,要如何修正?

Question 12 - 頻寬與 Bank 利用率計算 [application]

情境/題目:某 GPU 需要 256 GB/s 頻寬,單一 64-bit DDR channel @ 1 GHz 提供多少頻寬?需要幾個 channel?若 cell array 延遲與傳輸時間比 R=20,單 bank 利用率與「跑滿 bus 所需 bank 數」各是多少?

Question 13 - Coarsening 索引與 OP/B [application]

情境/題目:在 coarsened tiled matmul 中,寫出第一個負責 column 的 colStart。並比較三種 matmul kernel 的算術強度 (OP/B):simple、tiled 32×32、tiled 32×32 + COARSE_FACTOR 4。

Question 14 - Coalesced vs Uncoalesced 與 Corner Turning [analysis]

情境/題目:比較 coalesced 與 uncoalesced 存取在「對 DRAM 的請求數」與「burst 利用」上的差異,並分析 corner turning 為何能在不犧牲效能的情況下解決 column-major 輸入的 uncoalesced 問題——它「用什麼換什麼」?

Question 15 - Thread Coarsening 何時划算 [analysis]

情境/題目:最細粒度平行化提供 transparent scalability,為何還要做 thread coarsening?在什麼條件下 coarsening 才划算、什麼時候反而白費?用 tiled matmul 與 vector addition 對比說明。