這篇文章介紹了 NVIDIA GPUs 上命令緩沖區(qū)的最佳實踐。要在應用程序中獲得高且一致的幀速率,請參閱所有高級 API 性能提示。
命令緩沖區(qū)是從 CPU 發(fā)送要在 GPU 上執(zhí)行的命令的主要機制。通過遵循本文列出的最佳實踐,您可以通過最大化并行性、避免瓶頸和減少 GPU 上的空閑時間,在 CPU 和 GPU 上實現(xiàn)性能提升。
推薦
接受您負責實現(xiàn)和控制 GPU / CPU 并行性的事實。
向命令列表提交工作不會啟動 GPU 上的任何工作。
對ExecuteCommandList的調(diào)用最終在 GPU 上開始工作。
在多個線程和內(nèi)核上并行并均勻地將工作記錄到多個命令列表中。
錄制命令是一項 CPU 密集型操作,沒有驅(qū)動程序線程來拯救。
命令列表不是自由線程,因此并行工作提交意味著提交多個命令列表。
請注意,設置和重置命令列表會帶來成本。
為了高效地提交并行工作,您仍然需要合理數(shù)量的命令列表。
圍欄出于各種原因(多個命令隊列、拾取查詢結(jié)果等)強制拆分命令列表。
嘗試將目標設定為每幀 5-10 次ExecuteCommandList調(diào)用,并進行足夠的 GPU 工作,以隱藏每次ExecuteCommandList調(diào)用的操作系統(tǒng)調(diào)度開銷。
在上一次ExecuteCommandList調(diào)用之后,操作系統(tǒng)需要 50-80 微秒來安排命令列表。如果調(diào)用中的命令列表執(zhí)行速度快于此,則硬件隊列中存在氣泡。
使用GPUView檢查氣泡。
您可以將 3D 隊列上的圖形或計算工作與專用異步計算隊列上的計算工作重疊。
請記住,即使對于理論上可以與其他圖形或計算任務并行運行的計算任務, GPU 上并行工作的實際調(diào)度細節(jié)也可能不會產(chǎn)生期望的結(jié)果。
注意哪些異步計算和圖形工作負載可以一起調(diào)度。使用圍欄將正確的工作負載配對。
使用ExecuteIndirect靈活性最大限度地將 CPU 工作卸載到 GPU 并減少 CPU – GPU 同步點。
請使用ExecuteIndirect將場景消隱系統(tǒng)移植到 GPU 。
使用ExecuteIndirect計數(shù)緩沖區(qū)來控制命令的數(shù)量,而不是發(fā)出最大數(shù)量的命令并單獨預測未使用的命令。
NVIDIA 在ExecuteIndirect的Vulkan下為ExecuteIndirect提供附加功能
不推薦
幀描述符堆中的 CBV / SRV / UAV 描述符或 2K 采樣器不要超過 100 萬個。
不要阻止ExecuteCommandList呼叫。
ExecuteCommandList打電話可能會很貴。同時,可以在其他線程上記錄新命令。
每個命令隊列都可以使用自己的線程來提交ExecuteCommandList。
不要只在幾個命令列表中記錄所有內(nèi)容或大型場景部分。這限制了您充分使用所有 CPU 內(nèi)核的能力。
此外,構(gòu)建幾個大的命令列表意味著您可能會發(fā)現(xiàn)很難讓 GPU 保持空閑狀態(tài)。
不要只在錄制完所有內(nèi)容后才提交。您可能會浪費使 GPU 與其他命令列表的錄制并行工作的機會。
不要期望大量的列表重用。
在對象可見性等方面,每幀通常有許多更改。
后處理可能是一個例外。
不要經(jīng)?;旌鲜褂美L圖、分派和復制命令。
嘗試將所有繪制命令組合在一起,并將命令分派到一起,依此類推。
在同一隊列上頻繁混合不同類型的工作可能會導致管道排水。
不要創(chuàng)建太多線程或太多命令列表。
太多的線程超額訂閱 CPU 資源,而太多的命令列表可能會積累太多的開銷。
關(guān)于作者
Wessam Bahnassi 在 3D 引擎設計和優(yōu)化方面有 20 年的經(jīng)驗。他最新發(fā)布的游戲包括《蝙蝠俠:阿卡姆騎士》和他自己的 120-FPS PSVR 太空射擊游戲超空。他是 ShaderX / GPU Pro / GPU Zen 系列書籍的撰稿人和章節(jié)編輯。他目前在 NVIDIA 的工作包括進行優(yōu)化,并為該公司的幾個很酷的研究項目做出貢獻。
審核編輯:郭婷
-
cpu
+關(guān)注
關(guān)注
68文章
11300瀏覽量
225445 -
NVIDIA
+關(guān)注
關(guān)注
14文章
5661瀏覽量
109940
發(fā)布評論請先 登錄
C語言的緩沖區(qū)(緩存)詳解
CW32L052串口的緩沖區(qū)機制
飛凌嵌入式ElfBoard-標準IO接口之設置緩沖區(qū)
移植的lvgl,在運行的時候,緩沖區(qū)無法釋放怎么解決?
對于CYUSB3014芯片,哪個函數(shù)可以讀取GPIF II端DMA緩沖區(qū)中緩存的實際數(shù)據(jù)量?
如何清除CYUSB3014的緩沖區(qū)數(shù)據(jù)?USB接口數(shù)據(jù)什么時候發(fā)送到電腦?
請問USB緩沖區(qū)取數(shù)據(jù)可以多次取嗎?
socket緩沖區(qū)溢出的原因?怎么解決?
解析RZ/N2L CANFD模塊的緩沖區(qū)機制(2)
解析RZ/N2L CANFD模塊的緩沖區(qū)機制(1)
NVIDIA GPUs上命令緩沖區(qū)的應用實踐
評論