3

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

4

1 回答 1

2

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

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

线程组中特定线程的 ID 可以通过添加带有语义的uint3输入参数来确定,或者如果您更喜欢扁平化版本。SV_GroupThreadIDuint SV_GroupIndex

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

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

于 2016-03-01T01:29:16.167 回答