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 参数,这样着色器将不会处理纹理之外的任何内容。
我正在使用 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 参数,这样着色器将不会处理纹理之外的任何内容。