在我的OpenCL内核中,我检查global_id是否在全局问题大小范围内,但是它不起作用。
如果工作组大小可以分割全局问题大小,那么一切都很好。如果没有,内核就什么都不做。
__kernel void move_points(const unsigned int points,
const unsigned int floors,
const unsigned int gridWidth,
const unsigned int gridHeight,
__global const GraphData *graph,
__global const float *pin_x,
__global const float *pin_y,
__global const float *pin_z,
__global float *pout_x,
__global float *pout_y,
__global float *pout_z,
__global clrngMrg31k3pHostStream *streams)
{
int id = get_global_id(0);
if (id < points) {
do kernel things...
}
}
有人知道问题在哪里吗?
非常感谢。罗宾。
答案 0 :(得分:4)
如果您的全局大小不能被您的本地大小(工作组大小)整除,那么内核根本不会运行。
enqueueNDRangeKernel()
调用将CL_INVALID_WORK_GROUP_SIZE作为指定here的错误返回。
如果您真的想要遵循CUDA模式,那么您可能会使用未使用的工作项。然后将检查放入内核(如您所知),并使用更大的全局大小,即本地大小的倍数。