Opencl 如何添加额外的工作项以使全局工作大小为本地工作大小的倍数

Opencl 如何添加额外的工作项以使全局工作大小为本地工作大小的倍数,opencl,Opencl,我正在写一个OpenCL程序,但是我的全局工作大小不是本地工作大小的倍数。在OpenCL中,全局工作大小必须可以被本地工作大小整除,因此我读到的一个解决方案是添加一些额外的工作项,这些工作项对全局工作大小的大小没有任何作用,并使其可以被所选的本地工作大小整除 例如,假设本地工作大小为4,全局工作大小为62(您有62个元素需要内核对其执行操作) 这里的想法是再添加两个空闲的工作项,以使全局工作大小为64。因此,由于64可以被4整除,所以一切都很好 关于如何准确地实现像这样的空闲工作项,有什么想法吗

我正在写一个OpenCL程序,但是我的全局工作大小不是本地工作大小的倍数。在OpenCL中,全局工作大小必须可以被本地工作大小整除,因此我读到的一个解决方案是添加一些额外的工作项,这些工作项对全局工作大小的大小没有任何作用,并使其可以被所选的本地工作大小整除

例如,假设本地工作大小为4,全局工作大小为62(您有62个元素需要内核对其执行操作)

这里的想法是再添加两个空闲的工作项,以使全局工作大小为64。因此,由于64可以被4整除,所以一切都很好


关于如何准确地实现像这样的空闲工作项,有什么想法吗?如果我只是简单地将全局工作大小增加到64,我的内核会有两次额外执行,这会改变程序正在执行的计算结果,最终产生错误的结果。

将全局工作大小四舍五入到本地工作大小的倍数是一种标准方法。在这种情况下,我们必须在内核中添加绑定检查,以确保只有那些工作项执行有效数据范围内的计算。可以通过将实际数据大小指定为内核参数并将其与工作项的全局索引进行比较来实现。内核示例如下所示:

__kernel void example_kernel(__global int* input, __global int* output, int dataSize)
{
    int index = get_global_id(0);

    if (index < dataSize)
    {
        /*
        rest of the kernel...
        */
    }
}
\uuuuu内核无效示例\uu内核(\uuuu全局int*输入,\uuuu全局int*输出,int数据大小)
{
int index=get_global_id(0);
如果(索引<数据大小)
{
/*
内核的其余部分。。。
*/
}
}

OpenCL2.0以后,不再要求全局工作大小是本地工作大小的倍数

最好将本地工作大小
NULL
,除非有真正的性能优势

您可以对gws进行取整,并在边缘工作ITER中进行额外处理

gws = (old_gws/lws) * lws;
leftover = old_gws - gws;
内核中

if(get_global_id(0) == (get_global_size(0)-1))
    // do computation for rest of the work-items (leftover)

您必须在内核中添加绑定检查,以确保这些线程只执行全局索引位于有效数据范围内的计算。非常感谢,我没有考虑内核中的绑定检查。