這篇文章介紹了 NVIDIA GPUs 上命令緩沖區(qū)的最佳實踐。要在應(yīng)用程序中獲得高且一致的幀速率,請參閱所有高級 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è)置和重置命令列表會帶來成本。
為了高效地提交并行工作,您仍然需要合理數(shù)量的命令列表。
圍欄出于各種原因(多個命令隊列、拾取查詢結(jié)果等)強制拆分命令列表。
嘗試將目標設(shè)定為每幀 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 隊列上的圖形或計算工作與專用異步計算隊列上的計算工作重疊。
請記住,即使對于理論上可以與其他圖形或計算任務(wù)并行運行的計算任務(wù), 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)常混合使用繪圖、分派和復制命令。
嘗試將所有繪制命令組合在一起,并將命令分派到一起,依此類推。
在同一隊列上頻繁混合不同類型的工作可能會導致管道排水。
不要創(chuàng)建太多線程或太多命令列表。
太多的線程超額訂閱 CPU 資源,而太多的命令列表可能會積累太多的開銷。
關(guān)于作者
Wessam Bahnassi 在 3D 引擎設(shè)計和優(yōu)化方面有 20 年的經(jīng)驗。他最新發(fā)布的游戲包括《蝙蝠俠:阿卡姆騎士》和他自己的 120-FPS PSVR 太空射擊游戲超空。他是 ShaderX / GPU Pro / GPU Zen 系列書籍的撰稿人和章節(jié)編輯。他目前在 NVIDIA 的工作包括進行優(yōu)化,并為該公司的幾個很酷的研究項目做出貢獻。
審核編輯:郭婷
-
cpu
+關(guān)注
關(guān)注
68文章
10883瀏覽量
212305 -
NVIDIA
+關(guān)注
關(guān)注
14文章
5038瀏覽量
103305
發(fā)布評論請先 登錄
相關(guān)推薦
評論