記憶體架構與資料局部性 練習題 (Practice - Memory Access Efficiency and CUDA Memory Types)

Question 1 - Compute-to-Memory Ratio 定義 [recall]

情境/題目:什麼是 compute-to-global-memory-access ratio?以 Ch.3 naive 矩陣乘法 kernel 的內層 dot-product 迴圈計算其數值,並說明它的別名。

Question 2 - 為何 Naive Matmul 是 Memory-Bound [recall]

情境/題目:A100 的 peak global memory bandwidth = 1555 GB/s,FP32 peak = 19,500 GFLOPS。為何 0.25 OP/B 的 matmul kernel 被稱為 memory-bound?算出它能達到的吞吐量上限。

Question 3 - CUDA 記憶體類型 Scope 與 Lifetime [recall]

情境/題目:列出 自動純量變數自動陣列變數__shared____device____constant__ 各落在哪種記憶體,以及其 scope 與 lifetime。

Question 4 - Register 為何比 Global Memory 快 [recall]

情境/題目:給出三個理由,說明為何把 operand 放在 register 比放在 global memory 快。

Question 5 - Tiling 的減量因子 [recall]

情境/題目:對 N×N 矩陣乘法,每個輸入元素被從 global memory 請求幾次?(a) 無 tiling;(b) 使用 T×T tile。並說明 16×16 tile 把 ratio 提升到多少。

Question 6 - 兩個 __syncthreads() 防的 Hazard [recall]

情境/題目:tiled matmul kernel 在「載入 tile 後」與「用完 tile 後」各有一個 __syncthreads()。各防止哪種資料相依?哪個是 true / false dependence?

Question 7 - 越界邊界檢查 [recall]

情境/題目:當矩陣寬度不是 TILE_WIDTH 的整數倍時,為何需要邊界檢查?需要幾組獨立檢查?越界載入該填什麼值?

Question 8 - 計算 Shared Memory 對 Occupancy 的限制 [application]

情境/題目:A100 每 SM 最多 164 KB shared memory、最多 2048 threads。某 kernel 每 block 用 32 KB shared memory、256 threads。它能否達到 full occupancy?最大 occupancy 約多少?

Question 9 - 判斷 Memory-Bound 或 Compute-Bound [application]

情境/題目:某 kernel 每 thread 做 36 個 FLOP 與 7 次 32-bit global memory 存取。判斷在以下兩種裝置上是 memory-bound 還是 compute-bound:(a) peak 200 GFLOPS、100 GB/s;(b) peak 300 GFLOPS、250 GB/s。

Question 10 - Naive vs Tiled Matmul 的效能取捨 [analysis]

情境/題目:比較 naive 與 tiled (16×16) 矩陣乘法在 A100 上的吞吐量。為何 tiling 有效?tiled 版仍只達峰值 32%,根本原因是什麼,可如何進一步改善?

Question 11 - 為何用 Shared Memory 而非 Register 持有載入值 [analysis]

情境/題目:假設 register 與 shared memory 容量都不是問題,為何在 tiled matmul 中要用 shared memory(而非 register)來持有從 global memory 載入的 M、N 元素?

Question 12 - GPU 顯式 Shared Memory vs CPU 隱式 Cache [analysis]

情境/題目:tiling/blocking 在 CPU 與 GPU 都能提升效能。為何 GPU 需要顯式用 shared memory,而 CPU 可依賴隱式 cache?

Question 13 - Strip-mining 與 Phase 數 [recall]

情境/題目:tiled matmul kernel 的外層迴圈用到一種叫 strip-mining 的技術。strip-mining 是什麼?對 Width×Width 矩陣、tile 寬 TILE_WIDTH,dot product 會分成幾個 phase?

Question 14 - Constant 變數與動態 Shared Memory [recall]

情境/題目:(a) constant 變數的 scope、lifetime、容量上限與 device 端存取權限為何?(b) 若想在執行期(不重新編譯)依硬體調整 shared memory 大小,需要哪三項配合?

Question 15 - 計算變數的版本數 [application]

情境/題目:kernel 以 1000 個 thread block、每 block 512 threads 啟動。在整個 kernel 執行生命週期中:(a) 一個宣告為 local 的變數會產生幾份?(b) 一個宣告為 shared memory 的變數會產生幾份?