【问题标题】:OpenCL - OpenGL Interop performanceOpenCL - OpenGL 互操作性能
【发布时间】:2013-07-27 19:05:29
【问题描述】:

我有一个代码,我在其中创建 GL 纹理 8K(7680 x 4320) 并渲染到这个纹理。然后我将它切换到 CL 并做一些事情......

问题是“切换”很慢。

如果我不运行任何 CL 代码,只需切换。它在我的 GTS 450 上大约有 40FPS。

如果我评论“clEnqueueAcquireGLObjects(..)”行 => 没有开关。它有大约 600FPS。

有什么方法可以加快速度吗?

我也想问一下,如果这只是 Nvidia 的问题,还是像 Ati、Intel 和一些 SoC(ARM) 的其他公司也有同样的速度问题?

创建 GL-CL 纹理:

glGenFramebuffers(1, &m_fbo);
glGenTextures(1, &m_tex);
glBindFramebuffer(GL_FRAMEBUFFER, m_fbo);
glBindTexture(GL_TEXTURE_2D, m_tex);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, m_imageSize.x, m_imageSize.y, 0, GL_RGBA, GL_INT, NULL);        //GL_ALPHA
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, m_tex, 0);
if(glCheckFramebufferStatus(GL_FRAMEBUFFER)!=GL_FRAMEBUFFER_COMPLETE)
    return false;
glBindFramebuffer(GL_FRAMEBUFFER, 0);

int err;
m_memD = clCreateFromGLTexture2D(ecl.getContext(), CL_MEM_READ_WRITE, GL_TEXTURE_2D, 0, m_tex, &err);
if(ERR_CL)
    return false;

GL - CL 互操作:

void activateCL()
{
    glFinish();
    int err = clEnqueueAcquireGLObjects(m_queue, 1, &m_memD, 0, 0, 0);
}    
void activateGL()
{
    int err;
    err = clFinish(m_queue);
    err = clEnqueueReleaseGLObjects(m_queue, 1, &m_memD, 0, 0, 0);

}

bool activateGLRendering()
{
    activateGL();
    glBindFramebuffer(GL_FRAMEBUFFER, m_fbo);
    return true;
}
bool deactivateGLRendering()
{
    glBindFramebuffer(GL_FRAMEBUFFER, 0);
    return true;
}

【问题讨论】:

    标签: performance opengl interop opencl


    【解决方案1】:

    在您的平台上,此处可能不需要 glFinishclFinish。尝试改用 glFlushclFlush

    这确实取决于平台,正如 CL/GL 扩展规范中所述。规范说 Finish 是唯一完全可移植的方式,但可能存在更快的替代方案。

    例如在 Mac OS X 上,从 GL 切换到 CL 时只需要 glFlushRenderAPPLE 而不需要 clEnqueueAcquireGLObjects,然后只需要 clFlush 和切换回 GL 时没有 clEnqueueReleaseGLObjects

    【讨论】:

    • 不做任何事情并使用fence sync object怎么样?
    • 我刚刚尝试过“flush”,但结果是一样的 :( clEnqueueAcquireGLObjects() 和 clEnqueueReleaseGLObjects() 发生缓慢的事情。“Finish”或“Flush”不是问题!
    • Nicol:但如果我使用“同步对象”。我仍然必须调用 clEnqueueAcquireGLObjects(),所以我认为这不是解决方案 :(
    • @Milan:Eric 和 Nicol 试图说明的一点是 glFinish/clFinish 都非常慢,因为它们会导致完全停止。所以基本上,你明确地让你的 GPU 每帧完全空闲两次。
    • glFinish 和 clFinish 是必需的。 opencl 必须在 opengl 接管之前完成,反之亦然(clFlush 仅保证发出的命令未完成)。前段时间,我使用 ocl 和 ogl(使用 clFinish 和 glFinish)制作了一个小程序,即使在运行内核的情况下,我也可以在 GTX660Ti 上达到大约 500 fps 的速度。所以我几乎可以肯定问题出在其他地方。
    【解决方案2】:

    与此线程中提出的相同问题:LINK

    nVIDIA + Windows的驱动有问题。不是 AMD,不是 Intel,也不是在 linux 中。 但正如@user2725937 的评论所说:

    It is reported to nVIDIA and fixed in 331.xx beta drivers
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-04-12
      • 2016-08-18
      • 2019-11-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-31
      • 1970-01-01
      相关资源
      最近更新 更多