HLSL获取代码中的threadGroups和numthreads数

时间:2016-02-27 19:57:28

标签: c++ directx hlsl compute-shader directcompute

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

1 个答案:

答案 0 :(得分:2)

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

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

可以通过添加uint3输入参数和SV_GroupThreadID语义来确定线程组中特定线程的ID,如果您愿意,可以uint SV_GroupIndex扁平的版本。

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

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