clEnqueueAcquireGLObjects 的目的是什么?

What is the purpose of clEnqueueAcquireGLObjects?

我做了 google 的问题,并从 this link

clEnqueueAcquireGLObjects

Acquire OpenCL memory objects that have been created from OpenGL objects.

These objects need to be acquired before they can be used by any OpenCL commands queued to a command-queue.

我真的不明白为什么这些对象需要获得。在我看来,获取的原因不是 OpenGL/OpenCL 同步,因为可以通过 glFinishclFinish.

实现同步

我的意思是,如果使用clEnqueueAcquireGLObjects/clEnqueueReleaseGLObjects,那么glFinish/clFinish就是多余的,反之亦然。

I mean, if clEnqueueAcquireGLObjects/clEnqueueReleaseGLObjects are used, then glFinish/clFinish are redundant, and vice-versa.

您的思考方式完全错误。

glFinish 导致 OpenGL 执行完整的 CPU 同步,这样实现将在之后完成所有命令。 clFinish 为 OpenCL 做了类似的事情。

您调用一个或另一个的事实对不同系统的作用绝对没有影响。 OpenGL 不知道 OpenCL 的存在,vice-versa。 glFinishclFinish 和 vice-versa 无关。因此,虽然 OpenGL 可能已经完成了对对象的一些修改,但 OpenCL 并不知道这些修改已经发生。

获取和释放OpenGL对象的目的是为了让OpenCL和OpenGL相互对话。当获取对象时,OpenCL 告诉 OpenGL,"Hey, see these objects? They're mine now, so give them to me." 这意味着 OpenGL/OpenCL 驱动程序将执行任何必要的机制,将对这些对象的访问控制转移到 OpenCL。

例如,如果某个对象已从 GPU 内存中调出页面,获取它的 OpenCL 可能需要使其再次驻留。 OpenCL 和 OpenGL 有两组独立的记录引用此内存;通过获取对象,您可以将 OpenCL 数据与 OpenGL 所做的更改同步。等等。

请注意,这些机制与同步 GPU 操作完全毫无关系。它们是关于让 OpenCL 可以访问对象。

如果您的 OpenCL 实现没有 cl_khr_gl_event,那么您必须使用 OpenGL 的同步机制来确保在获取这些对象之前不再使用它们。这两个功能并不是多余的;他们正在做不同的事情来确保系统的完整性。