OpenCL-OpenGL互操作性能



我有一个代码,用于创建GL纹理8K(7680 x 4320)并渲染到该纹理。然后我把它切换到CL,我做一些事情。。。

问题是"切换"非常缓慢

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

如果我注释"clEnqueueAcquireGLObjects(..)"line=>没有开关。它有大约600FPS。

有办法让我加速吗?

我也想问一下,如果这只是英伟达的问题,或者像Ati、英特尔和一些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 Interop:

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;
}

与本线程中提出的问题相同:链接

这只是nVIDIA + Windows驱动程序中的一个问题。不是AMD,不是英特尔,也不是linux。但正如@user2725937的评论所说:

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

在您的平台上,此处可能不需要glFinishclFinishlFlushclFlush

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

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

最新更新