我有一个代码,我在其中创建 GL 纹理 8K(7680 x 4320) 并渲染到该纹理。然后我将它切换到 CL 并做一些事情......
问题是“切换”非常慢。
如果我不运行任何 CL 代码,只需切换。它在我的 GTS 450 上有大约 40FPS。
如果我评论“clEnqueueAcquireGLObjects(..)”行 => 没有开关。它有大约 600FPS。
有什么办法可以加快速度吗?
我也想问一下,如果这只是英伟达的问题,还是像 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;
}
最佳答案
与此线程中提出的问题相同的类似问题:LINKnVIDIA + Windows
的驱动有问题只要。不是 AMD,不是英特尔,也不是在 linux 中。
但正如@user2725937 的评论所说:
It is reported to nVIDIA and fixed in 331.xx beta drivers
关于performance - OpenCL - OpenGL 互操作性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17899514/