OpenCL / OpenGL与工作组大小相关的渲染缓冲区的Interop维度

时间:2013-10-20 12:32:52

标签: c++ opengl interop opencl fbo

我正在对OpenCL / OpenGL互操作进行一些测试。其中之一包括创建一个带有附加渲染缓冲区的OpenGL FBO。我正在尝试将像素写入内核中的关联OpenCL内存对象(image2d_t),将所有内容保留在GPU上,并将每个帧上的FBO blit到主OpenGL帧缓冲区。帧缓冲区显示在可调整大小的窗口中,因此渲染缓冲区的大小可能会有所不同。

如果我尝试运行内核,我会收到CL_INVALID_WORKGROUP_SIZE大小错误,除非宽度和高度维度是(本地)工作组大小的倍数。

这真的有必要吗?我不喜欢填充额外的内存,引入宽度/高度参数,并在内核中添加额外的边界检查,如果我可以避免它... 我也不想只使用1的工作组大小; - )

1 个答案:

答案 0 :(得分:3)

是的,在OpenCL规范中指定,最多1.2,全局大小应为本地大小的倍数。在2.0中他们放松了,但当然还没有2.0实现。

常见的解决方法是将全局工作大小向上舍入到本地工作大小的下一个倍数,但是将所需的(实际)全局大小作为参数传递,然后在内核中检查global_id(0)/在工作之前,global_id(1)小于实际大小。

替代方法,将NULL作为本地工作大小传递,并让运行时选择(但调整后的硬件本地工作大小通常更快)。