這篇文章介紹了 NVIDIA GPU s 上命令緩沖區的最佳實踐。要在應用程序中獲得高且一致的幀速率,請參閱所有高級 API 性能提示.
命令緩沖區是從 CPU 發送要在 GPU 上執行的命令的主要機制。通過遵循本文列出的最佳實踐,您可以通過最大化并行性、避免瓶頸和減少 GPU 上的空閑時間,在 CPU 和 GPU 上實現性能提升。
推薦
- 接受您負責實現和控制 GPU / CPU 并行性的事實。
- 向命令列表提交工作不會啟動 GPU 上的任何工作。
- 對
ExecuteCommandList
的調用最終在 GPU 上開始工作。
- 在多個線程和內核上并行并均勻地將工作記錄到多個命令列表中。
- 錄制命令是一項 CPU 密集型操作,沒有驅動程序線程來拯救。
- 命令列表不是自由線程,因此并行工作提交意味著提交多個命令列表。
- 請注意,設置和重置命令列表會帶來成本。
- 為了高效地提交并行工作,您仍然需要合理數量的命令列表。
- 圍欄出于各種原因(多個命令隊列、拾取查詢結果等)強制拆分命令列表。
- 嘗試將目標設定為每幀 5-10 次
ExecuteCommandList
調用,并進行足夠的 GPU 工作,以隱藏每次ExecuteCommandList
調用的操作系統調度開銷。- 在上一次
ExecuteCommandList
調用之后,操作系統需要 50-80 微秒來安排命令列表。如果調用中的命令列表執行速度快于此,則硬件隊列中存在氣泡。
- 使用
GPUView
檢查氣泡。
- 在上一次
- 您可以將 3D 隊列上的圖形或計算工作與專用異步計算隊列上的計算工作重疊。
- 請記住,即使對于理論上可以與其他圖形或計算任務并行運行的計算任務, GPU 上并行工作的實際調度細節也可能不會產生期望的結果。
- 注意哪些異步計算和圖形工作負載可以一起調度。使用圍欄將正確的工作負載配對。
- 使用
ExecuteIndirect
靈活性最大限度地將 CPU 工作卸載到 GPU 并減少 CPU – GPU 同步點。- 請使用
ExecuteIndirect
將場景消隱系統移植到 GPU 。
- 使用
ExecuteIndirect
計數緩沖區來控制命令的數量,而不是發出最大數量的命令并單獨預測未使用的命令。
- NVIDIA 在
ExecuteIndirect
的Vulkan下為ExecuteIndirect
提供附加功能
- 請使用
不推薦
- 幀描述符堆中的 CBV / SRV / UAV 描述符或 2K 采樣器不要超過 100 萬個。
- 不要阻止
ExecuteCommandList
呼叫。ExecuteCommandList
打電話可能會很貴。同時,可以在其他線程上記錄新命令。
- 每個命令隊列都可以使用自己的線程來提交
ExecuteCommandList
。
- 不要只在幾個命令列表中記錄所有內容或大型場景部分。這限制了您充分使用所有 CPU 內核的能力。
- 此外,構建幾個大的命令列表意味著您可能會發現很難讓 GPU 保持空閑狀態。
- 不要只在錄制完所有內容后才提交。您可能會浪費使 GPU 與其他命令列表的錄制并行工作的機會。
- 不要期望大量的列表重用。
- 在對象可見性等方面,每幀通常有許多更改。
- 后處理可能是一個例外。
- 不要經常混合使用繪圖、分派和復制命令。
- 嘗試將所有繪制命令組合在一起,并將命令分派到一起,依此類推。
- 在同一隊列上頻繁混合不同類型的工作可能會導致管道排水。
- 不要創建太多線程或太多命令列表。
- 太多的線程超額訂閱 CPU 資源,而太多的命令列表可能會積累太多的開銷。
?
?