HLSL(计算着色器)中的奇数线程程序

Odd Number of Threads Programs in HLSL (Compute Shader)

我正在使用 Unity 在 GPU 上启动 HLSL 内核。我使用的函数是 ComputeShader.Dispatch 但如果你不熟悉 Unity,这个函数只会在 GPU 上调度着色器,它以你想要的线程组的大小 x、y 和 z 作为参数.

这是我的问题,有时我想 运行 这个内核很多次。

我可以用奇数大小调用 Dispatch,但这样做意味着像这样定义我的内核 [numthreads(1,1,1)],这是众所周知的低效。

您如何管理线程以处理奇怪的纹理或其他不规则形状?

非常感谢

执行此任务的标准方法是确保您没有执行越界 read/writes。

假设您的小组人数是

[numthreads(8,8,1)]

在任何情况下,即使您的纹理大小不是奇数,也不是 8 的倍数(在每个维度上),您也可以让这种情况发生。

假设您现在要处理 18*9 的纹理

您需要在每个维度中调度足够的线程以至少覆盖整个纹理:

X = 18 / 8 (2.25),所以你需要 3 个组(将处理 24 个像素) Y = 9 / 8 (1.125),需要2组

所以你将调用 dispatch 作为 context.Dispatch(3,2,1)

在计算着色器中,执行此操作的标准方法是尽早 return 以防您超出范围。

Texture2D texture2d <string uiname="Texture";>;

uint Width;
uint Height;

[numthreads(8,8,1)]
void CS(uint3 tid : SV_DispatchThreadID)
{
    if (tid.x >= Width || tid.y >= Height)
        return;

    //Perform your processing
}

您需要将纹理大小发送到 width/height 参数,这样着色器将不会处理纹理之外的任何内容。