如果全局 id 超过 OpenCL 中的元素数量,我应该 return 吗?

Shall I return if the global id is above the number of elements in 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; 是否真的有必要,特别是如果您创建具有全局大小的缓冲区。

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

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

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

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

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