DGL Benchmark

Aus DGL Wiki
Version vom 23. Oktober 2009, 15:54 Uhr von Flash (Diskussion | Beiträge) (1.2. Programm-Kern)

Wechseln zu: Navigation, Suche

Vorwort Diese Spezifikation beschreibt nur die für den Benchmark relevanten Teile. Wie die grafische Ausgabe initialisiert wird ist den Programmierern überlassen. Ebenso wie der Benchmark-Code eingebunden wird (neukompilieren des Programms oder dynamisches Laden z.B. durch Java-Reflection) oder ob und wie eine GUI/Menü benötigt wird.


Spezifikation - DGL Benchmark

Dieses Dokument beschreibt die Fähigkeiten und den generellen Aufbau des Programms DGL Benchmark. Das Programm erstellt Ausgaben in einer definierten Form, welche es ermöglichen Performancemessungen von 1. alternativen Implementierungen in der selben Umgebung 2. identische Implementierungen in verschiedenen Umgebungen zu vergleichen.


1. Aufbau des Programms

Das Programm besteht aus einem Kern sowie dem Benchmark-Code.


1.1. Benchmark-Code

[Benchmark Klasse] Jeder Benchmark wird durch genau eine Benchmark-Klasse abgebildet. Der Benchmark Code befindet sich komplett in dieser Klasse. Diese Benchmark Klasse wiederum befindet sich in einem eigenen Sourcecode-File (z.B. *.pas, *.java, *.cpp+*.h).


[Benchmark Zweck] Jede Benchmark Klasse dient nur genau einem Benchmark-Zweck.

Beispiel
"Überprüfung der Performance der standard OpenGL Shading Methoden (Flat, Smooth)."

Für den Benchmark Zweck gibt es üblicherweise mindestends zwei alternative Implementationsvarianten. Im Beispiel oben eine mit Flat-Shading und eine mit Smooth-Shading.


[Benchmark-Methode]

INPUT: keiner

OUTPUT: keiner

Jede Implementationsvariante des Benchmark-Zwecks wird in einer eigenen öffentlichen Methode der Benchmark Klasse implementiert. Diese Methoden werden einheitlich mit dem präfix "benchmark_" benannt. Es muss in jeder Benchmark-Klasse mindestens eine Benchmark-Methode vorhanden sein.


[Validate-Methode]

INPUT: keiner

OUTPUT: Ein leerer String ("") im Erfolgsfall oder aber eine Beschreibung wieso die Validierung fehlschlug.

Die Validate Methode wird einmalig und vor dem Aufruf der ersten Setup-Methode aufgerufen.

Die Validate Methode prüft ob die benötigte mindest-OpenGL-Version vorhanden ist bzw. ob alle benötigten OpenGL Extensions, die der Benchmark benötigt, verfügbar sind. Ist dies nicht der Fall liefert die Funktion eine Beschreibung des Problems (z.B. den Namen der fehlenden Extension) zurück.

Die Validate Methode ist öffentlich und wird mit "validateBenchmark" bezeichnet.


[Setup-Methoden]

INPUT: keiner

OUTPUT: keiner

Die SetUp Methode ändert immer alle OpenGL Eigenschaften in die für den Benchmark benötigten Werte.

Für jede Benchmark Methode muss eine SetUp Methode existieren. Wird kein SetUp benötigt, kann die Methode leer bleiben.

Die entsprechende SetUp Methode wird vor jedem Aufruf der zugehörigen Benchmark-Methode aufgerufen.

Die Setup-Methode ist öffentlich und wird einheitlich mit dem Namen "setupBenchmark_BENCHMARKNAME" bezeichnet.

Beispiel
Für die Benchmark Methode "benchmark_StdShadingSpeed" muss eine Setup Methode namens "setupBenchmark_StdShadingSpeed" existieren.


[getBenchmarkInfos-Methode]

INPUT: keiner

OUTPUT: Ein formatierter String mit Informationen über den Benchmark. Der String enthält Zeilenumbrüche. Jede Zeile enthält genau einen Datensatz im Format "BEZEICHNER=WERT". Folgende Bezeichner sind vorgesehen

Name 
Der Benchmarkname. Sollte eindeutig sein.
z.B. durch das Vorranstellen des DGL-Usernamen (z.B. Flash.ShadingBenchmark)
Autor 
Der/Die Autor(en)
Version 
Version des Vorliegenden Benchmarks.
(Die Version ist eine Ganzzahl beginnend bei 1 . Die Version eines Benchmarks wird immer dann um 1 erhöht, wenn eine Änderung am Code durchgeführt wurde die eine Performanceänderung einer der Benchmark-Methoden nach sich ziehen könnte.)
Zweck
Der Benchmarkzweck
Loops
Anzahl der Wiederholungen die zur Messung gemacht werden sollen. Dient als Parameter für das Benchmark-Programm. Ganzzahliger Wert. Ist dies nicht angegeben wird 50 als Standardwert genutzt. Wertebereich: 0 < Loops <= 1000.

Mindestens enthalten sein muss der Name des Benchmarks, sowie die Version.

Die Info-Methode wird einheitlich mit dem Namen "getBenchmarkInfos" bezeichnet und ist öffentlich. Jede Benchmark-Klasse muss genau eine Info-Methode besitzen.

1.2. Programm-Kern

Der Programm-Kern steuert den Benchmark Ablauf, den Aufruf des Benchmark-Codes sowie die Erstellung der Benchmark Ausgaben (siehe "2. Benchmark Output").

[Vorbereitung] Das Benchmarkprogramm muss für jeden Benchmark derart vorbereitet werden, dass der Benchmark-Code, welcher nicht Teil des Kernes ist, in diesem verfügbar ist. Falls keine geeigneteren Möglichkeiten zur Verfügung stehen, kann dies dadurch geschehen, dass der Programmierer des Benchmark-Codes den Sourcecode des "DGL Benchmark" Programms nimmt und dort die Einbindung manuell durchführt, neu kompiliert und den Benchmark dann zur Verfügung stellt.


[Benchmark Prozess] Der Benchmarkprozess:

1. Validieren der Struktur der Benchmark-Klasse
- Sind alle Funktionen korrekt benannt? Existieren alle benötigten Setup Methoden? etc.
- Falls nicht: Abbrechen und Ausgabe wie unter 2.2. beschrieben.


2. Aufruf von "validateBenchmark" der Benchmark-Klasse.
- Falls Rückgabe ungleich "" ist, dann Abbrechen und Ausgabe wie unter 2.3. beschrieben.


3. Aufruf von "getBenchmarkInfos" der Benchmark-Klasse.
- Prüfen ob Name und Version enthalten ist. Falls nicht: Abbrechen und Ausgabe wie unter 2.2. beschrieben.
- Prüfen ob Loops angegeben wurde. Falls ja prüfen ob der Wert valide (sonst 50 verwenden).


4. Für jede Implementationsveriante (Benchmark-Methode) wird eine Liste für die Messwerte erstellt.

5. START DES BENCHMARKS (Schleifenbeging (von 1 bis Loops))
5.1. "setupBenchmark_BENCHMARKNAME"
5.2. starten der Zeitmessung
5.3. Aufruf der Benchmark-Methode benchmark_BENCHMARKNAME
5.4. stoppen der Zeitmessung
5.5. speichern des gemessenen Zeit in dafür erstellen Liste (siehe Schritt 4)

5.1.-5.5. für die anderen Benchmark-Methoden
ES WERDEN PRO SCHLEIFENDURCHLAUF IMMER ALLE BENCHMARK-FUNKTIONEN AUSGEFÜHRT.

Beispiel RICHTIG: Loops = 5; 2 Benchmarkfunktionen; resultierende Reihenfolge: B1B2 B1B2 B1B2 B1B2 B1B2

Beispiel FALSCH : Loops = 5; 2 Benchmarkfunktionen; resultierende Reihenfolge: B1B1B1B1B1 B2B2B2B2B2


6. Berechnen der Werte für jede Benchmark-Methode mit Hilfe der gespeicherten Werte

Berechnet werden

  • durchschnittliche Ausführungsdauer des Codes (<AVERAGE_TIME>)
  • daraus resultierende theoretische Framezahl (<AVERAGE_FRAMES>)
  • Standardabweichung (<STD_DEVIATION>)


7. Schreiben der Ausgabe wie unter 2.1.


[Zeitmessung] Zwischen Beginn und Ende der Zeitmessung darf Nichts außer dem Aufruf der aktuell gemessenen Benchmark-Methode stehen. Zur Zeitmessung wird die genaueste Verfügbare Technik eingesetzt.

2. Benchmark Output

Die Ausgabe des Benchmarks erfolgt im XML Format. Ziel ist es die Daten in einem Zweiten Schritt in einer zentralen Datenbasis automatisch einzulesen um darüber Auswertungen erstellen zu können.

2.1. Ausgabe im Erfolgsfall

<DGLBENCHMARK>
 <HEADER>
  <BENCHMARK_INFROMATION>{Die Ausgabe von getBenchmarkInfos}</BENCHMARK_INFROMATION>
  <LANGUAGE>{Programmiersprache in der der Code geschrieben wurde}</LANGUAGE>
  <LOOPS>{Anzahl Loops}</LOOPS>
 </HEADER>
 
  <IMPLEMENTATION name="{Benchmark-Methoden-Name}">
   <AVERAGE_TIME>{Durchschnittliche Zeit}</AVERAGE_TIME>
   <AVERAGE_FRAMES>{Aus der durschn. Zeit berechnete Theoretische Framezahl}</AVERAGE_FRAMES>
   <STD_DEVIATION>{Standardabweichung der Werte}</STD_DEVIATION>
  </IMPLEMENTATION> 

  <IMPLEMENTATION ...
 
</DGLBENCHMARK>

2.2. Ausgabe wenn Benchmark-Klasse nicht den Vorgaben entspricht

<DGLBENCHMARK>
 <HEADER>
  <BENCHMARK_INFROMATION>{Die Ausgabe von getBenchmarkInfos}</BENCHMARK_INFROMATION>
  <LANGUAGE>{Programmiersprache in der der Code geschrieben wurde}</LANGUAGE>
  <LOOPS>{Anzahl Loops}</LOOPS>
 </HEADER>
 <ERROR type="INVALID_BENCHMARK_STRUCTURE">
  {Wenn möglich detailierte Beschreibung was falsch ist, sonst leer.}
 </ERROR>
</DGLBENCHMARK>

2.3. Ausgabe wenn Benchmark-Vorraussetzungen am aktuellen System nicht erfüllt sind

<DGLBENCHMARK>
 <HEADER>
  <BENCHMARK_INFROMATION>{Die Ausgabe von getBenchmarkInfos}</BENCHMARK_INFROMATION>
  <LANGUAGE>{Programmiersprache in der der Code geschrieben wurde}</LANGUAGE>
  <LOOPS>{Anzahl Loops}</LOOPS>
 </HEADER>
 <ERROR type="BENCHMARK_REQUIREMENTS_NOT_MET">
  {Wenn möglich detailierte Beschreibung was fehlt, sonst leer.}
 </ERROR>
</DGLBENCHMARK>