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