performance - OpenCL - OpenGL 互操作性能

标签 performance opengl interop opencl

我有一个代码,我在其中创建 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;
}

最佳答案

与此线程中提出的问题相同的类似问题:LINK
nVIDIA + 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/

相关文章:

java - Glassfish 3.1.2 和 Java EE + Hibernate 的性能非常低

opengl - 可以在片段着色器中声明一个超大的输出数组并保留一些未使用的索引吗?

windows - OpenGL 和(缺少)glBlendFuncSeparate

java - C 性能和编译选项

java - 固定长度数组与字段

c# - 当 Visual Studio 具有焦点(或以管理员身份运行的任何应用程序)时,keybd_event 和 PostMessage win32 不起作用

asp.net - 中等信任度的 LDAP

c# - 如何将 System.Object[*] 转换为 System.Object[]

python - 为了提高我的 python 程序的速度,我应该生成一个单独的线程还是一个单独的进程来进行日志记录?

c++ - 使用 Devil 将纹理段错误加载到 OpenGL 中