2012-05-22 6 views
5

Ich arbeite an einem Linux-basierten C++ OpenGL-Anwendung, die Verwendung der Nvidia 290.10 64-Bit-Treiber. Ich versuche, seinen Speicherbedarf zu reduzieren, da es ziemlich viele Live-Daten verwendet.libGL Heap-Verwendung

Ich habe Valgrind/Massif verwendet, um die Heap-Nutzung zu analysieren, und während es mir geholfen hat, verschiedene Dinge zu optimieren, wird jetzt der größte Teil des verwendeten Heap-Speichers von libGL zugewiesen. Egal, wie ich die Schwelle setze, lässt mich das Massiv nicht im Detail sehen, wo diese Zuweisungen herkommen, nur dass es libGL ist. Zu Spitzenzeiten sehe ich etwa 250 MB, die von libGL zugewiesen wurden (von 900 MB Gesamtspeicherauslastung). Ich habe eine ähnliche Menge an Speicher auf der Grafikkarte, wie VBOs und Texturen (meist eine große 4096 * 4096 Textur).

So scheint es, als ob eine ähnliche Menge an Speicher wie das, was ich in den GPU-Speicher hochlade, auf dem Heap durch libGL zugewiesen wird. Die libGL-Zuweisungen erreichen auch ihren Höhepunkt, wenn das Volumen von VBOs ihren Höchstwert erreicht. Ist das normal? Ich dachte einer der Vorteile von viel GPU-Speicher ist, dass es den RAM frei hält?

+1

Welche Verwendung haben Sie für den VBO in 'glBufferData' angegeben? – KillianDS

+0

Für den Großteil der VBOs ist es GL_STATIC_DRAW. In einem Fall ist es GL_STREAM_DRAW, aber das Verhalten ist dasselbe, auch wenn dieser Teil der Anwendung deaktiviert ist. – pholz

+0

@KillianDS spielt keine Rolle, denn die Verwendung ist nur ein Hinweis, nicht zwingend erforderlich. Auch OpenGL muss aus verschiedenen Gründen eine Kopie behalten. – datenwolf

Antwort

7

Was Sie erleben, ist vollkommen normal, weil eine OpenGL-Implementierung aus verschiedenen Gründen eine Kopie der Daten im Systemspeicher behalten muss.

In OpenGL gibt es keinen exklusiven Zugriff auf die GPU, so dass es je nach Verwendung notwendig sein kann, Daten auszutauschen (oder einfach nur einige Objekte aus dem GPU-Speicher freizugeben). Auch GPUs können abstürzen und Treiber werden dann einfach still zurückgesetzt, ohne dass der Benutzer dies bemerkt. Dies erfordert ebenfalls eine vollständige Kopie aller Pufferdaten.

Und vergessen Sie nicht, dass ein großer Unterschied zwischen Adressraumzuweisung gibt es (der von Valgrind berichtete Wert) und der tatsächlichen Speicherauslastung.

+0

Danke, ich vermutete, dass es so etwas sein könnte. Wenn nun der RAM voll ist, ist es weniger schlimm, solange ein großer Teil der Zuweisungen von libGL kommt? – pholz

+2

pholz: Nun, LibGL ist nur, wo der Code, der die Zuordnungen stammt, stammt, aber der Speicher wird effektiv von dem Prozess zugewiesen, der die OpenGL-Ressourcen zugewiesen. Und für das System gibt es keinen Unterschied dazwischen. Auch moderne Betriebssysteme unterscheiden nicht zwischen RAM und Speicher. Für sie gibt es nur "Speicher" und RAM ist nur ein weiterer Cache-Level. In diesem Artikel finden Sie eine sehr gute Einführung in die moderne Speichernutzung https://www.varnish-cache.org/trac/wiki/ArchitectNotes – datenwolf