Я работаю над приложением OS X в настройке с несколькими графическими процессорами (Mac Pro, конец 2013 г.), которая использует OpenCL (на вторичном графическом процессоре) для создания текстуры, которая позже отображается на экране с помощью OpenGL (на основной графический процессор) . Приложение загружает ЦП из-за вызовов glBindTexture() и glBegin(), которые тратят практически все свое время на:
_platform_memmove$VARIANT$Ivybridge
который является частью видеодрайвера:
AMDRadeonX4000GLDriver
Настройка: создает текстуру OpenGL (glPixelBuffer), а затем ее аналог OpenCL (clPixelBuffer).
cl_int clerror = 0;
GLuint glPixelBuffer = 0;
cl_mem clPixelBuffer = 0;
glGenTextures(1, &glPixelBuffer);
glBindTexture(GL_TEXTURE_2D, glPixelBuffer);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 2048, 2048, 0, GL_RGBA, GL_FLOAT, NULL);
glBindTexture(GL_TEXTURE_2D, 0);
clPixelBuffer = clCreateFromGLTexture(_clShareGroupContext, CL_MEM_WRITE_ONLY, GL_TEXTURE_2D, 0, glPixelBuffer, &clerror);
Код отрисовки: сопоставляет текстуру OpenGL с областью просмотра. Весь NSOpenGLView — это всего лишь одна текстура.
glClear(GL_COLOR_BUFFER_BIT);
glBindTexture(GL_TEXTURE_2D, _glPixelBuffer); // <- spends cpu time here,
glBegin(GL_QUADS); // <- and here
glTexCoord2f(0., 0.); glVertex3f(-1.f, 1.f, 0.f);
glTexCoord2f(0., hr); glVertex3f(-1.f, -1.f, 0.f);
glTexCoord2f(wr, hr); glVertex3f( 1.f, -1.f, 0.f);
glTexCoord2f(wr, 0.); glVertex3f( 1.f, 1.f, 0.f);
glEnd();
glBindTexture(GL_TEXTURE_2D, 0);
glFlush();
Получив контроль над памятью текстуры (через clEnqueueAcquireGLObjects()), ядро OpenCL записывает данные в текстуру, а затем освобождает контроль над ней (через clEnqueueReleaseGLObjects()). Данные текстуры никогда не должны существовать в основной памяти (если я все это правильно понимаю).
Мой вопрос: ожидается ли, что так много процессорного времени тратится на memmove()? Указывает ли это на проблему в моем коде? Или ошибка в драйвере, возможно? Мое (необоснованное) подозрение состоит в том, что данные текстуры перемещаются через: GPUx -> CPU/RAM -> GPUy, чего я хотел бы избежать.