第四章練習題 (Practice - CUDA Features)

Question 1 - Hardware vs Software Coherency [recall]

如何判別系統屬 hardware-coherent 或 software-coherent?兩者的一致性「粒度」各為何?當 CPU/GPU 頻繁並行存取同一頁時,hardware-coherent 帶來哪兩大優勢?

Question 2 - concurrentManagedAccess = 0 的存取陷阱 [application]

concurrentManagedAccess = 0 的裝置上,你 launch kernel 後未同步就讓 CPU 寫「另一塊」managed 變數,結果 segfault——原因為何?正確做法與更細粒度的替代方案各是什麼?

Question 3 - CUDA Graph 三階段與 Capture 限制 [recall]

CUDA graph 的三個階段各做什麼?stream capture 不能用於哪條 stream(可用哪條)?cudaStreamEndCapture 必須在哪條 stream 呼叫?

Question 4 - Graph Update vs Re-instantiate 與 Conditional 三型 [recall]

什麼情況可用輕量 graph update、什麼情況必須 re-instantiate?三種 conditional node(IF / WHILE / SWITCH)各自的語意為何?

Question 5 - Graph Memory Node 的固定 VA 與記憶體重用 [analysis]

為什麼 graph allocation 即使底層 physical memory 改變、跨多次 instantiate/launch 也不需 graph update?CUDA 在「圖內」與「圖間」又分別如何重用記憶體?

Question 6 - Stream-Ordered Allocator 的動機與跨 stream 規則 [recall]

cudaMallocAsync / cudaFreeAsync 相對 cudaMalloc / cudaFree 解決什麼問題?當配置、使用、釋放分散在不同 stream 時,必須靠什麼保證正確順序?

Question 7 - Cooperative Groups 的 Implicit Group 與 Partition Hazard [recall]

四個 implicit group accessor 是哪些?為什麼 tiled_partition 這類 partition 必須讓 group 內全員執行到,否則會發生什麼?

Question 8 - PDL 的機會性重疊與資料可見性 [analysis]

PDL 讓相依的 secondary kernel 在 primary 完成前提早 launch——為什麼程式正確性「絕不能」建立在兩者一定並行的假設上?少了 cudaGridDependencySynchronize 會出什麼問題?

Question 9 - Green Context 的建立四步驟與並行保證 [recall]

green context 是什麼、建立它需要哪四個步驟?即使為各 GC 分開 provisioned SM 與 work queue,能否保證獨立工作真正並行?

Question 10 - Lazy Loading 雙版本門檻與 Error Log 啟用 [recall]

lazy loading 需同時滿足哪兩個版本門檻、為何 compiler 版本無關?含什麼變數的 module 仍會 eager 載入?啟用 Error Log 用哪個環境變數?

Question 11 - Async Barrier 的 init、arrive/wait 分離與 Parity [recall]

cuda::barrierinit() 第二個參數是什麼?為何 arrive() 不阻塞而只有 wait() 阻塞?even / odd phase 的 parity 值各為何?

Question 12 - Pipeline 的 Warp Entanglement 與 Over-wait [analysis]

在 fully diverged 的 warp 中,每個 thread 為何可能「over-wait」等到比自己預期更多、更新的 batch?該如何避免?

Question 13 - LDGSTS 的方向、大小與預設等待語意 [recall]

LDGSTS 起始的 compute capability、唯一支援的方向為何?複製 4/8 bytes 與 16 bytes 在 L1 行為上有何差別?預設每個 thread 等待誰的複製?

Question 14 - TMA 的兩種模式與讀寫完成機制 [recall]

TMA 的兩種模式各適用什麼資料、是否需要 tensor map?讀(global → shared)與寫(shared → global)的完成機制各是什麼?

Question 15 - STAS 的方向、大小與完成機制 [recall]

STAS 唯一支援的資料流向、單次複製大小、最低 compute capability 各為何?它用什麼標示完成、透過哪個 API 暴露?

Question 16 - Cluster Launch Control 與 Work Stealing 的 UB 規則 [recall]

Cluster Launch Control 在哪個架構引入、結合哪兩種傳統 grid 配置策略的優點?它的核心動作是什麼?「觀察到取消失敗後再發 request」為何是 UB?

Question 17 - L2 hitRatio 與 Cache Thrashing [application]

set-aside 為 16KB、access policy window 為 32KB,你把 hitRatio 設成 1.0 卻發現效能不佳——硬體發生什麼?改用 0.5 為何較好?

Question 18 - Memory Synchronization Domains 與 Fence Interference [analysis]

一個本地運算 kernel 與一個並行的 NCCL 通訊 kernel 為何會互相拖慢?memory synchronization domains 如何緩解?跨 domain 的 ordering 需要什麼 scope 的 fence?

Question 19 - IPC 為何交換 Handle 與 Legacy 限制 [recall]

為什麼跨 process 要交換的是「handle」而非 device pointer?Legacy CUDA IPC API 有哪些主要限制?cudaMalloc 子分配的風險與對策為何?

Question 20 - VMM 的 SetAccess 與釋放順序 [application]

你用 VMM 把實體記憶體 cuMemMap 到保留好的 VA 後,kernel 一存取就 crash——漏了哪一步?釋放時三個函式的正確順序為何?

Question 21 - EGM 的位置識別與多節點 Handle [recall]

EGM 用什麼識別記憶體放置位置(注意不是什麼)、用哪個屬性取得?它支援哪兩種 allocator?多節點 multi-GPU 額外需要設定哪種 handle type?

Question 22 - Dynamic Parallelism 的非法指標與取回 Child 結果 [application]

你在 parent kernel 內把區域變數 int x_array[10] 的位址當參數傳給 child kernel launch——為什麼非法?CDP2 下又要如何在 parent 退出前取回 child 的結果?

Question 23 - Graphics Interop 生命週期與 Per-context 註冊 [recall]

存取 OpenGL / Direct3D 資源的六步驟生命週期順序為何、哪些步驟可多次?register 為何只該每資源每 context 做一次、可否跨 context 共用?

Question 24 - External Interop 的 Handle 所有權與 Dedicated Flag [application]

你從 Vulkan / D3D12 匯入外部記憶體,匯入端用 Linux file descriptor 與 Windows NT handle 時,handle 的「所有權」處理有何不同?匯入 D3D12 資源一定要設哪個 flag?

Question 25 - cuGetProcAddress 的精確版本與兩個失敗碼 [analysis]

為何傳給 cuGetProcAddress 的版本引數要「精確」對應 typedef、不能用 cuDriverGetVersion 的回傳值?成功回傳但 driverStatusVERSION_NOT_SUFFICIENTSYMBOL_NOT_FOUND 各代表什麼?