2022-07-30 –, TR311
Language: 漢語
利用 Opentuner 結合輕量化的 Python script,找到如何在 CUDA Code 中,添加正確的 Unified Memory Advice 以及 Prefetch,提供更便捷的程式撰寫方式,並帶來良好的效能。
傳統CUDA的 Explicit Data Movement 的方式,需要工程師自行管理 GPU 和 CPU 之間的搬運,且當資料大小超過 GPU 本身記憶體的大小時(稱之為 GPU Memory Oversubscription),則無法執行。在CUDA 6.0後,CUDA 增加了 Unified Memory (UM),將 CPU 和 GPU 的記憶體視為同一空間,工程師不再需要自行管理資料搬移。
UM 的好處是書寫程式碼上更為容易,並且支援 GPU Memory Oversubscription,然而因為其採用 On-demand Page Migration,意即當GPU需要使用資料時,才會將物件從CPU的記憶體搬移到GPU上,使效能相比之前大幅下降。為此,CUDA 提供了許多 UM 的進階 API,如 cudaMemAdvise,讓使用者可以提供 UM Driver 記憶體存取特性的提示,或是 cudaMemPrefetchAsync,讓 GPU 提前將物件預取到記憶體中。但是該如何使用這些 UM 的 API,卻也是一大難題,不正確的使用可能會讓效能更糟。
本議程將會探討 CUDA 提出的 cudaMemAdvise 以及 cudaMemPrefetchAsync 會對程式帶來什麼影響,並且闡述我們的方法,結合Opentuner開源框架,自動找到如何設定 UM 參數。如此一來,使用者除了可以同時享受 UM 帶來的書寫便利,也可以避免因使用 UM 而造成效能大幅度的下降。
Skilled
Target Audience –對於計算機結構、程式有基礎認識者
Hi,我是 YuweiTT,現在還是一名學生,希望可以將研究的想法,分享給大家~