在计算着色器的工作组大小中使用多个维度有什么用?

时间:2018-05-08 23:15:59

标签: opengl opencl compute-shader workgroup

计算着色器在分派时需要工作组计数。这必须以三维方式提供。对于计算着色器本身中指定的工作组大小也是如此。

在OpenGl中调度计算着色器的功能:glDispatchCompute

问题:

  • 为什么有3个维度?
  • 为什么不通过一个大号?
  • 3个维度如何产生实际数字?

1 个答案:

答案 0 :(得分:2)

有计算本身就是2维或3维。并且存在固有的一维计算。 有人会给您带来不便。多维用户必须采用一维索引并将其转换为2 / 3D索引,否则单维用户可能必须采用2 / 3D索引并将其压缩为1D。

当然,请注意“将”和“可能”之间的区别。如果dispatch命令的X维度上的实现限制太小而无法运行足够的调用,则单维用户只需要识别Y或Z维度。鉴于所有实现必须为每个维度提供至少65535个工作组,这涵盖了很多方面。

因此,虽然计算操作的多维性质可能会给单维工作带来不便,但是有很多单维工作没有给它带来不便。所以“可能”比“意志”更可取。

  

3个维度如何产生实际数字?

假设你需要在你的一维计算操作中使用Y和Z corrdinates(你很少这样做),有很多方法可以做到这一点。它们仅根据不同尺寸的顺序而变化。以下方式使用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;