【问题标题】:HLSL Get number of threadGroups and numthreads in codeHLSL 获取代码中的线程组数和线程数
【发布时间】:2016-02-27 19:57:28
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

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

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

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

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

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

    【讨论】:

    • 好的,我明白了,请回复
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-09
    相关资源
    最近更新 更多