【问题标题】:OpenCL Host Copying Performance WarningOpenCL 主机复制性能警告
【发布时间】:2014-04-10 22:58:40
【问题描述】:

我有一个 OpenCL 程序,它可以在共享上下文中调整 VBO 对象的顶点坐标。 OpenCL 设备是 GPU 设备。

但是,我收到以下警告:

缓冲区性能警告:缓冲区对象 1(绑定到 GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING_ARB (0)、GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING_ARB (4) 和 GL_ARRAY_BUFFER_ARB,使用提示为 GL_DYNAMIC_DRAW)正在从 VIDEO 内存复制/移动到 HOST 内存。

据我所知(必须添加一些 glFlush() 呼叫以寻求帮助),这发生在呼叫 glDrawElements(...) 期间。着色器位置 0 的顶点属性数组为顶点,着色器位置 4 的顶点属性数组为纹理坐标。

问题是,为什么会这样?

编辑:循环的形式如下:

glFinish()
clEnqueueAcquireGLObjects(...)
clEnqueueNDRangeKernel(...)
clFinish(...)
clEnqueueReleaseGLObjects(...)

【问题讨论】:

  • 它只是告诉你 OpenCL 和 OpenGL 缓冲区的绑定约束需要从 GPU 到主机的额外副本。这不是有效的。检查缓冲区创建参数。
  • @DarkZeros 为什么需要额外的副本,哪些缓冲区参数需要负责?

标签: opengl opencl


【解决方案1】:

出于同样的原因,在 OpenGL 支持 VBO 之前,每次调用 glDrawElements (...) 都会立即从客户端提取内存(而不是在 GPU 开始执行命令时) . GL 在后台排队命令,但对于某些操作,它必须阻止和/或制作数据副本,以防止并发处理器(在这种情况下为 CPU 或 OpenCL)在 OpenGL 实际完成命令之前修改数据。它需要实际调用glDrawElements (...) 时存在的数据副本。

VBO 通过让 OpenGL 服务器显式控制对顶点内存的所有访问,解决了这个基本问题。不再可能以 OpenGL 服务器不知道的方式同时修改顶点内存。任何修改顶点内存的尝试都需要 GL 管道中的命令,因此确保排队的命令具有正确的顶点数据副本可以完全由 GL 本身管理,而无需诉诸不必要的复制或阻塞。 p>

当您在 GL 和 CL 之间共享缓冲区对象时,您实际上破坏了 GL 中缓冲区对象的一些优点。它提供了对 GL 拥有的内存的单独并发管道访问,因此 GL 无法再确定没有任何东西在其不知情的情况下修改了 拥有的数据。

clEnqueueAcquireGLObjects

获取从 OpenGL 对象创建的 OpenCL 内存对象。

[...]

注意事项

在调用 clEnqueueAcquireGLObjects 之前,应用程序必须确保访问 mem_objects 中指定的对象的任何挂起的 GL 操作都已完成。这可以通过在所有具有对这些对象的未决引用的 GL 上下文上发出并等待完成 glFinish 命令来实现。实现可以提供更有效的同步方法;例如,在某些平台上调用 glFlush 可能就足够了,或者同步可能隐含在线程中,或者可能存在特定于供应商的扩展,允许在 GL 命令流中放置一个栅栏并在 CL 命令队列中等待该栅栏的完成.请注意,目前除了 glFinish 之外,没有其他同步方法可以在 OpenGL 实现之间移植。

同样,在调用 clEnqueueReleaseGLObjects 之后,应用程序负责确保访问 mem_objects 中指定的对象的任何挂起的 OpenCL 操作在执行引用这些对象的后续 GL 命令之前已经完成。这可以通过使用 clEnqueueReleaseGLObjects 返回的事件对象调用 clWaitForEvents 或调用 glFinish 来实现。如上所述,一些实现可能会提供更有效的方法。

您需要 GL / CL 同步才能正确处理此问题,这解释了为什么 glFlush (...) 会有所帮助。但是,刷新命令队列通常是不够的。这只会告诉 GL 立即开始处理它缓冲的所有命令,但甚至不会尝试确保它们在控制权返回 CPU 之前完成

要完整回答这个问题,需要更多细节;特别是使用缓冲区数据的 CL 和 GL 命令序列以及您使用的同步方式。

【讨论】:

  • 感谢您的回答,并为我的延误感到抱歉。我之前遇到过GL/CL同步;我已经按顺序在上面添加了当前完成的操作。
猜你喜欢
  • 2018-09-17
  • 2020-08-20
  • 2014-04-25
  • 1970-01-01
  • 2018-01-14
  • 1970-01-01
  • 1970-01-01
  • 2018-08-30
  • 1970-01-01
相关资源
最近更新 更多