14 Dispatch, Dispatch, Dispatch

著名的 Nvidia 的“Batch, Batch, Batch”建议是具有大量小物体的场景的必备配方。诀窍在于将小型绘制调用组合在一起,因此 GPU 始终有三角形需要处理,而无需等待 CPU。这在 D3D9 的时候是必不可少的。希望现代网格着色器或实例化能够在现代 API 和 GPU 上很好地处理小批量任务。

但是计算呢?一百个空的计算着色器就可以了。一千是一个可能花费高达 10 毫秒的问题,特别是如果着色器是间接的。API 并没有试图解决这个问题。我们仍然没有可调用的着色器和multiDispachIndirect()。我们能用它做什么呢?是的,老套的“批量、批量、批量”又来了。

Tellusim 管道完全由 GPU 驱动,这意味着我们有大量的调度。当我们只有几个对象时,GPU 驱动的管道比 CPU 驱动的管道慢。当场景不那么简单时,它真的很闪耀。我们有来自计算着色器调度的固定开销。对于单视口或多视口渲染,这种开销是相同的,因为我们正在为每个计算着色器调用执行“调度,调度,调度”。这使得立体或多视口渲染比串行渲染更快,因此我们可以轻松地从单个 GPU 处理多个耳机或连接尽可能多的显示器。

具有独特材质的 21K 动态对象、具有四个分割 PSSM 阴影贴图的灯光、六个 1024×1024 视口和零 CPU 负载:

VK 串行/并行D3D12串行/并行D3D11 串行/并行GL串行/并行金属串行/并行
英伟达精视3090163/255帧/秒159/209帧/秒64/112帧139/224帧/秒
GeForce 2080 钛94/169 帧/秒129/167 帧/秒76/114帧/秒不适用
Radeon 6900 XT180/211帧/秒162/188帧156/180帧/秒165/188帧/秒
Radeon 6700 XT126/142帧/秒127/139帧/秒122/136帧/秒132/146帧/秒
Radeon 660066/74 帧/秒
英特尔Arc A38029/31 帧2/3 帧/秒5/5 帧/秒不适用
苹果M1 Max58/71 帧/秒
苹果M125/27 帧/秒

我们在 Nvidia 上的性能提高了 50%。我们的建议很简单:将相同计算着色器的调度组合在一起,并最大限度地减少计算着色器切换的数量。因为aDD一个Db : D比a : D , D慢;DD

留下评论

您的邮箱地址不会被公开。 必填项已用 * 标注