工作组绑定检查不起作用
Workgroup Bound Check not working
在我的 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...
}
}
有人知道问题出在哪里吗?
非常感谢。罗宾.
如果您的全局大小不能被您的局部大小(工作组大小)整除,那么内核根本不会运行。
enqueueNDRangeKernel()
调用将 return CL_INVALID_WORK_GROUP_SIZE 作为指定的错误 here。
如果你真的想遵循 CUDA 模式,你可能会有未使用的工作项。然后将支票放入内核(正如您已经拥有的那样),并使用更大的全局大小,即您本地大小的倍数。
在我的 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...
}
}
有人知道问题出在哪里吗?
非常感谢。罗宾.
如果您的全局大小不能被您的局部大小(工作组大小)整除,那么内核根本不会运行。
enqueueNDRangeKernel()
调用将 return CL_INVALID_WORK_GROUP_SIZE 作为指定的错误 here。
如果你真的想遵循 CUDA 模式,你可能会有未使用的工作项。然后将支票放入内核(正如您已经拥有的那样),并使用更大的全局大小,即您本地大小的倍数。