您经常可以看到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;
是否真的有必要,特别是如果你用全局大小创建缓冲区。
答案 0 :(得分:4)
这不是惯例 - 如果你想跳过函数的其余部分,它与普通的C / C ++相同。通过不做不必要的工作,它有可能加快执行速度。
如果您没有将缓冲区填充到工作组的大小,并且需要确保不访问未分配的内存,则可能是必要的。
你必须小心这样返回,因为如果在返回后内核中存在障碍,你可能会使执行死锁。这是因为工作组中的所有工作项都必须达到障碍。因此,如果存在障碍,则整个工作组的条件必须为真,否则整个工作组需要为假。
答案 1 :(得分:3)
在OpenCL 1.x内核中使用此条件非常常见,因为要求您的全局工作大小是工作组大小的整数倍。因此,如果要指定工作组大小为64但要处理1000个项目,则将全局大小设置为1024,将1000作为参数(N)传递,然后执行检查。
在OpenCL 2.0中,解除了整数倍限制,因此OpenCL 2.0内核不太可能需要这种条件。