工)
本章目標(biāo)先在腦子里建立SDMA 是什么、為什么需要它、它到底干哪幾件事的直覺(jué)。讀完本章你應(yīng)該能用一句話(huà)向別人解釋 SDMA。1.1 一句話(huà)定義SDMASystem DMA是 GPU 上一組獨(dú)立于圖形GFX和計(jì)算Compute引擎之外的專(zhuān)用DMA 引擎負(fù)責(zé)在后臺(tái)異步地搬運(yùn)數(shù)據(jù)和更新頁(yè)表?!癝ystem DMA” 里的 System強(qiáng)調(diào)它擅長(zhǎng)在系統(tǒng)內(nèi)存system memory與顯存VRAM之間搬運(yùn)數(shù)據(jù)DMADirect Memory Access則說(shuō)明它不需要 CPU 逐字節(jié)參與拷貝。1.2 為什么需要一個(gè)專(zhuān)用的 DMA 引擎在沒(méi)有 SDMA 的世界里往顯存里搬數(shù)據(jù)有兩條笨路CPU 親自搬memcpy通過(guò) PCIe BAR 一個(gè)字一個(gè)字地寫(xiě)顯存。慢、占用 CPU、還會(huì)阻塞主線(xiàn)程。讓 GFX 引擎搬圖形引擎當(dāng)然也能做拷貝但它是主力干活的讓它去搬數(shù)據(jù)等于讓主廚去端盤(pán)子——占用了寶貴的圖形/計(jì)算吞吐。SDMA 的價(jià)值就體現(xiàn)在三個(gè)詞上異步asynchronous提交任務(wù)后 CPU 立刻返回去干別的搬運(yùn)在后臺(tái)進(jìn)行。并行parallelSDMA 與 GFX/Compute 是物理上獨(dú)立的硬件單元可以真正同時(shí)工作。渲染的同時(shí)預(yù)取下一幀紋理就是靠它。卸載offload把純搬運(yùn)工作從 CPU 和 GFX 上卸下來(lái)各司其職。一個(gè)經(jīng)典類(lèi)比GFX 引擎是主廚SDMA 是傳菜和備料的幫工。主廚專(zhuān)心炒菜渲染/計(jì)算幫工在旁邊不停地把食材紋理、buffer、頁(yè)表搬到該在的位置兩者互不打斷。1.3 SDMA 到底干哪幾件事在 amdgpu 驅(qū)動(dòng)里SDMA 主要承擔(dān)三類(lèi)職責(zé)。記住這三件事后面所有章節(jié)都是圍繞它們展開(kāi)職責(zé)一內(nèi)存拷貝 / 填充Copy Fill最本職的工作——把一塊內(nèi)存的數(shù)據(jù)搬到另一塊或者用某個(gè)值填滿(mǎn)一塊內(nèi)存。典型場(chǎng)景BOBuffer Object在system memory ? VRAM之間遷移TTM 子系統(tǒng)做顯存騰挪時(shí)的數(shù)據(jù)搬運(yùn)清零一塊新分配的顯存。對(duì)應(yīng)驅(qū)動(dòng)里的amdgpu_buffer_funcsemit_copy_buffer/emit_fill_buffer詳見(jiàn)第 11 章。職責(zé)二頁(yè)表更新Page Table UpdateGPU 有自己的虛擬內(nèi)存VM和多級(jí)頁(yè)表。當(dāng)一段 GPU 虛擬地址的映射發(fā)生變化時(shí)——比如新分配、遷移、解除映射——需要把新的PTE/PDE頁(yè)表項(xiàng)寫(xiě)進(jìn)顯存里的頁(yè)表結(jié)構(gòu)。這件事也交給 SDMA 來(lái)做因?yàn)轫?yè)表更新本質(zhì)上就是往特定地址寫(xiě)一批數(shù)據(jù)正是 DMA 的強(qiáng)項(xiàng)它可以異步進(jìn)行不打斷正在運(yùn)行的計(jì)算任務(wù)SDMA 甚至有專(zhuān)門(mén)的頁(yè)表操作指令PTEPDE一條命令批量更新連續(xù)頁(yè)表項(xiàng)。對(duì)應(yīng)驅(qū)動(dòng)里的amdgpu_vm_pte_funcscopy_pte/write_pte/set_pte_pde詳見(jiàn)第 12 章。這也是 SDMA 與內(nèi)存管理、SVM 產(chǎn)生聯(lián)系的關(guān)鍵。職責(zé)三作為一條標(biāo)準(zhǔn)隊(duì)列參與調(diào)度Ring / IBSDMA 并不是一個(gè)給個(gè)地址就搬的黑盒它對(duì)外表現(xiàn)為一條或多條ring環(huán)形命令隊(duì)列。驅(qū)動(dòng)把要它干的活兒編成一串命令packet寫(xiě)進(jìn) ring硬件從 ring 里取出命令依次執(zhí)行。這意味著 SDMA 完整地融入了 amdgpu 的通用隊(duì)列基礎(chǔ)設(shè)施用ring buffer傳遞命令用IBIndirect Buffer間接緩沖區(qū)承載較大的命令流用fence通知任務(wù)完成接入GPU scheduler參與統(tǒng)一調(diào)度。這一層是理解軟件實(shí)現(xiàn)的鑰匙詳見(jiàn)第 6 章、第 8 章。1.4 與其它搬運(yùn)方式的對(duì)比搬運(yùn)方式是否占用 CPU是否占用 GFX是否異步典型用途CPU memcpy走 BAR是否否小數(shù)據(jù)、初始化GFX 引擎拷貝否是是與渲染耦合的搬運(yùn)SDMA否否是大塊搬運(yùn)、頁(yè)表更新、遷移結(jié)論很直接只要是純搬運(yùn)或頁(yè)表維護(hù)且希望不打斷計(jì)算/渲染就應(yīng)該走 SDMA。1.5 一張圖先建立全局觀(guān)amdgpu 驅(qū)動(dòng)doorbell 通知SDMA 硬件引擎 (多實(shí)例)讀取命令流 → 執(zhí)行 拷貝/填充/頁(yè)表寫(xiě) → 觸發(fā) fence 中斷BO 遷移 / TTMVM 頁(yè)表更新通用提交buffer_funcsvm_pte_funcsring/IB 提交SDMA ring 命令隊(duì)列圖里的每一個(gè)方框后面都會(huì)有專(zhuān)門(mén)的章節(jié)展開(kāi)?,F(xiàn)在你只需要記住這個(gè)從上層用例匯聚到ring再交給硬件執(zhí)行的大致流向。1.6 本章小結(jié)SDMA 是 GPU 上獨(dú)立、異步、專(zhuān)用的 DMA 引擎與 GFX/Compute 并行工作。它干三件事① 內(nèi)存拷貝/填充 ② 頁(yè)表更新 ③ 作為 ring 參與調(diào)度。它存在的意義是把純搬運(yùn)和頁(yè)表維護(hù)從 CPU、GFX 上卸載下來(lái)讓各引擎各司其職。頁(yè)表更新這一職責(zé)是 SDMA 連接到VM / SVM 內(nèi)存管理的橋梁是本系列的重點(diǎn)伏筆。下一章預(yù)告我們進(jìn)入硬件模型看看 ring buffer 的 RPTR/WPTR 指針、doorbell 敲門(mén)機(jī)制以及一個(gè)實(shí)例兩條隊(duì)列的硬件由來(lái)——這些概念是理解軟件實(shí)現(xiàn)的物理基礎(chǔ)。