Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

Sc4v

Alter Hase

  • »Sc4v« ist der Autor dieses Themas

Beiträge: 376

Beruf: Student

  • Private Nachricht senden

1

30.09.2013, 16:51

FLOPS/Performance der GPU messen

Hallo zusammen,

ich habe derzeit folgendes Problem:
Ich messe derzeit die Zeit eines Frames in ms vom Beginn der Renderschleife bis nach glfwSwapBuffers mit glfwGetTime(). Das klappt wunderbar.
Jetzt würde ich jedoch gerne wissen wieviel Zeit meine Shader benötigen ?(
Ist dieses Problem trivial lösbar? Angenommen ich weiß, dass Shader A 20 FLOPS/Aufruf und Shader B 18 FLOPS/Aufruf benötigt. Daraus kann ich jetzt noch nicht garantiert sagen das A schneller als B ist, da vielleicht A auf einer Textur und B auf einen Buffer zugreift (nur mal als Beispiel).
Ich habe folgendes zum messen von FLOPS gefunden:

Zitat

We multiply the number of FLOPS per cycle by the
number of arithmetic pipelines per core, then the number of cores, then
by the frequency. That gives you a number of FLOPS
Ist das korrekt so? Wie kann ich die frequency eines Shaders ermitteln? Ein einfaches

C-/C++-Quelltext

1
2
3
4
glUseProgram(x);
startClock();
render();
endClock();


dürfte der falsche Ansatz sein.
Hat jemand Erfahrungen mit solchen Dingen?

Danke und Gruß

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

2

30.09.2013, 17:18

Wer misst, misst Mist.
Das gilt sowohl für Deinen Versuchsaufbau (also das, was Du da ermittelst), als auch dafür, was Du da überhaupt ermitteln willst.
Welchen Zweck soll das Ganze haben? Hast Du massive Probleme mit der Performance eines gewissen Shaders oder wo liegt das Problem genau?
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

Sc4v

Alter Hase

  • »Sc4v« ist der Autor dieses Themas

Beiträge: 376

Beruf: Student

  • Private Nachricht senden

3

30.09.2013, 17:31

Welchen Zweck soll das Ganze haben? Hast Du massive Probleme mit der Performance eines gewissen Shaders oder wo liegt das Problem genau?
Nein das nicht, es geht mir in erster Linie um Performanzvergleiche verschiedener Implementationen für meine Thesis.

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

4

30.09.2013, 17:52

Dann würde ich Dir empfehlen einfach saumäßig viel zu rendern per VBO-Daten auf der GPU, sodass der Render-Prozess selbst lange dauert und dadurch die relativen Fehler in der Zeitmessung geringer werden. Das sagt sicher auch mehr aus, als wenn die GPU mal kurz hoch und runter taktet, weil sie mal kurz was zu tun bekommt.
Außerdem würde ich nicht den Buffer-Swap mit messen an Deiner Stelle, sondern nur ein glFlush machen.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

Legend

Alter Hase

Beiträge: 731

Beruf: Softwareentwickler

  • Private Nachricht senden

5

30.09.2013, 20:35

Nicht eher glFinish? (Kleines Detail ...)
"Wir müssen uns auf unsere Kernkompetenzen konzentrieren!" - "Juhu, wir machen eine Farm auf!"

Netzwerkbibliothek von mir, C#, LGPL: https://sourceforge.net/projects/statetransmitt/

Sc4v

Alter Hase

  • »Sc4v« ist der Autor dieses Themas

Beiträge: 376

Beruf: Student

  • Private Nachricht senden

6

30.09.2013, 20:59

Mh okay klingt gut, vielen Dank für eure Ratschläge :)

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

7

30.09.2013, 22:00

Ich dachte in der Tat eher an glFlush. Der Unterschied der beiden ist mir allerdings spontan nicht ganz klar, außer dass Flush wohl eine endliche Zeit garantiert. Edit: wohl doch eher glFinish. Flush scheint nicht unbedingt auf alle gerufenen Funktionen zu warten. Weird stuff.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

8

30.09.2013, 23:41

Wenn du wirklich einzelne Frames messen willst, dann nimm weder glFlush() noch glFinish(); verwend Time Queries. Damit kannst du die Ticks zwischen zwei Punkten im Command Stream direkt auf der GPU messen. Generell sind Queries wohl hochinteressant für dich, Primitive Queries und Occlusion Queries erlauben es z.B., direkt die Anzahl der verarbeiteten Primitives und Fragments zu zählen...

Was glFlush() vs. glFinish() betrifft: glFlush() schließt den aktuellen Command Buffer ab und wartet, bis dieser an die Grafikkarte geschickt wurde. glFinish() flushed und wartet, bis die GPU alle abgeschickten Command Buffer abgearbeitet hat. Wenn du darauf basierend die Zeit auf der CPU misst, wirst du immer den Overhead des ganzen Softwarestack mitmessen...

Dieser Beitrag wurde bereits 6 mal editiert, zuletzt von »dot« (30.09.2013, 23:54)


Sc4v

Alter Hase

  • »Sc4v« ist der Autor dieses Themas

Beiträge: 376

Beruf: Student

  • Private Nachricht senden

9

30.09.2013, 23:50

Wenn du wirklich einzelne Frames messen willst, dann nimm weder glFlush() noch glFinish(); verwend Time Queries.
Grade mal angeschaut, einfach und unkompliziert! Danke für diesen Hinweis!

LukasBanana

Alter Hase

Beiträge: 1 097

Beruf: Shader Tools Programmer

  • Private Nachricht senden

10

02.10.2013, 11:25

Ich rate dir auch zu Queries. Hab die vor ein paar Tagen zum ersten Mal verwendet und muss sagen, sie sind mit GL, D3D9 und D3D11 sehr leicht einzubinden.
Schau dir dazu mal die TimeStamp bzw. TimeElapsed Queries an: glBeginQuery, IDirect3DQuery9, ID3D11Query.
Gruß,
Lukas

Werbeanzeige