AMD Tahiti上的OpenCL / OpenGL隐式同步



我在AMD Tahiti (AMD Radeon HD 7900系列)设备上遇到了OpenCL和OpenGL的"隐式同步"问题。该设备具有cl/gl扩展、cl_khr_gl_sharing和cl_khr_gl_event。

当我运行程序时,这只是一个简单的vbo更新内核,并将其绘制为简单着色器的白线,它像疯了一样打嗝,每次更新看起来都是2-4帧。我可以确认它不是我用来更新和绘制缓冲区的cl内核或gl着色器,因为如果我把glFinish和commandQueue.finish()在获取和释放gl对象的cl更新之前和之后,一切都应该正常工作。

所以,我认为我需要"启用"事件扩展…

#pragma OPENCL EXTENSION cl_khr_gl_event : enable

…在cl程序中,但会抛出错误。我认为这个扩展不是一个面向客户端的扩展,应该只是"预期"的工作,这就是为什么我不能启用它。

我注意到的第三个行为……如果我取出glFinish()和commandQueue.finish(),并在CodeXL调试中运行它,则隐式同步工作。也就是说,无需对代码库进行任何更改,比如使用finish强制同步,CodeXL允许隐式同步。因此,隐式同步显然是有效的,但我不能通过定期通过Visual Studio运行应用程序并强制同步来实现它。

很明显我错过了什么,但我真的看不出来。任何想法或解释都将非常感谢,因为我希望保持同步的隐式。

我猜你没有使用GLsync-cl_event同步器(GL_ARB_cl_eventcl_khr_gl_event扩展),这就是为什么添加cl/glFinish和CodeXL的开销是有帮助的。

我猜你的代码看起来像:

A1. clEnqueueNDRangeKernel
A2. clEnqueueReleaseObjects
[here is where you inserted clFinish]
B1. glDraw*
B2. wgl/glXSwapBuffers
[here is where you inserted glFinish]
C1. clEnqueueAcquireObjects
[repeat from A1]

相反,你应该:

  1. CL->GL同步:让clEnqueueReleaseObjects创建一个(输出)事件传递给glCreateSyncFromCLeventARB,然后使用glWaitSync(不是glClientWaitSync -在这种情况下将与clFinish相同)。

  2. GL->CL synchro:让clEnqueueAcquireObjects获取一个(输入)事件,该事件将与clCreateFromGLsync一起创建,从glFenceSync获取一个同步对象

总的来说,应该是:

A1. `clEnqueueNDRangeKernel`
[Option 1.1:]
A2. `clEnqueueReleaseObjects`( ..., 0, NULL, &eve1)
[Option 1.2:]
A2. `clEnqueueReleaseObjects`( ..., 0, NULL, NULL)
A2'. `clEnqueueMarker`(&eve1)
A3. sync1 = glCreateSyncFromCLeventARB(eve1)
* clReleaseEvent(eve1)
A4. glWaitSync(sync1)
* glDeleteSync(sync1)
B1. glDraw*
B2. wgl/glXSwapBuffers
B3. sync2 = glFenceSync
B4. eve2 = clCreateFromGLSync(sync2)
* glDeleteSync(sync2)
[Option 2.1:]
C1. clEnqueueAcquireObjects(, ..., 1, &eve2, NULL)
* clReleaseEvent(eve2)
[Option 2.2:]
B5. clEnqueueWaitForEvents(1, &eve2)
* clReleaseEvent(eve2)
C1. clEnqueueAcquireObjects(, ..., 0, NULL, NULL)
[Repeat from A1]

(如果在将控制权移交给其他API之前不确切知道最后一个队列是什么,那么选项1.2/2.2会更好)

作为旁注,我假设您没有使用乱序队列的OpenCL(在这种情况下真的不应该需要一个)-如果你做了,你当然也必须同步clEnqueueAcquire -> clEnqueueNDRange -> clEnqueueRelease

最新更新