OpenCL - OpenGL 互操作性能

5
我有一段代码,我在其中创建了一个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;
}
2个回答

2
同一个帖子中提出了类似的问题:LINK 这只是在nVIDIA + Windows驱动程序中的问题,而不是AMD、Intel或Linux中的问题。但正如@user2725937的评论所说:
It is reported to nVIDIA and fixed in 331.xx beta drivers

-1
在你的平台上,这里可能不需要使用glFinishclFinish。尝试使用glFlushclFlush代替。
这实际取决于平台,如CL/GL扩展规范所述。规范指出Finish是唯一完全可移植的方式,但可能存在更快的替代方案。
例如,在Mac OS X上,切换从GL到CL时仅需要使用glFlushRenderAPPLE,而不需要使用clEnqueueAcquireGLObjects,然后切换回GL时仅需要使用clFlush,而不需要使用clEnqueueReleaseGLObjects

3
不妨使用“栅栏同步对象”(fence sync object)来实现,而非考虑以上两种方法。详见链接:http://www.opengl.org/wiki/Sync_Object。 - Nicol Bolas
Nicol:但是如果我使用“同步对象”,我仍然必须调用clEnqueueAcquireGLObjects(),所以我认为这不是解决方案:( - Milan
1
glFinish和clFinish是必要的。OpenCL必须在OpenGL接管之前完成,反之亦然(clFlush仅保证命令已发出而不是已完成)。我之前编写了一个使用ocl和ogl的小程序(使用clFinish和glFinish),即使内核正在运行,我也可以在GTX660Ti上达到约500 fps的速度。因此,我几乎可以确定问题出在其他地方。 - CaptainObvious
40FPS适用于8K分辨率,在全高清下大约运行450FPS。 - Milan
CaptainObvious:你用了帧缓冲吗?我需要渲染到纹理,然后在CL中应用后期制作。 - Milan
显示剩余6条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接