c++ - OpenGL-CL多线程互操作

标签 c++ opengl opencl gpgpu

我有一个线程,其中有 GL 上下文,我制作所有渲染内容。在另一个线程中,我正在运行 OpenCL 程序。这两个任务必须与浮点值缓冲区进行交换。

现在,这个缓冲区是 OpenGL 2D 纹理(我想使用 3D,它会很好,但大多数设备不支持 cl_khr_3d_image_writes 以及我的)。正如预期的那样,因为纹理是在 GL 线程中创建的,然后当我尝试在另一个线程的 CL 程序中使用它时,应用程序失败(没有 GL 或 CL 错误,只是应用程序崩溃)。

是否有可能以某种方式使用两个线程和 CL-GL 互操作?

最佳答案

这样使用两个线程是完全可以的。但是,您必须明确注意缓冲区的同步。请参阅 OpenGL 规范的附录 D(“共享对象和多上下文”)。

粗略的流程是:

1) 在您的 GL 线程上执行 glFenceSync() 以创建 GLsync 对象 ( ARB_sync extension )。

2) 在任一线程上(OpenCL 是线程安全的)使用 clCreateEventFromGLsyncKHR() 从 GLsync(cl_khr_gl_event 扩展)创建一个 cl_event。

3) 在您的 CL 线程上,使用 clEnqueueAcquireGLObjects() 将步骤 2 中的 cl_event 作为等待列表中的事件(cl_khr_gl_sharing 扩展名)传入。可能保留创建的 cl_event。

4) 继续进行 CL 处理。如果您使用的是乱序队列,请确保使用步骤 2 中由 clEnqueueAcquireGLObjects() 创建的 cl_event。

5) 在您的 CL 线程上使用 clEnqueueReleaseGLObjects() 创建一个 cl_event(cl_khr_gl_sharing 扩展名)。

6) 在您的 GL 线程上(OpenGL 不是线程安全的)使用 glCreateSyncFromCLeventARB() 从步骤 5 的 cl_event(GL_ARB_cl_event 扩展名)创建 GLsync 对象。

7) 回到您的 GL 线程,使用 glWaitSync() 等待 GLsync 对象(ARB_sync extension 扩展名)。

8) 继续进行 GL 处理。

9) 回到第一步

这只是关于创建同步对象并在两个 API 之间传递它们:)

关于c++ - OpenGL-CL多线程互操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17559873/

相关文章:

c++ - 类似于函数的宏不接受嵌套的#define

c++ - 多行数学结果不同于单行

c++ - 在 C++ Visual Studio 2012 中创建类时出错

opencl - OpenCL 中减少总和的最佳工作组大小

performance - 改进感知器神经网络的 OpenCL 内核

c++ - OpenCL:只关心线程全局 ID 时的理想 block 数?

C++实例化问题

c++ - 为什么 glDrawElements 不渲染我的三角形?

Java 以高于 72 DPI 的速度打印不会填满页面

c++ - 如何检查 GLFW 窗口是否正在运行?