# 友達課程:Accelerated Computing and CUDA(2) - 課後測驗問答集 1. 關於 Warp 的執行特性,下列敘述何者最為精確? - A:Warp 中的執行緒可以獨立執行完全不同的指令而不影響效能 - B:Warp 的大小通常由軟體在 Kernel 啟動時動態決定 - C:在 SIMT 架構下,若 Warp 內的執行緒進入不同的分支路徑(If-Else),會發生序列化執行,導致效能下降 - D:Warp Scheduler 會在每個 Clock Cycle 強制將資料從 Global Memory 搬移到 Shared Memory > 答案:C > 解說:CUDA 採用 SIMT(單指令多執行緒)架構。一個 Warp(通常是 32 個 threads)共享同一個 Program Counter。如果 Warp 內的 threads 遇到分支條件不一致(Warp Divergence),硬體必須序列化執行每一條路徑,並遮罩掉不該執行的 threads,直到路徑合併,這會顯著降低效能。 2. 在 NVIDIA GPU 架構中,關於 Global Memory 存取優化的關鍵是? - A:儘量使用隨機存取模式以分散頻寬壓力 - B:總是透過 CPU 進行資料預取(Prefetch) - C:確保 Warp 內的執行緒存取連續且對其的記憶體位址,以觸發 Coalesced Access(合併存取) - D:強制將所有變數宣告為 volatile 以加速讀取 > 答案:C > 解說:Global Memory 的頻寬利用率取決於存取模式。當 Warp 內的 threads 讀取連續且對齊的記憶體區塊時,硬體能將這些請求合併成最少數量的 Transactions (合併存取),這是提升頻寬利用率的最重要手段。 3. 關於 Shared Memory(共享記憶體)的 Bank Conflict,下列何者正確? - A:Bank Conflict 只會發生在不同 Block 之間 - B:增加 Register 的數量可以解決 Bank Conflict - C:當 Warp 內的多個執行緒試圖同時存取同一個 Bank 的不同位址時,存取會被序列化 - D:現代 GPU 已經完全移除了 Bank 的設計,因此不再有衝突問題 > 答案:C > 解說:Shared Memory 被劃分為多個 Banks(通常是 32 個)。若一個 Warp 內的 threads 在同一週期內存取「同一個 Bank」中的「不同位址」,硬體無法同時服務,必須排隊(序列化)處理,這就是 Bank Conflict。 4. 關於 CUDA Streams 的敘述,何者正確? - A:所有的 CUDA Kernel 預設都是並行執行的,不需要 Streams - B:不同的 Streams 之間絕對無法進行資料交換 - C:不同 Streams 中的操作(如 Kernel 執行與 Memcpy)有機會在硬體資源允許下重疊執行(Overlap),以隱藏延遲 - D:使用多個 Streams 會導致 GPU 核心頻率降低 > 答案:C > 解說:CUDA Streams 是包含一系列指令的佇列。屬於不同 Streams 的指令可以亂序或並行執行。利用這一點,可以讓 Stream A 進行計算時,Stream B 進行資料傳輸(PCIe bus),達成 Compute-Copy Overlap,提升整體吞吐量。 5. 關於 Warp Divergence 的優化策略,下列何者較佳? - A:完全不使用任何 if-else 語句 - B:增加 Warp 的大小至 64 或 128 - C:盡量讓同一個 Warp 內的執行緒走相同的分支路徑,例如依照 Thread ID 進行資料分塊處理 - D:總是使用遞迴函式來取代迴圈 > 答案:C > 解說:分支發散無法完全避免,但可以管理。如果控制流(if 條件)是基於 Thread ID 的大區塊(例如 thread 0-31 走 true,32-63 走 false),則 Warp 內部不會發散。應避免基於隨機資料內容的分支條件。 6. NVIDIA GPU 中的 Tensor Cores 主要用途為何? - A:處理高精度的 128-bit 浮點數運算 - B:專門用於處理圖形渲染的光影追蹤 - C:專門加速矩陣乘法與累加運算(Matrix Multiply-Accumulate, MMA),特別針對深度學習的混合精度計算 - D:用於加速 Global Memory 的資料轉移 > 答案:C > 解說:Tensor Cores 是特定架構(Volta 以後)引入的專用運算單元,能在一個 Clock cycle 內完成 4x4 或更大的矩陣乘加運算(D = A * B + C),是現代 AI 推論與訓練的核心加速引擎。 7. 當我們談論 CUDA 的 “Latency Hiding“,主要是透過什麼機制? - A:透過超頻 GPU 核心時脈 - B:使用快取預取技術 - C:透過大量的活躍 Warps 進行快速切換(Context Switch),當一組 Warp 等待記憶體時,立即執行另一組 Warp 的運算指令 - D:減少 Kernel 的指令總數 > 答案:C > 解說:GPU 的設計哲學是 Throughput Oriented。它不依賴巨大的 Cache 來降低 Latency,而是依賴大量的 Threads。當 Warp A 讀取記憶體需要 500 cycles 時,Scheduler 會零成本切換到 Warp B, C, D… 執行運算,掩蓋掉那 500 cycles 的等待時間。 8. Dynamic Parallelism 指的是什麼功能? - A:CPU 動態調整 GPU 的時脈與電壓 - B:在執行過程中動態改變 Block 的大小 - C:允許 GPU 上的 Kernel 直接啟動新的 Kernel(Child Kernel),無需回傳 CPU 處理,適合遞迴或不規則負載的演算法 - D:允許 GPU 動態配置更多的 VRAM > 答案:C > 解說:Dynamic Parallelism 讓 GPU 本身成為 Controller。例如在做 Octree 建構或圖形搜尋時,若某個節點資料量過大,該 thread 可以直接 launch 一個新的 grid 來處理該節點,減少與 Host 的交互往返。 9. 關於 Tiling(區塊化/分塊)技術在矩陣乘法中的應用,核心概念為何? - A:將矩陣切割乘小塊傳回 CPU 計算 - B:將矩陣轉置以符合 Row-major 排列 - C:將全域記憶體的大矩陣分塊載入到 Shared Memory,讓 Block 內的執行緒重複利用這些資料,大幅降低 Global Memory 頻寬需求 - D:將矩陣運算轉換為稀疏矩陣運算 > 答案:C > 解說:這是矩陣乘法優化的方法之一,在矩陣乘法中,每個元素會被多次使用,若每次都從 Global Memory 讀,頻寬會爆炸。Tiling 將子矩陣先搬到 Shared Memory,讓計算單元從高速的 Shared Memory 取值,提升 Compute-to-Memory Ratio。 10. BF16(Bfloat16)格式之所以在 AI 訓練硬體(如 Tensor Cores)中流行,相較於 FP16 的核心優勢是? - A:它具有更高的尾數精度(Mantissa) - B:它佔用的記憶體空間只有 FP16 的一半 - C:它保留了與 FP32 相同的指數位寬(8-bit Exponent),擁有相同的動態範圍,能有效防止訓練過程中的數值溢位(Overflow/Underflow),且易於硬體轉換 - D:它不支援負數運算 > 答案:C > 解說:FP16 精度高但範圍窄(容易溢位)。BF16 犧牲了精度(Mantissa 變短),但把 Exponent 加寬到跟 FP32 一樣,這意味著你可以直接截斷 FP32 的尾數變成 BF16,而不需繁瑣的縮放處理,這對 Deep Learning 訓練的數值穩定性至關重要。