gpt4 book ai didi

unity3d - Unity Compute Shader 中调用 numthreads 和 Dispatch 的区别

转载 作者:行者123 更新时间:2023-12-04 04:01:20 25 4
gpt4 key购买 nike

假设,假设我想使用计算着色器使用 (8, 1, 1) 的线程维度运行 Kernel_X。
我可以将其设置为:
在脚本中:

Shader.Dispatch(Kernel_X, 8, 1, 1);
在着色器中:
[numthreads(1,1,1)]
void Kernel_X(uint id : SV_DispatchThreadID) { ... }
或者我可以这样设置:
在脚本中:
Shader.Dispatch(Kernel_X, 1, 1, 1);
在着色器中:
[numthreads(8,1,1)]
void Kernel_X(uint id : SV_DispatchThreadID) { ... }
我知道在这段代码的最后,维度会是 (8, 1, 1);然而,我想知道如何切换数字实际上彼此不同。我的猜测是,运行 Dispatch (Kernel_X, 8, 1, 1) 会“运行” 1x1x1 内核 8 次,而运行 numthreads(8,1,1) 会运行 8x1x1 内核一次。

最佳答案

要了解差异,需要一些硬件知识:
在内部,GPU 在所谓的波前上工作,它们是 SIMD 风格的处理单元(就像一组线程,每个线程可以拥有自己的数据,但它们都必须在完全相同的时间执行完全相同的指令,总是)。每个波前的线程数取决于硬件,但通常为 32 (NVidia) 或 64 (AMD)。
现在,与 [numthreads(8,1,1)]您请求一个大小为 8 x 1 x 1 = 8 个线程的着色器线程组,硬件可以在其波阵面之间自由分配。因此,每个波前有 32 个线程,硬件会为每个着色器组安排一个波前,在该波前有 8 个事件线程(其他 24 个线程是“非事件”的,这意味着它们执行相同的工作,但会丢弃任何内存写道)。然后,用 Dispatch(1, 1, 1) ,您正在调度一个这样的着色器组,这意味着硬件上将运行一个波前。
你会用 [numthreads(1,1,1)]相反,波阵面中只有一个线程可以处于事件状态。因此,通过调用 Dispatch(8, 1, 1)在那个上,硬件需要运行 8 个着色器组(= 8 个波前),每个着色器组只运行 1/32 个事件线程,所以虽然你会得到相同的结果,但你会浪费更多的计算能力。
因此,一般来说,为了获得最佳性能,您希望着色器组大小为 32(或 64)的倍数,同时尝试以尽可能低的数字调用 Dispatch。

关于unity3d - Unity Compute Shader 中调用 numthreads 和 Dispatch 的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63034523/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com