2012-05-22 7 views
5

Sto lavorando a un'applicazione OpenGL C++ basata su linux, utilizzando i driver a 64 bit Nvidia 290.10. Sto cercando di ridurre il suo ingombro di memoria in quanto utilizza un gran numero di dati live.utilizzo heap libGL

Sto usando valgrind/massif per analizzare l'utilizzo dell'heap e, mentre mi ha aiutato a ottimizzare varie cose, ormai il grosso pezzo di memoria heap utilizzato è allocato da libGL. A prescindere da come imposto la soglia, il massiccio non mi permette di vedere in dettaglio da dove provengono queste allocazioni, solo che è libGL. Nelle ore di punta, vedo circa 250 MB allocati da libGL (su un totale di 900 MB di utilizzo dell'heap). Ho una quantità di memoria simile sulla scheda grafica, come VBO e Textures (principalmente una grande trama 4096 * 4096).

Quindi sembra come se una quantità di memoria simile a quella che carica nella memoria della GPU sia allocata nell'heap da libGL. Le allocazioni libGL hanno anche un picco quando il volume dei picchi VBOs. È normale? Ho pensato che uno dei vantaggi di avere un sacco di memoria GPU è che mantiene la RAM libera?

+1

quale utilizzo hai specificato per il VBO in 'glBufferData'? – KillianDS

+0

Per la maggior parte dei VBO, è GL_STATIC_DRAW. In un caso è GL_STREAM_DRAW, ma il comportamento è lo stesso anche se questa parte dell'applicazione è disabilitata. – pholz

+0

@KillianDS non importa, perché l'utilizzo è solo un suggerimento, non obbligatorio. Anche OpenGL deve tenere una copia in giro per vari motivi. – datenwolf

risposta

7

Ciò che si sperimenta è perfettamente normale, poiché un'implementazione OpenGL deve conservare una copia dei dati nella memoria di sistema per vari motivi.

In OpenGL non c'è un accesso esclusivo alla GPU, quindi a seconda del suo utilizzo, potrebbe essere necessario scambiare dati (o semplicemente rilasciare alcuni oggetti dalla memoria della GPU). Inoltre, le GPU potrebbero bloccarsi e i driver possono semplicemente resettarle senza che l'utente se ne accorga. Anche questo richiede una copia completa di tutti i dati del buffer.

e non dimenticate che c'è una grande differenza tra indirizzo spazio di allocazione (il valore riportato da Valgrind) e l'effettivo utilizzo della memoria .

+0

Grazie, sospettavo che potesse essere qualcosa del genere. Ora, quando la RAM è piena, è meno male che una parte importante delle allocazioni provenga da libGL? – pholz

+2

pholz: Beh, libGL è proprio da dove proviene il codice da cui provengono le allocazioni, ma la memoria viene effettivamente allocata dal processo che alloca le risorse OpenGL. E per il sistema non c'è differenza tra loro. Anche i moderni sistemi operativi non differenziano tra RAM e storage. Per loro, c'è solo "memoria" e la RAM è solo un altro livello di cache. Vedi questo articolo per un'introduzione molto buona sull'uso della memoria moderna https://www.varnish-cache.org/trac/wiki/ArchitectNotes – datenwolf