Verwendeten GPU-Speicher berechnen
Verwendeten GPU-Speicher berechnen
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
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.
-
- Establishment
- Beiträge: 426
- Registriert: 23.01.2013, 15:55
Re: Verwendeter GPU-Speicher berechnen
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.
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.
Re: Verwendeten GPU-Speicher berechnen
Hi Spiele Programmierer,
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.
(integriert ist die grobe Abschätzung in meiner Engine trotzdem (noch ohne Shader-, Framebuffer- und Direct2D/DirectWrite-Berücksichtigung)).
Gruß,
Daniel
Eine grobe Abschätzung ist für mich ok.Damit kannst du höchstens ganz grob abschätzen.
Die ganzen Shader und Frame-Puffer habe ich übersehen. Danke.Was du außerdem vergessen hast sind Shader oder Framebuffer.
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.
Die GPU-Speicher-Informationen brauche ich momentan noch nichtWas willst du den eigentlich erreichen?
(integriert ist die grobe Abschätzung in meiner Engine trotzdem (noch ohne Shader-, Framebuffer- und Direct2D/DirectWrite-Berücksichtigung)).
Für Direct3D 11 und Direct2D/DirectWrite habe ich leider nichts gefunden.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.
Gruß,
Daniel
Zuletzt geändert von NoFake3D am 13.12.2014, 14:16, insgesamt 1-mal geändert.
- Schrompf
- Moderator
- Beiträge: 4884
- Registriert: 25.02.2009, 23:44
- Benutzertext: Lernt nur selten dazu
- Echter Name: Thomas Ziegenhagen
- Wohnort: Dresden
- Kontaktdaten:
Re: Verwendeter GPU-Speicher berechnen
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.
Re: Verwendeten GPU-Speicher berechnen
Hi Schrompf,
Danke für die Tipps.
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
Danke für die Tipps.
So habe ich es auch gemacht.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
Mir genügen die Konstanten-Puffer-Größen der D11_BUFFER_DESC.Wenn Du Shader und Vertexdeklarationen unbedingt mit drin haben willst, kannst Du ja pauschal 1kb pro Exemplar annehmen
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.
Re: Verwendeter GPU-Speicher berechnen
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.
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.
- Krishty
- Establishment
- Beiträge: 8268
- Registriert: 26.02.2009, 11:18
- Benutzertext: state is the enemy
- Kontaktdaten:
Re: Verwendeten GPU-Speicher berechnen
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
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
-
- Establishment
- Beiträge: 426
- Registriert: 23.01.2013, 15:55
Re: Verwendeten GPU-Speicher berechnen
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.)
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.)
- Krishty
- Establishment
- Beiträge: 8268
- Registriert: 26.02.2009, 11:18
- Benutzertext: state is the enemy
- Kontaktdaten:
Re: Verwendeten GPU-Speicher berechnen
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.
Es bricht ja nur zusammen, wenn *fremde* Prozesse in die Berechnung einbezogen werden, weil dann Wechselwirkungen entstehen.
- Schrompf
- Moderator
- Beiträge: 4884
- Registriert: 25.02.2009, 23:44
- Benutzertext: Lernt nur selten dazu
- Echter Name: Thomas Ziegenhagen
- Wohnort: Dresden
- Kontaktdaten:
Re: Verwendeten GPU-Speicher berechnen
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.
Re: Verwendeten GPU-Speicher berechnen
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.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?
- Krishty
- Establishment
- Beiträge: 8268
- Registriert: 26.02.2009, 11:18
- Benutzertext: state is the enemy
- Kontaktdaten:
Re: Verwendeten GPU-Speicher berechnen
Super, dann muss man sich eine Sorge weniger machen :)
Re: Verwendeten GPU-Speicher berechnen
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
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
Re: Verwendeten GPU-Speicher berechnen
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.
Re: Verwendeten GPU-Speicher berechnen
Hi mnemonix,
Danke für den Tipp mit der D3DKMTQueryStatistics-Funktion.
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
Danke für den Tipp mit der D3DKMTQueryStatistics-Funktion.
Deshalb bleibe ich sehr wahrscheinlich bei meiner selbstgebastelten GPU-Speicher-Berechnung.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.
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
Re: Verwendeten GPU-Speicher berechnen
Für AMD/ATI gibts natürlich ähnliche Tools:
z.B. http://developer.amd.com/tools-and-sdks ... erfstudio/
oder http://developer.amd.com/tools-and-sdks ... puperfapi/
z.B. http://developer.amd.com/tools-and-sdks ... erfstudio/
oder http://developer.amd.com/tools-and-sdks ... puperfapi/