gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 21:38:17 25 4
gpt4 key购买 nike

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

最佳答案

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

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

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

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

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

关于c++ - HLSL 在代码中获取线程组数和线程数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35674731/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com