2012-05-22 11 views
5

Pracuję nad opartą na linuksie aplikacją OpenGL w języku C++, wykorzystując sterowniki 64-bitowe Nvidia 290.10. Próbuję zmniejszyć jego ślad pamięci, ponieważ wykorzystuje sporo danych na żywo.Używanie sterty libGL

Używam valgrind/massif do analizy użycia sterty, a jednocześnie pomógł mi zoptymalizować różne rzeczy, teraz największy fragment pamięci stosu jest przydzielany przez libGL. Bez względu na to, jak ustawiam próg, masyw nie pozwala mi zobaczyć szczegółowo skąd pochodzą te alokacje, tylko że jest to libGL. W godzinach szczytu widzę około 250 MB przydzielonych przez libGL (z całkowitego wykorzystania sterty wynoszącego 900 MB). Posiadam podobną ilość pamięci na karcie graficznej, jak VBO i tekstury (głównie jedna duża tekstura 4096 * 4096).

Wygląda na to, że podobna ilość pamięci, jaką ładuję do pamięci GPU, jest przydzielana do sterty przez bibliotekę libGL. Przydziały libGL również osiągają szczyt gdy objętość VBO osiąga szczyt. Czy to normalne? Myślałem, że jedną z zalet posiadania dużej ilości pamięci GPU jest to, że utrzymuje ona pamięć RAM za darmo?

+1

jakiego użycia określiłeś dla VBO w 'glBufferData'? – KillianDS

+0

W przypadku większości VBO jest to GL_STATIC_DRAW. W jednym przypadku jest to GL_STREAM_DRAW, ale zachowanie jest takie samo, nawet jeśli ta część aplikacji jest wyłączona. – pholz

+0

@KillianDS nie ma znaczenia, ponieważ użycie jest tylko wskazówką, a nie obowiązkową. Również OpenGL musi zachować kopię z różnych powodów. – datenwolf

Odpowiedz

7

To, czego doświadczasz, jest całkowicie normalne, ponieważ implementacja OpenGL musi przechowywać kopię danych w pamięci systemowej z różnych powodów.

W OpenGL nie ma wyłącznego dostępu do GPU, więc w zależności od jego wykorzystania może zajść konieczność wymiany danych (lub zwolnienia niektórych obiektów z pamięci GPU). Mogą również ulegać awariom GPU, a sterowniki po prostu bezszelestnie resetują je bez zauważania przez użytkownika. To również wymaga pełnej kopii wszystkich danych bufora.

I nie zapominaj, że istnieje zasadnicza różnica pomiędzy adresowej alokacji przestrzeni (wartość zgłoszonych przez Valgrind) i rzeczywisty wykorzystania pamięci.

+0

Dzięki, podejrzewałem, że to może być coś takiego. Teraz, gdy pamięć RAM jest wypełniona, czy jest to mniej złe, o ile duża część przydziałów pochodzi z biblioteki libGL? – pholz

+2

pholz: Cóż, libGL jest właśnie tym, skąd pochodzi kod alokacji, ale pamięć jest efektywnie przydzielana przez proces, który alokował zasoby OpenGL. A w systemie nie ma różnicy między nimi. Również nowoczesne systemy operacyjne nie rozróżniają pamięci RAM i pamięci masowej. Dla nich jest tylko "pamięć", a pamięć RAM to kolejny poziom pamięci podręcznej. Zobacz ten artykuł, aby uzyskać bardzo dobre wprowadzenie do nowoczesnego wykorzystania pamięci https://www.varnish-cache.org/trac/wiki/ArchitectNotes – datenwolf