AMD Tahiti上的OpenCL / OpenGL隐式同步
OpenCL / OpenGL Implicit Synchronization on AMD Tahiti
我在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_event
和cl_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]
相反,你应该:
CL->GL同步:让
clEnqueueReleaseObjects
创建一个(输出)事件传递给glCreateSyncFromCLeventARB
,然后使用glWaitSync
(不是glClientWaitSync
-在这种情况下将与clFinish
相同)。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
。
- OpenGL - 在抛出"__gnu_cxx::recursive_init_error"实例后终止调用?
- 了解 GLM- openGL 中的相机转换
- 如何在全屏模式下(在OpenGL中)使背景透明
- 为什么我不能使用 EGL 创建无头 OpenGl 上下文?
- OpenGL大的3D纹理(>2GB)非常慢
- OpenGl glm rotate
- C++atioglxx.pdb未加载错误glBufferData OpenGL
- OpenGL在启用深度测试时不会丢弃我的碎片
- OpenGL相机和相机空间转型的困惑
- 松弛原子与无同步情况下的记忆连贯性
- 使用QQuickFramebufferObject时同步数据的最佳方式是什么
- OpenGL将纹理四边形渲染为(0,0)
- OpenGL 和 GLM 矩阵无法正确扩展,总是按比例缩小
- 使用 qt 和 opengl、定时精度和垂直同步问题、c++ 显示图像
- iOS中的垂直同步(SDL2/OpenGL ES)
- 将 OpenGL 与 RtAudio(或端口音频)同步
- OpenGL窗口的高效同步功能
- OpenGL垂直同步使渲染更快
- AMD Tahiti上的OpenCL / OpenGL隐式同步
- SDL2和OpenGL,强制FPS与垂直同步禁用