[DX9] GPU Time richtig interpretieren

Für Fragen zu Grafik APIs wie DirectX und OpenGL sowie Shaderprogrammierung.
Antworten
Benutzeravatar
Zudomon
Establishment
Beiträge: 2112
Registriert: 25.03.2009, 08:20
Kontaktdaten:

[DX9] GPU Time richtig interpretieren

Beitrag von Zudomon » 20.12.2016, 01:09

Über D3DQUERYTYPE_TIMESTAMP lese setze ich nun Timestamps um die Drawcall aufrufe. Nun wird ja eigentlich der Startwert vom Endwert abgezogen. Die Differenz dann mit der Frequenz geteilt.
Nun ermittel ich die Frequenz mittels D3DQUERYTYPE_TIMESTAMPFREQ per Frame, erhalte aber immer 0,1 GHz. Demnach braucht ein Frame bei mir über eine halbe Sekunde.
Nach kurzer Suche habe ich das hier gefunden, meinem Szenario entspricht:
http://www.gamedev.net/topic/683221-d3d ... -to-01ghz/
Aber wirklich anfangen kann ich mit der Antwort nichts. Da ich die Werte eigentlich eh nur relativ im Verhältnis setze ist es "eigentlich" nicht so wichtig, die einzelnen Zeiten genau umzurechnen, aber trotzdem etwas unschön.
Die Frage ist also, wie kann ich die Ticks zuverlässig in Zeit umrechnen?


EDIT: Als kleinen Workaround könnte man vielleicht einfach die Zeiten zusammenrechnen und dann an die gesamt Frametime skalieren... das wäre nicht exakt, aber näher dran, als jetzt. Gleich kommt mich Krishty wieder hauen! :lol:

Benutzeravatar
Schrompf
Moderator
Beiträge: 3848
Registriert: 26.02.2009, 00:44
Benutzertext: Lernt nur selten dazu
Echter Name: Thomas Ziegenhagen
Wohnort: Dresden
Kontaktdaten:

Re: [DX9] GPU Time richtig interpretieren

Beitrag von Schrompf » 20.12.2016, 10:26

Die Antwort sagt ja genau das: das ist ein Dummy-Wert, und da die Timer-Events für nix anderes als Profiling nützlich sind, wird sich da auch niemand mehr drum kümmern. Nach meiner Drei-Minuten-Googeln-Perspektive ist also das Skalieren mit der Echtwelt-Dauer eines Frames die einzige Möglichkeit, wenn Du denn wirklich die konkreten Zahlenwerte brauchst. Brauchst Du natürlich nicht, hast Du ja auch schon selbst bemerkt, aber ich vermute, dass ist wieder so ein Zudo-Problem, das auch trotz mangelndem Nutzen gelöst werden muss.
Häuptling von Dreamworlds. Baut an was Neuem. Hilft nebenbei nur höchst selten an der Open Asset Import Library mit.

Benutzeravatar
Zudomon
Establishment
Beiträge: 2112
Registriert: 25.03.2009, 08:20
Kontaktdaten:

Re: [DX9] GPU Time richtig interpretieren

Beitrag von Zudomon » 20.12.2016, 10:52

Hahahaha... ich glaube, da schätzt du mich aber falsch ein :lol:
Für mich geht es eigentlich immer nur um schnelle und einigermaßen brauchbare Lösungen. Nachdem ich extra das Frequenzauslesen eingebaut hatte, dachte ich, ich müsste es nur richtig verwenden. Als Übergang hatte ich das heute morgen schon gemacht, mit der Frametime zu skalieren. Mir reicht diese Lösung dann auch dicke, denn wenn es mir die Stellen aufweist, wo ich nochmal genauer schauen sollte, dann hat es ja seinen Zweck erfüllt. :D
Die Frage kam jetzt eben nur auf, weil es ja hätte sein können, dass ich da einfach irgend eine Kleinigkeit nicht beachte.
Aber danke für die Antwort, die gibt mir Sicherheit, darauf keine weitere Zeit mehr zu verschwenden.

Habe noch entstehende Negativwerte gefiltert die wohl durch Überläufe und sonst was kommen.

Es gibt da auch noch ein paar andere Queries die man zum Messen nutzen kann, Auslastungen verschiedener Art. Auch sehr interessant, aber auch das werde ich erst genauer betrachten, wenn ich überhaupt mal den Plan bekomme, was das ganze macht. Wie gesagt, ich bin da eher der flapsige Typ. Es soll was geiles raus kommen, aber bitte ohne dass ich vorher Raketentechnik studieren muss... :D

Benutzeravatar
dot
Establishment
Beiträge: 1657
Registriert: 06.03.2004, 19:10
Echter Name: Michael Kenzel
Kontaktdaten:

Re: [DX9] GPU Time richtig interpretieren

Beitrag von dot » 20.12.2016, 12:11

Zudomon hat geschrieben:Demnach braucht ein Frame bei mir über eine halbe Sekunde.
Wie kommst du auf dieses Ergebnis?

Benutzeravatar
Zudomon
Establishment
Beiträge: 2112
Registriert: 25.03.2009, 08:20
Kontaktdaten:

Re: [DX9] GPU Time richtig interpretieren

Beitrag von Zudomon » 20.12.2016, 12:51

dot hat geschrieben:
Zudomon hat geschrieben:Demnach braucht ein Frame bei mir über eine halbe Sekunde.
Wie kommst du auf dieses Ergebnis?
Ich hatte alle Messergebnisse der Drawcalls zusammenaddiert... *weg duck* (warum hab ich die ganze Zeit Angst, dass Krishty gleich in den Thread springt? :lol: )

Benutzeravatar
dot
Establishment
Beiträge: 1657
Registriert: 06.03.2004, 19:10
Echter Name: Michael Kenzel
Kontaktdaten:

Re: [DX9] GPU Time richtig interpretieren

Beitrag von dot » 20.12.2016, 13:28

Zudomon hat geschrieben:
dot hat geschrieben:
Zudomon hat geschrieben:Demnach braucht ein Frame bei mir über eine halbe Sekunde.
Wie kommst du auf dieses Ergebnis?
Ich hatte alle Messergebnisse der Drawcalls zusammenaddiert...
Und du setzt aber schon separate Queries für start und ende jedes Drawcall ab und syncest erst zum Schluss!?

Benutzeravatar
Zudomon
Establishment
Beiträge: 2112
Registriert: 25.03.2009, 08:20
Kontaktdaten:

Re: [DX9] GPU Time richtig interpretieren

Beitrag von Zudomon » 20.12.2016, 13:31

dot hat geschrieben:
Zudomon hat geschrieben:Ich hatte alle Messergebnisse der Drawcalls zusammenaddiert...
Und du setzt aber schon separate Queries für start und ende jedes Drawcall ab und syncest erst zum Schluss!?
Also es ist alles Quick&Dirty... in einem Frame setze ich vor und nach jedem Drawcall einen Timestamp, damit ich garantiere, dass das, was zwischendurch noch die GPU macht, nicht mit rein spielt in die Zeit... sollte man vielleicht auch messen, aber ich wollte eben nur die Calls seperat haben erstmal. Nachdem alles durch ist, wird solange gewartet, bis das umschließende Timedisjoint query ready ist. Danach werden dann alles Timestamps ausgelesen.

Benutzeravatar
dot
Establishment
Beiträge: 1657
Registriert: 06.03.2004, 19:10
Echter Name: Michael Kenzel
Kontaktdaten:

Re: [DX9] GPU Time richtig interpretieren

Beitrag von dot » 20.12.2016, 13:46

Ok, und dann summierst du die Differenzen aller benachbarten Timestamps auf und dividierst die Summe durch die Frequency!?

Benutzeravatar
Zudomon
Establishment
Beiträge: 2112
Registriert: 25.03.2009, 08:20
Kontaktdaten:

Re: [DX9] GPU Time richtig interpretieren

Beitrag von Zudomon » 20.12.2016, 14:02

dot hat geschrieben:Ok, und dann summierst du die Differenzen aller benachbarten Timestamps auf und dividierst die Summe durch die Frequency!?
Die Frage ist jetzt, auf wann du dich beziehst. Also als ich das mit der halben Sekunde angeführt habe, da habe ich das so gemacht, dass ich die Ticks durch die Frequenz geteilt habe. Aber die Frequenz ist exakt 100 Millionen und wie oben ja schon erwähnt, anscheinend nur ein Dummy Wert. Da die Frequenz also nicht mit den Ticks in Verbindung stehen, sind die Zeiten natürlich auch nicht richtig.
Deswegen nehme ich nun statt der Frequenz das Inverse des Framedeltas. Also skaliere die Ticks eben auf diese z.B. 14 ms des Frames.

Benutzeravatar
dot
Establishment
Beiträge: 1657
Registriert: 06.03.2004, 19:10
Echter Name: Michael Kenzel
Kontaktdaten:

Re: [DX9] GPU Time richtig interpretieren

Beitrag von dot » 20.12.2016, 14:18

Zudomon hat geschrieben:Da die Frequenz also nicht mit den Ticks in Verbindung stehen, sind die Zeiten natürlich auch nicht richtig.
Die Frequenz ist vielleicht ein "Dummywert" in der Hinsicht, dass sie nicht der Taktfrequenz der GPU entspricht. Das ist vollkommen normal; steht ja auch nirgendwo dass das so sein müsste. Die Timestamp-Frequency ist einfach die Frequenz in der die Timestamps hochzählen. Die Timestamps müssen entsprechende Werte haben, sodass man über die Frequency auf die Zeit kommt; wenn das nicht der Fall ist, dann ist da was faul. Ich habs in D3D9 nicht ausprobiert, aber ich verwend Events/Queries praktisch tagtäglich in allen möglichen anderen APIs (OpenGL, Direct3D, CUDA, ...) und da funktioniert das mit den Timestamps und Frequencies überall ganz ausgezeichnet...

Benutzeravatar
Schrompf
Moderator
Beiträge: 3848
Registriert: 26.02.2009, 00:44
Benutzertext: Lernt nur selten dazu
Echter Name: Thomas Ziegenhagen
Wohnort: Dresden
Kontaktdaten:

Re: [DX9] GPU Time richtig interpretieren

Beitrag von Schrompf » 20.12.2016, 14:36

Naja, kann ja auch sein, dass Du mit den Timer Events wirklich den Tick Count von irgendnem internen High Frequency Timer bekommst, aber der Getter für die Frequenz halt nicht implementiert ist.
Häuptling von Dreamworlds. Baut an was Neuem. Hilft nebenbei nur höchst selten an der Open Asset Import Library mit.

Benutzeravatar
Zudomon
Establishment
Beiträge: 2112
Registriert: 25.03.2009, 08:20
Kontaktdaten:

Re: [DX9] GPU Time richtig interpretieren

Beitrag von Zudomon » 16.01.2019, 10:38

Ich hatte es damals dabei belassen. Aber da ich nun den Code wieder angefasst habe und scheinbar den Code der Frequenzermittlung rausgeworfen hatte, musste ich nun nochmal suchen, wie man das einbaut. Dabei bin ich über den eigenen Thread gestolpert :D

Also ich bekomme wieder diesen Dummy Wert, aber dot hatte recht. Die Ticks sind halt an der Frequenz skaliert. Also einfach zusammenrechnen und teilen. Ich weiß gar nicht, warum das damals nicht richtig geklappt hat, nun bekomme ich aber vernünftige Werte. Wollte ich nur mitteilen ;)

EDIT: Nun weiß ich auch warum es nicht funktioniert hat. Ich habe damals 64 Messungen aufeinanderaddiert aber vergessen, auch entsprechend zu teilen :oops: Bei der Fehlersuche hatte mich dann wohl dieser Frequenzwert irritiert.

Antworten