2012-12-05 8 views
6

Zweiteilige Frage:OpenGL-OpenCL Interop Umsteigezeiten + Texturierung von Bitmap

ich an einem Schulprojekt gerade arbeitete das Spiel des Lebens als ein Fahrzeug mit GPGPU zu experimentieren mit. Ich benutze OpenCL und OpenGL für Echtzeit-Visualisierungen und das Ziel ist, dieses Ding so groß und schnell wie möglich zu bekommen. Nach dem Profiling finde ich heraus, dass die Frame-Zeit von CL Acquiring und Releasing der GL-Puffer dominiert wird, und dass die Zeitkosten direkt proportional zur tatsächlichen Größe des Puffers sind.

1) Ist das normal? Warum sollte das sein? Soweit ich weiß, verlässt der Puffer niemals den Gerätespeicher und das CL Acquire/Release verhält sich wie ein Mutex. Sperrt/entsperrt OpenCL jedes Byte einzeln oder so?

Um dies zu umgehen bin ich vom 24-Bit-RGBA-Farbmodus (OpenGLs bevorzugter Farbmodus, wie ich es verstehe?) Auf 8-Bit-RGB-Farbe geschrumpft. Dies hat zu einer erheblichen Beschleunigung geführt, aber nachdem ich meinen Kernel abgestimmt habe, dominieren die Übertragungszeiten wieder.

In Ermangelung von Ideen, wie die Übertragungszeiten vollständig zu eliminieren (kurz von Portierung meines Kerns von OpenCL zu GLSL, die den ursprünglichen Umfang des Projekts überschreiten würde), denke ich jetzt, dass meine beste Wette zu schreiben ist zu einer Bitmap (im Gegensatz zu der 8-Bit-Pixmap, die ich gerade verwende) und dann diese Bitmap mit einem Farbindex verwenden, um ein Quad zu texturieren.

2) Kann ich einen Quad direkt mit einer Bitmap texturieren? Ich habe erwogen, glBitmap zu verwenden, um in einen Hilfspuffer zu zeichnen, und diesen Puffer dann zu verwenden, um mein Quad zu strukturieren, aber ich würde es vorziehen, eine direktere Route zu verwenden, wenn eine verfügbar ist.

Antwort

2

Die Entwurfsabsicht hinter den CL/GL-Interop-Acquire- und Release-Calls bestand darin, dass es sich einfach um Eigentumsübertragungen handelte. In vielen frühen Implementierungen wurden jedoch Kopien der Bilder von CL nach GL und zurück erstellt.

Sofern Sie nicht die Sync-Objekt Erweiterungen in OpenCL 1.1 verwenden, müssen Sie ClFinish vor der Veröffentlichung und GlFinish, bevor Sie erwerben; Sie wird sehen viel Zeit hier verbracht, weil alle in der Warteschlange befindlichen Arbeit abgeschlossen werden muss, bevor diese Anrufe fortgesetzt werden. Einige Plattformen können Sie clFlush anstelle von clFinish verwenden; Überprüfen Sie die OpenCL-Dokumentation Ihres Anbieters.

Mit den neuesten NVIDIA und AMD-Treibern auf mehr oder weniger neuer Hardware, sehe ich die Annehmen und Freigeben von Anrufen ziemlich schnell für HD-Video große Bilder.

+0

Ausgezeichnet. Ich benutze 1.0 (Hardware-Einschränkungen) und bin froh zu wissen, dass diese Probleme gelöst wurden. Ich denke, was ich wirklich brauche, ist eine neue Grafikkarte. –