如果全局id高于OpenCL中的元素数,我应该返回吗?

时间:2015-02-17 13:57:50

标签: opencl

您经常可以看到OpenCL内核,例如

kernel void aKernel(global float* input, global float* output, const uint N)
{
      const uint global_id = get_global_id(0);
      if (global_id >= N) return;
    // ...
}

我想知道这个if (global_id >= N) return;是否真的有必要,特别是如果你用全局大小创建缓冲区。

  • 在哪些情况下,它们是强制性的?
  • 是OpenCL代码约定吗?

2 个答案:

答案 0 :(得分:4)

这不是惯例 - 如果你想跳过函数的其余部分,它与普通的C / C ++相同。通过不做不必要的工作,它有可能加快执行速度。

如果您没有将缓冲区填充到工作组的大小,并且需要确保不访问未分配的内存,则可能是必要的。

你必须小心这样返回,因为如果在返回后内核中存在障碍,你可能会使执行死锁。这是因为工作组中的所有工作项都必须达到障碍。因此,如果存在障碍,则整个工作组的条件必须为真,否则整个工作组需要为假。

答案 1 :(得分:3)

在OpenCL 1.x内核中使用此条件非常常见,因为要求您的全局工作大小是工作组大小的整数倍。因此,如果要指定工作组大小为64但要处理1000个项目,则将全局大小设置为1024,将1000作为参数(N)传递,然后执行检查。

在OpenCL 2.0中,解除了整数倍限制,因此OpenCL 2.0内核不太可能需要这种条件。