我的问题特别涉及 ComputeShader,HLSL 代码。因此,DeviceContext.Dispath(X, Y, Z)
产生 X * Y * Z 组,每个组在属性中设置了 x * y * z 个单独的线程[numthreads(x,y,z)]
。问题是,如何获得已调度的线程组总数和组中的线程数?让我解释一下为什么我想要它 - 我打算处理的数据量可能会有很大差异,所以我的方法应该适应输入数组的大小。当然,我可以在常量缓冲区中发送 Dispath 参数以使其可从 HLSL 代码中使用,但是组中的线程数呢?我正在寻找类似GetThreadGroupNumber()
和的方法GetThreadNumberInGroup()
。我很感激任何帮助。
问问题
2587 次
1 回答
2
组中的线程数只是numthreads
尺寸的乘积。例如,每个组numthreads(32,8,4)
将有线程。32*8*4 = 1024
这可以在编译时静态确定。
可以通过添加带有语义的uint3
输入参数来确定特定线程组的 ID 。SV_GroupId
线程组中特定线程的 ID 可以通过添加带有语义的uint3
输入参数来确定,或者如果您更喜欢扁平化版本。SV_GroupThreadID
uint
SV_GroupIndex
至于向每个线程提供有关调度总大小的信息,使用常量缓冲区是您最好的选择。这类似于图形管道,其中像素着色器自然不知道视口尺寸。
还值得一提的是,如果您确实发现自己处于每个线程都需要知道整体调度大小的位置,您应该考虑重构您的算法。一般来说,最好调度可变数量的线程组,每个线程组具有固定的工作量,而不是调度固定数量的具有可变工作量的线程。当然也有例外,但这往往会更好地利用硬件。
于 2016-03-01T01:29:16.167 回答