我正在编写一个OpenCL程序,但是我的全局工作量并不是我本地工作量的倍数。在OpenCL中,全局工作大小必须能够被本地工作大小整除,因此我读到的解决方案是添加一些额外的工作项,这些工作项不会对全局工作大小的大小进行舍入,并使其可以被所选的本地工作大小整除。
例如,假设本地工作大小为4,全局工作大小为62(您有62个元素需要内核对它们进行操作)
这里的想法是添加另外两个空闲的工作项,以使全局工作大小为64.因此,当64可被4整除时,一切都很好。
关于如何实现这样的空闲工作项的任何想法?如果我只是将全局工作大小增加到64,那么我的内核有两个额外的执行会改变程序正在进行的计算结果,最终会产生错误的结果。
答案 0 :(得分:2)
这是将全球工作规模四舍五入到当地工作规模倍数的标准方法。在这种情况下,我们必须在内核中添加绑定检查,以确保只有那些工作项执行落在有效数据范围内的计算。可以通过将实际数据大小指定为内核参数并将其与工作项的全局索引进行比较来完成。示例内核将如下所示:
__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...
*/
}
}
答案 1 :(得分:1)
OpenCL 2.0以后,不再需要将全局工作量调整为本地工作规模的倍数。
除非有真正的性能优势,否则最好保留本地工作规模NULL
。
你可以向下舍入gws并在边缘工作中进行额外的处理
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)