2013-07-27 11 views
5

Mam kod, w którym tworzę teksturę GL 8K (7680 x 4320) i renderuję do tej tekstury. Następnie przełączam go na CL i robię kilka rzeczy ...OpenCL - wydajność OpenGL Interop

Problem polega na tym, że "przełączanie" przebiega bardzo wolno.

Jeśli nie uruchomię żadnego kodu CL, przełącz tylko. Ma około 40FPS na moim GTS 450.

Jeśli komentarz "clEnqueueAcquireGLObjects (..)" line => bez przełącznika. Ma około 600 FPS.

Czy istnieje sposób, w jaki mogę przyspieszyć?

Chcę też zapytać Jeśli problem dotyczy tylko Nvidii lub innych urządzeń takich jak Ati, Intel i niektóre urządzenia SoC (ARM) mają ten sam problem z szybkością?

Tworzenie GL-CL tekstury:

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

Odpowiedz

2

samo jak podobne pytanie zadane w tym wątku: LINK

Jest to problem w sterowniku zaledwie nVIDIA + Windows. Nie AMD, nie Intel, a nie w Linuksie. Ale jak komentarz @ user2725937 mówi:

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

Na platformie glFinish nie może być tutaj wymagane i clFinish. Zamiast tego spróbuj użyć i clFlush.

To naprawdę zależy od platformy, jak wspomniano w specyfikacji rozszerzenia CL/GL. Specyfikacja mówi, że Finish jest jedynym w pełni przenośnym sposobem, ale mogą istnieć szybsze alternatywy.

W systemie Mac OS X, na przykład, trzeba tylko glFlushRenderAPPLE i nie clEnqueueAcquireGLObjects podczas przełączania z GL do CL, a następnie tylko clFlush i nie clEnqueueReleaseGLObjects podczas przełączania z powrotem do GL.

+3

Jak o zrobieniu ani i używając [płot synchronizacji obiektu] (http://www.opengl.org/wiki/Sync_Object)? –

+0

Właśnie próbowałem "flush" i to samo :(Powolne rzeczy dzieją się w clEnqueueAcquireGLObjects() i clEnqueueReleaseGLObjects(). "Finish" lub "Flush" nie jest problemem! – Milan

+0

Nicol: Ale jeśli użyję "obiektu synchronizacji". nadal musi wywołać clEnqueueAcquireGLObjects(), więc myślę, że to nie jest rozwiązanie :( – Milan