Verwendeten GPU-Speicher berechnen

Für Fragen zu Grafik APIs wie DirectX und OpenGL sowie Shaderprogrammierung.
Antworten
NoFake3D
Beiträge: 59
Registriert: 27.12.2012, 13:12

Verwendeten GPU-Speicher berechnen

Beitrag von NoFake3D »

Hi,

Wie berechne ich den aktuell verwendeten Grafikkarten-Speicher bei Direct3D 11?

Bei den verwendeten *.DDS-Texturen addiere ich die Datei-Größen.
Bei den verwendeten Eckpunkten, Indizes und Knochen-Matrizen addiere ich jeweils die ByteWidth-Angaben der Der D3D11-Puffer-Beschreibungen (D11_BUFFER_DESC - CreateBuffer).
Gilt das auch bei Konstanten-Puffern?

Habe ich noch was übersehen?

Gruß,
Daniel
Zuletzt geändert von NoFake3D am 11.12.2014, 01:26, insgesamt 2-mal geändert.
Spiele Programmierer
Establishment
Beiträge: 426
Registriert: 23.01.2013, 15:55

Re: Verwendeter GPU-Speicher berechnen

Beitrag von Spiele Programmierer »

Damit kannst du höchstens ganz grob abschätzen.
Wieviel Speicher zur Verwaltung des Treibers drauf gehen, bekommst du so nie heraus.
Was du außerdem vergessen hast sind Shader oder Framebuffer.

Was willst du den eigentlich erreichen?

Vielleicht gibt es auch eine Möglichkeit die Werte mit Dx11 direkt zu ermitteln.
Bei OpenGL gäbe es zum Beispiel verschiedene Extensions dafür.
NoFake3D
Beiträge: 59
Registriert: 27.12.2012, 13:12

Re: Verwendeten GPU-Speicher berechnen

Beitrag von NoFake3D »

Hi Spiele Programmierer,
Damit kannst du höchstens ganz grob abschätzen.
Eine grobe Abschätzung ist für mich ok.
Was du außerdem vergessen hast sind Shader oder Framebuffer.
Die ganzen Shader und Frame-Puffer habe ich übersehen. Danke.
Zumindest habe ich die Konstanten-Puffer für die Shader berücksichtigt.
Höchstwahrscheinlich fehlt auch noch der verwendete GPU-Speicher für die Direct2D/DirectWrite-Texte.
Was willst du den eigentlich erreichen?
Die GPU-Speicher-Informationen brauche ich momentan noch nicht
(integriert ist die grobe Abschätzung in meiner Engine trotzdem (noch ohne Shader-, Framebuffer- und Direct2D/DirectWrite-Berücksichtigung)).
Vielleicht gibt es auch eine Möglichkeit die Werte mit Dx11 direkt zu ermitteln.
Bei OpenGL gäbe es zum Beispiel verschiedene Extensions dafür.
Für Direct3D 11 und Direct2D/DirectWrite habe ich leider nichts gefunden.

Gruß,
Daniel
Zuletzt geändert von NoFake3D am 13.12.2014, 14:16, insgesamt 1-mal geändert.
Benutzeravatar
Schrompf
Moderator
Beiträge: 4855
Registriert: 25.02.2009, 23:44
Benutzertext: Lernt nur selten dazu
Echter Name: Thomas Ziegenhagen
Wohnort: Dresden
Kontaktdaten:

Re: Verwendeter GPU-Speicher berechnen

Beitrag von Schrompf »

Nach meinem Wissen gibt es keine Möglichkeit, solche Statistiken abzufragen. Du kommst aber ganz gut hin, wenn Du alle Buffergrößen zusammenrechnest. Also FrameBuffer, Vertex- und Index-Buffer und Texturen mit MipMaps. Alles andere ist Kleinkram. Wenn Du Shader und Vertexdeklarationen unbedingt mit drin haben willst, kannst Du ja pauschal 1kb pro Exemplar annehmen - das ist alles vernachlässigbar im Vergleich zu den Texturen und Rendertargets.
Früher mal Dreamworlds. Früher mal Open Asset Import Library. Heutzutage nur noch so rumwursteln.
NoFake3D
Beiträge: 59
Registriert: 27.12.2012, 13:12

Re: Verwendeten GPU-Speicher berechnen

Beitrag von NoFake3D »

Hi Schrompf,

Danke für die Tipps.
Nach meinem Wissen gibt es keine Möglichkeit, solche Statistiken abzufragen. Du kommst aber ganz gut hin, wenn Du alle Buffergrößen zusammenrechnest. Also FrameBuffer, Vertex- und Index-Buffer und Texturen mit MipMaps
So habe ich es auch gemacht.
Wenn Du Shader und Vertexdeklarationen unbedingt mit drin haben willst, kannst Du ja pauschal 1kb pro Exemplar annehmen
Mir genügen die Konstanten-Puffer-Größen der D11_BUFFER_DESC.

Beim FrameBuffer/SwapChain bin ich mir nicht sicher. Aktuell sieht das bei meinem SwapChain so aus:

Groesse_in_Bytes = SwapChain.Width * SwapChain.Height * DXGI_FORMAT_B8G8R8A8_UNORM-Size_in_Bytes * (FrontBuffer + BackBuffer)
Groesse_in_Bytes = SwapChain.Width * SwapChain.Height * 4 * 2;

Muss der MSAA-Faktor auch mitberücksichtigt werden?

Also so?:
Groesse_in_Bytes = SwapChain.Width * SwapChain.Height * DXGI_FORMAT_B8G8R8A8_UNORM-Size_in_Bytes * (FrontBuffer + BackBuffer) * Multisampling-Faktor

Gruß,
Daniel
Zuletzt geändert von NoFake3D am 13.12.2014, 14:16, insgesamt 1-mal geändert.
Benutzeravatar
mnemonix
Establishment
Beiträge: 101
Registriert: 09.04.2010, 20:38

Re: Verwendeter GPU-Speicher berechnen

Beitrag von mnemonix »

Hi NoFake3D,

nach einer kleinen Recherche im Internet bin ich auf folgende Seite gestoßen. Es scheint wohl eine undokumentierte Funktion (ab Windows 7 und höher), namens D3DKMTQueryStatistics, zu geben (versteckt in der GDI32.dll), mit der sich GPU Statistiken auslesen lassen können. Dazu benötigst du jedoch noch eine spezielle Header-Datei (d3dkmtQueryStatistics.h). Mozilla scheint diese Funktion auch in ihrer Code Basis zu nutzen. Siehe hierzu folgende Dateien: gfxWindowsPlatform.cpp (GPUAdapterReporter::CollectReports) und d3dkmtQueryStatistics.h. Die benötigte Adapter LUID des ID3D11Device bekommst du über das DXGIAdapter Interface heraus. Vielleicht hilft dir das weiter.
Benutzeravatar
Krishty
Establishment
Beiträge: 8240
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: Verwendeten GPU-Speicher berechnen

Beitrag von Krishty »

Das ist dann aber der Speicher, den alle Prozesse verwenden (inklusive z.B. Browser), und nicht nur der des eigenen Prozesses, oder?

Dann nimmt das Programm nachher an, es hätte bloß ein paar MiB zur Verfügung weil der Browser alles auffrisst, obwohl dessen Speicher in den RAM ausgelagert wird sobald das Spiel in den Vollbildmodus schaltet …

Siehe auch The Old New Thing — Don't try to allocate memory until there is only x% free
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Spiele Programmierer
Establishment
Beiträge: 426
Registriert: 23.01.2013, 15:55

Re: Verwendeten GPU-Speicher berechnen

Beitrag von Spiele Programmierer »

Interessant.
Ich muss gestehen, ich bin auch schon so ähnlich vorgegangen.
Die Frage ist, gibt es eine Lösung zu dem Problem? (Um sich dem verfügbaren Speicher anzupassen.)
Benutzeravatar
Krishty
Establishment
Beiträge: 8240
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: Verwendeten GPU-Speicher berechnen

Beitrag von Krishty »

Es spricht ja nichts dagegen, den Gesamtspeicher des Systems abzufragen und den eigenen Verbrauch dagegen anzurechnen (sobald man im Vollbildmodus ist, kann man getrost davon ausgehen, dass keine anderen Anwendungen GPU-Ressourcen verbrauchen; Windows schaltet ja z.B. extra Aero ab – und für den Spezialfall, dass jemand im Hintergrund Bitcoins minet, kann man einen Schieberegler ins Programm einbauen). Also genau, was NoFake3D eigentlich möchte.

Es bricht ja nur zusammen, wenn *fremde* Prozesse in die Berechnung einbezogen werden, weil dann Wechselwirkungen entstehen.
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Benutzeravatar
Schrompf
Moderator
Beiträge: 4855
Registriert: 25.02.2009, 23:44
Benutzertext: Lernt nur selten dazu
Echter Name: Thomas Ziegenhagen
Wohnort: Dresden
Kontaktdaten:

Re: Verwendeten GPU-Speicher berechnen

Beitrag von Schrompf »

Was willst Du denn davon ableiten, wenn Du dann irgendwie abgeschätzt hast, wieviel physischer VideoRAM Dir noch zur Verfügung steht? Und was tust Du bei Laptop-Grafikkarten mit zb. 64MB physischem RAM und "bis zu zwei Gigabyte" geborgtem Mainboard-RAM?
Früher mal Dreamworlds. Früher mal Open Asset Import Library. Heutzutage nur noch so rumwursteln.
Benutzeravatar
mnemonix
Establishment
Beiträge: 101
Registriert: 09.04.2010, 20:38

Re: Verwendeten GPU-Speicher berechnen

Beitrag von mnemonix »

Krishty hat geschrieben:Das ist dann aber der Speicher, den alle Prozesse verwenden (inklusive z.B. Browser), und nicht nur der des eigenen Prozesses, oder?
Ich bin da kein Experte, aber so wie ich das aus dem Quelltext verstanden habe, lässt sich damit auch der pro Prozess verwendete GPU (dedicated und shared) Speicher anfragen (siehe explizite Übergabe des Prozess Handles). Der Process Hacker (Open-Source Pendant zum Process Explorer) nutzt ebenfalls diese Funktion für das GPU Monitoring (nicht nur GPU Speicher, auch Laufzeit/Nutzung) und dort kann man sich explizit für jeden Prozess die GPU Statistiken anzeigen lassen.
Benutzeravatar
Krishty
Establishment
Beiträge: 8240
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: Verwendeten GPU-Speicher berechnen

Beitrag von Krishty »

Super, dann muss man sich eine Sorge weniger machen :)
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
NytroX
Establishment
Beiträge: 364
Registriert: 03.10.2003, 12:47

Re: Verwendeten GPU-Speicher berechnen

Beitrag von NytroX »

Oder auch nicht.
Ich kenne jetzt den Process Hacker nicht, aber der Process Explorer zeigt jedenfalls nicht die richtigen Werte an.
Manchmal crashed er sogar nach einiger Zeit, wenn man sich die GPU-Sachen anschaut.

Ich denke mal am sinnigsten sind die SDKs der entsprechenden Hersteller, damit sieht man sowas im Detail. Und das neue kostenlose VisualStudio kommt da wie gelegen, darin funktionieren ja auch Addons :-)
z.B. für nVidia: https://developer.nvidia.com/nsight-vis ... n-features
Benutzeravatar
mnemonix
Establishment
Beiträge: 101
Registriert: 09.04.2010, 20:38

Re: Verwendeten GPU-Speicher berechnen

Beitrag von mnemonix »

Ich habe vorhin mal verschiedene Tools, die den GPU Speicher verfolgen, getestet (GPU-Z, MSI Afterburner, Process Hacker, Process Explorer und wie sie alle heißen) und sie gleichzeitig laufen lassen. Jedes Tool zeigt überraschenderweise einen anderen Wert an. Von daher würde ich diesen Tools nicht trauen, eventuell auch nicht der besagten D3DKMTQueryStatistics Funktion, und eher NytroX's Rat befolgen und die jeweiligen SDKs der GPU Hersteller (NVAPI, ADL, ...) nutzen.
NoFake3D
Beiträge: 59
Registriert: 27.12.2012, 13:12

Re: Verwendeten GPU-Speicher berechnen

Beitrag von NoFake3D »

Hi mnemonix,

Danke für den Tipp mit der D3DKMTQueryStatistics-Funktion.
daher würde ich diesen Tools nicht trauen, eventuell auch nicht der besagten D3DKMTQueryStatistics Funktion, und eher NytroX's Rat befolgen und die jeweiligen SDKs der GPU Hersteller (NVAPI, ADL, ...) nutzen.
Deshalb bleibe ich sehr wahrscheinlich bei meiner selbstgebastelten GPU-Speicher-Berechnung.
Der Rat von NytroX ist gut (wenn man Grafikkarten von NVIDIA und von AMD hat, um das testen zu können). Ich habe aber nur eine AMD-Grafikkarte.

Gruß,
Daniel
NytroX
Establishment
Beiträge: 364
Registriert: 03.10.2003, 12:47

Re: Verwendeten GPU-Speicher berechnen

Beitrag von NytroX »

Antworten