在计算着色器的工作组大小中使用多个维度有什么用?
What is the use of multiple dimensions in the work group size of a compute shader?
计算着色器在分派时需要工作组计数。这必须以 3 个维度提供。计算着色器本身指定的工作组大小也是如此。
在 OpenGl 中调度计算着色器的函数:glDispatchCompute
。
问题:
- 为什么有 3 个维度?
- 为什么不传递 1 个大数字?
- 3 个维度如何得出实际数字?
有些计算本质上是 2 维或 3 维的。并且有些计算本质上是一维的。 有人 会感到不便。要么多维用户必须采用 1D 索引并将其转换为 2/3D 索引,要么单维用户可能必须采用 2/3D 索引并将其压缩为 1D。
当然要注意"will"和"may"的区别。如果调度命令在X维度上的实现限制太小,不足以运行次调用,单维度用户只需要识别Y或Z维度。鉴于所有实现必须为每个维度提供至少 65535 个工作组,这涉及很多领域。
因此,虽然计算操作的多维性质可能会给单维工作带来不便,但仍有许多不会给单维工作带来不便。所以 "may" 优于 "will".
how do the 3 dimensions result in an actual number?
假设您需要在一维计算操作中使用 Y 坐标和 Z 坐标(而且您很少这样做),有多种方法可以实现。它们仅在不同维度的顺序方面有所不同。以下方式使用 gl_LocalInvocationIndex
排序。
如果您需要为特定工作组获取索引,这很简单:
uint WorkGroupIndex = dot(gl_WorkGroupID, uvec3(1, gl_NumWorkGroups.x, gl_NumWorkGroups.x * gl_NumWorkGroups.y));
如果您需要为整个调度调用中的每个调用获取索引,请按照上面的 WorkGroupIndex
执行此操作:
uint UniqueIndex = (WorkGroupIndex * gl_WorkGroupSize.x * gl_WorkGroupSize.y * gl_WorkGroupSize.z) + gl_LocalInvocationIndex;
计算着色器在分派时需要工作组计数。这必须以 3 个维度提供。计算着色器本身指定的工作组大小也是如此。
在 OpenGl 中调度计算着色器的函数:glDispatchCompute
。
问题:
- 为什么有 3 个维度?
- 为什么不传递 1 个大数字?
- 3 个维度如何得出实际数字?
有些计算本质上是 2 维或 3 维的。并且有些计算本质上是一维的。 有人 会感到不便。要么多维用户必须采用 1D 索引并将其转换为 2/3D 索引,要么单维用户可能必须采用 2/3D 索引并将其压缩为 1D。
当然要注意"will"和"may"的区别。如果调度命令在X维度上的实现限制太小,不足以运行次调用,单维度用户只需要识别Y或Z维度。鉴于所有实现必须为每个维度提供至少 65535 个工作组,这涉及很多领域。
因此,虽然计算操作的多维性质可能会给单维工作带来不便,但仍有许多不会给单维工作带来不便。所以 "may" 优于 "will".
how do the 3 dimensions result in an actual number?
假设您需要在一维计算操作中使用 Y 坐标和 Z 坐标(而且您很少这样做),有多种方法可以实现。它们仅在不同维度的顺序方面有所不同。以下方式使用 gl_LocalInvocationIndex
排序。
如果您需要为特定工作组获取索引,这很简单:
uint WorkGroupIndex = dot(gl_WorkGroupID, uvec3(1, gl_NumWorkGroups.x, gl_NumWorkGroups.x * gl_NumWorkGroups.y));
如果您需要为整个调度调用中的每个调用获取索引,请按照上面的 WorkGroupIndex
执行此操作:
uint UniqueIndex = (WorkGroupIndex * gl_WorkGroupSize.x * gl_WorkGroupSize.y * gl_WorkGroupSize.z) + gl_LocalInvocationIndex;