工作组绑定检查不起作用

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 模式,你可能会有未使用的工作项。然后将支票放入内核(正如您已经拥有的那样),并使用更大的全局大小,即您本地大小的倍数。