Sto lavorando a un'app OS X in una configurazione multi-GPU (Mac Pro a fine 2013) che utilizza OpenCL (sulla GPU secondaria) per generare un trama che viene successivamente disegnata sullo schermo con OpenGL (sulla GPU primaria). L'applicazione è CPU-bound a causa di chiamate a glBindTexture() e glBegin(), entrambi i quali spendono praticamente tutto il loro tempo in:OpenGL/OpenCL Prestazioni di interoperabilità in glBindTexture(), glBegin()
_platform_memmove$VARIANT$Ivybridge
che è una parte del driver video:
AMDRadeonX4000GLDriver
Setup: crea l'OpenGL trama (glPixelBuffer) e poi la sua controparte 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);
Codice disegno: esegue il mapping della trama OpenGL sulla vista. L'intera NSOpenGLView è solo questa trama.
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();
Dopo aver acquisito il controllo della memoria texture (via clEnqueueAcquireGLObjects()), il kernel OpenCL scrive i dati alla struttura e quindi rilascia il controllo di esso (via clEnqueueReleaseGLObjects()). I dati di trama non dovrebbero mai esistere nella memoria principale (se capisco tutto correttamente).
La mia domanda è: è previsto che si spenda così tanto tempo di CPU in memmove()? È indicativo di un problema nel mio codice? O un bug nel driver, forse? Il mio (infondato) sospetto è che i dati delle texture si muovano tramite: GPUx -> CPU/RAM -> GPUy, che vorrei evitare.
Avete una connessione crossfire/sli? Qual è la tua versione e larghezza di banda pci-e? Quanto è grande la tua texture? –
Questo è Mac OS X, quindi non è disponibile il supporto Crossfire o SLI. Ogni GPU ha 15,7 GB/sec di larghezza di banda PCIe 3.0 (16 corsie ciascuna). E la mia app sta lavorando con (a seconda della configurazione) tra una e tre trame a 2048x2048. – senojsitruc