我正在对 OpenCL/OpenGL 互操作进行一些测试。其中之一包括创建带有附加渲染缓冲区的 OpenGL FBO。我试图将像素写入内核中关联的 OpenCL 内存对象(image2d_t),将所有内容保留在 GPU 上,并每帧将 FBO 位图传输到主 OpenGL 帧缓冲区。帧缓冲区显示在可调整大小的窗口中,因此渲染缓冲区的大小可以变化。
如果我尝试运行内核,则会收到 CL_INVALID_WORKGROUP_SIZE 大小错误,除非宽度和高度尺寸是(本地)工作组大小的倍数。
这真的有必要吗?我不喜欢填充额外的内存、引入宽度/高度参数以及在内核内部添加额外的边界检查(如果可以避免的话)... 我也不想只使用工作组大小 1 ;-)
最佳答案
是的,OpenCL 规范中规定,直到 1.2,全局大小应是本地大小的倍数。在 2.0 中他们放松了这一点,但当然还没有 2.0 实现。
常见的解决方法是将全局工作大小四舍五入为本地工作大小的下一个倍数,但传入所需的(实际)全局大小作为参数,然后在内核中检查是否有 global_id(0)/global_id(1) 小于工作前的实际大小。
或者,传递 NULL 作为本地工作大小并让运行时选择(但针对硬件调整的本地工作大小通常更快)。
关于c++ - 渲染缓冲区的 OpenCL/OpenGL 互操作尺寸与工作组大小的关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19477348/