HLSL 在代码中获取线程组数和线程数

HLSL Get number of threadGroups and numthreads in code

我的问题涉及 ComputeShader,尤其是 HLSL 代码。因此,DeviceContext.Dispath(X, Y, Z) 产生了 X * Y * Z 个组,每个组在属性 [numthreads(x,y,z)] 中设置了 x * y * z 个单独的线程。问题是,我怎样才能得到分派的线程组总数和组中的线程数?让我解释一下我为什么要它——我打算处理的数据量可能会有很大差异,所以我的方法应该适应输入数组的大小。当然,我可以在常量缓冲区中发送 Dispath 参数以使其在 HLSL 代码中可用,但是组中的线程数呢?我正在寻找 GetThreadGroupNumber()GetThreadNumberInGroup() 之类的方法。感谢您的帮助。

组中的线程数只是 numthreads 维度的乘积。例如,numthreads(32,8,4) 每组将有 32*8*4 = 1024 个线程。这可以在编译时静态确定。

可以通过添加具有 SV_GroupId 语义的 uint3 输入参数来确定特定线程组的 ID。

线程组中特定线程的 ID 可以通过添加带有 SV_GroupThreadID semantic, or uint SV_GroupIndexuint3 输入参数来确定,如果您更喜欢扁平化版本。

就向每个线程提供有关分派总大小的信息而言,使用常量缓冲区是最好的选择。这类似于图形管道,其中像素着色器自然不知道视口尺寸。

还值得一提的是,如果您确实发现自己处于每个线程都需要知道整体分派大小的位置,则应该考虑重构您的算法。一般来说,最好分派数量可变的线程组,每个线程组具有固定的工作量,而不是分派固定数量的线程和可变的工作量。当然也有例外,但这往往会提供更好的硬件利用率。