POV-Ray optimiert - Seite 2


So, nun direkt zu den Ergebnissen: ;)

Die Zeiten stammen von der mitgelieferten Benchmark Szene, die mit Default Einstellungen berechnet wurde.

GCC Flags Zeit
3.3.4
 -pipe -Wno-multichar -O1 28:59
3.4.2
 -pipe -Wno-multichar -O1
27:54

3.3.4 -pipe -Wno-multichar -O2 25:33
3.4.2 -pipe -Wno-multichar -O2 24:51
3.3.4 -pipe -Wno-multichar -O3 26:31
3.4.2 -pipe -Wno-multichar -O3 23:59
3.3.4 ² -pipe -Wno-multichar -O3 -msse
-mfpmath=sse -msse2 -march=k8
-mcpu=k8 -minline-all-stringops
27:19
3.4.2 ² -pipe -Wno-multichar -O3 -msse
-mfpmath=sse -msse2 -march=k8
-mtune=k8 -minline-all-stringops
24:25
3.3.4 ¹  -pipe -Wno-multichar -O3
-ffast-math -funroll-all-loops
26:19
3.4.2 ¹  -pipe -Wno-multichar -O3
-ffast-math -funroll-all-loops
-fpeel-loops -ftracer
-funswitch-loops -funit-at-a-time
23:43


Minuten

0
15
30

¹ Entspricht den Empfehlungen von AMD im Compiler Usage Guideline 3.00 plus -pipe und -Wno-multichar.
² Entspricht dem, was das Configure-Script ohne zusätzliche Optionen selber auswählt.

Mit den automatischen Optimierungen des Compilers können hier locker 15% Rechenzeit eingespart werden. Das ganze hängt allerdings stark von der Anwendung ab, eine generelle Aussage wieviel Geschwindigkeit ein Compiler zusätzlich herausholen kann, lässt sich nicht machen.

Leicht lässt sich erkennen, dass die neuere Compiler-Version deutlich besser mit 64 Bit umgehen kann, was sicherlich auch auf die weiteren Entwicklung von GCC 4 zutreffen wird.

Die größten Optimierungsmöglichkeiten sind beim GCC bereits in den O-Leveln zusammen gefasst, zusätzliche Optionen bringen nur noch einen kleinen Vorteil. Zudem sollte man nie die Kompatibilität der Flags mit dem Programmcode aus den Augen lassen, nicht jedes Programm läuft mit den schärfsten Flags noch stabil.

Eine besondere Option, -Os, die ein möglichst kleines Binary erzeugen soll, ist hier nochmals getrennt aufgeführt:

GCC Flags Zeit
3.4.2  -pipe -Wno-multichar -O1 27:54
3.4.2 -pipe -Wno-multichar -O2 24:51
3.4.2 -pipe -Wno-multichar -O3 23:59
3.4.2 -pipe -Wno-multichar -Os 26:56
3.4.2 -pipe -Wno-multichar -O3 -msse
-mfpmath=sse -msse2 -march=k8
-mtune=k8 -minline-all-stringops
24:25
3.4.2  -pipe -Wno-multichar -O3
-ffast-math -funroll-all-loops
-fpeel-loops -ftracer
-funswitch-loops -funit-at-a-time
23:43


Minuten
0 15 30



Man mag sich zwar denken, eine möglichst kleine Programmdatei spart Speicherplatz (vorallem im knappen Prozessor Cache) und sollte demnach schneller laufen, das ist hier aber nicht der Fall.

Zuguter letzt noch ein Blick auf die verschiedenen Möglichkeiten der Fließkommaberechnung, einmal über die klassiche x87 FPU, einmal soweit wie möglich über SSE und beides gemischt.

GCC Flags Zeit
3.4.2  -pipe -Wno-multichar -O2
-mfpmath=387
32:07
3.4.2 -pipe -Wno-multichar -O2
-mfpmath=sse
24:52
3.4.2 -pipe -Wno-multichar -O2
-mfpmath=sse,387
27:38
Minuten
0 32


Hier lassen sich aufgrund der unterschiedlichen Genauigkeiten auch minimale Differenzen im Ergebnis ausmachen. Dazu wurde die Benchmark Szene mit 800*800 Pixeln Auflösung berechnet und aus zwei Ergebnissen die Differenz gebildet. Zwei zum Test mit selben Optimierungen berechnete Bilder waren hingegen absolut identisch.



387 vs. SSE



387 vs. 387+SSE

Zum Abschluss des kleines Artikelchens noch ein Blick auf das, worüber die ganze Seit geschrieben wurde; die Benchmark Szene:

vorherige Seite