進階實務與未來演進 練習題 (Practice - Model of Host/Device Interaction and Memory Evolution)


Question 1 - 簡單 Host/Device 模型的兩大痛點 [recall]

前面章節假設的「簡單模型」中,device memory 與 host memory 完全分離、只能用 cudaMemcpy() 來回搬資料。請說出此模型在應用層面造成的兩大問題。

Question 2 - Zero-Copy Memory 的配置與頻寬規則 [recall]

Zero-copy memory(CUDA 2.2, 2009)如何配置?為何 host 指標不能直接傳給 kernel?它最適合什麼存取模式?

Question 3 - UVA 解決什麼、又不保證什麼 [recall]

Unified Virtual Addressing(UVA, CUDA 4)相對於先前的記憶體模型帶來什麼改變?它是否保證 host code 能直接存取 device 指標所指的資料?

Question 4 - 32-bit 天花板與 Kepler 的大型位址空間 [recall]

早期 CUDA GPU 的記憶體容量上限是多少、為什麼?Kepler(2013)在虛擬/實體位址上做了什麼改變,又額外開啟了哪種 GPU 間能力?

Question 5 - Unified Memory 與 Kepler/Maxwell 的限制 [recall]

CUDA 6(2013)的 unified (managed) memory 用哪個 API 配置?在 Kepler/Maxwell 世代上有哪三項限制?根本原因是什麼?

Question 6 - Pascal 的 49-bit VA 與 Page Fault Handling [recall]

Pascal(2016)新增哪兩大硬體特性?page fault handling 如何讓 unified memory 不必在每次 launch 前 flush?

Question 7 - Kernel 內函式呼叫與其意義 [recall]

早期 CUDA 為何不支援 recursion、system call、virtual function?Kepler/CUDA 5 起靠什麼機制支援真正的函式呼叫?除了 recursion,這帶來哪些軟體工程效益?

Question 8 - Cooperative Kernels 的並發保證與限制 [recall]

Cooperative kernels(CUDA 11)解決什麼問題?它提供什麼保證、用哪個 API 啟動?為何 block 數不能 oversubscribe?

Question 9 - Double / Half-Precision 速度的演進 [recall]

早期 GPU 的 double-precision 相對 single-precision 慢多少?Fermi 後改善到什麼程度?half-precision(FP16)硬體支援在哪個世代引入?

Question 10 - A100 精度吞吐量計算與選擇 [application]

A100(Ampere)的 FP16 tensor-core 吞吐為 156 TFLOPS、FP32 為 19.5 TFLOPS。(a) FP16 相對 FP32 約快幾倍?(b) 一個醫療影像應用的資料可容忍 16-bit 表示,除了算力,改用 FP16 還在哪個面向受益、原因為何?

Question 11 - 移植含 qsort 與 linked list 的 CPU 程式 [application]

你要把一支使用 malloc/freeqsort()、且資料是 host 上 linked structure 的 CPU 程式移植到 GPU,希望改動最小。(a) 依 Fig 22.1,unified memory 讓 host code 只需改哪兩處?(b) 要讓 GPU kernel 能直接遍歷 host memory 上的 linked list,需要哪個世代/特性,關鍵原理是什麼?

Question 12 - Cluster 的 local/remote 工作排程 [application]

一個 parallel cluster 應用把工作分成 localremote 兩種,remote work 牽涉與其他 node 互動、位於全域進度的 critical path 上。舊 CUDA 系統有什麼兩難?哪個硬體能力解決它、具體怎麼做?

Question 13 - Zero-Copy vs Unified Memory(Pascal)的取捨 [analysis]

比較 zero-copy memory 與 Pascal 起的 unified memory(page fault)在「資料存取方式、能否遍歷指標鏈、資料量上限、coherence」四個面向的差異,並說明為何 unified memory 是更通用的 CPU/GPU 互動機制。

Question 14 - PC Sampling vs Critical Path Analysis [analysis]

CUDA 7.5 的 PC sampling 與 CUDA 8 的 critical path analysis 各解決什麼問題?為什麼「執行時間最長的 kernel」未必是最該優化的對象?這與 Amdahl 思維有何關聯?

Question 15 - 直接 Atomic Scatter vs Prefix-Sum/Sort 轉換 [analysis]

在 histogram 這類 random scatter 計算中,可以直接用 atomic operations,也可以做演算法轉換改用 prefix-sum(scan)或 sorting。隨各世代 atomic 變快,這個取捨如何改變?「atomic 變快」是否代表不再需要任何優化?