2

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

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

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

4

1 回答 1

3

是的,在最高 1.2 的 OpenCL 规范中规定,全局大小应为局部大小的倍数。在 2.0 中他们放宽了这一点,但当然还没有 2.0 的实现。

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

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

于 2013-10-21T02:02:57.540 回答