Hayes Technologies - Software Speed Optimization

Geschwindigkeitsoptimierung · Software Speed Optimization · High Performance Computing · Number Crunching · C/C++ · Assembler · SIMD · MMX · SSE · SSE2 · SSE3 · 3DNow!

Software-Geschwindigkeits-Optimierung

Diese Seite erläutert das Thema Software-Geschwindigkeits-Optimierung:

 

Was ist Software-Geschwindigkeits-Optimierung?

Software kann in verschiedener Hinsicht optimiert werden:

  • Speicherbedarf
  • Ease-of-use
  • (Ausführungs)Geschwindigkeit
  • Wartbarkeit
  • Reaktionszeit/Latenzzeit (Reaktionszeit auf externe Ereignisse; wichtig für Echtzeitsoftware)
  • ...

Software-Geschwindigkeits-Optimierung ist die Art von Optimierung, die sich mit der Reduktion der Ausführungsdauer für einen Code-Abschnitt befasst, und zwar durch Design und Implementation dieser Software in einer geeigneten Art und Weise.

Dies sollte nicht verwechselt werden einer anderen Art von Geschwindigkeits-Optimierung: Die Optimierung von Software-Paketen/Applikationen durch eine entsprechende Konfiguration / Parametrierung. Diese Art der Optimierung könnte "Software-Paket-Geschwindigkeits-Optimierung" genannt werden. Ein Beispiel hierfür sind Optimierungen von Datenbankanwendungen durch Konfiguration der Datenbank oder der benutzen Datentypen etc. Ein anderes Beispiel ist das "tunen" eines Betriebssystems durch Festlegen der Größe von Swap-Dateien oder Datei-/Font-/Etc.-Caches.

Der Unterschied zwischen beiden Optimierungs-Arten besteht darin, dass "Software-Geschwindigkeits-Optimierung" sich mit dem Quellcode der Software auseinandersetzt, die tatsächlich von der Hardware ausgeführt wird, während dies bei der "Software-Paket-Geschwindigkeits-Optimierung" nicht der Fall ist.

Im Kontext von Hayes Technologies wird der Begriff "Software-Geschwindigkeits-Optimierung" ausschließlich in der oben definierten Weise benutzt.

Zum Seitenanfang zurück

 

Was beeinflusst die Ausführungsgeschwindigkeit?

Die Ausführungsgeschwindigkeit wird im Wesentlichen beeinflusst / definiert durch:

  • Die Software-Konfiguration des Betriebssystems samt allen Treibern etc.
  • Die benutzten Tools (z.B. Compiler) und Libraries
  • Das Design der Software
  • Die benutzten Algorithmen
  • Die Detail-Implementation der rechenintensivsten Funktionen samt dem Layout der dazugehören Daten
  • Multithreading / Multi-Prozessing / Parallelisierung

Neben diesen Punkten spielt natürlich auch die Hardware-Konfiguration eine große Rolle. Aber dies ist ein separates Thema; die Interaktion von Software-Geschwindigkeits-Optimierung und Hardware-Optimierung muss aber immer bedacht werden.

Zum Seitenanfang zurück

 

Warum Software optimieren?

Dies ist eine Schlüsselfrage. Häufig anzutreffende Gedankengänge hierzu sind:

  1. Die Kunden sind mit der Geschwindigkeit zufrieden.
  2. Die Prozessoren werden ohnehin laufend schneller.
  3. Optimierung kostet Entwicklungszeit und somit Geld, es ist besser eine schnellere Maschine einzusetzen (beim Bundling von HW + SW).
  4. Die Compiler sind heute so gut, dass die Software wahrscheinlich gar nicht weiter beschleunigt werden kann.

Offensichtlich sind diese Argumente in vielen Fällen gültig. Aber lassen Sie uns etwas genauer hinschauen:

  1. Wenn dies wirklich so ist, dann ist das sicher schön für Sie. Aber vielleicht treffen einige der im folgenden aufgeführten Punkte zu?
  2. Das ist sicher richtig. Auf der anderen Seite: Was ist mit denjenigen Ihrer Kunden mit langsameren Prozessoren? Oder haben Sie berücksichtigt, dass langsamere Prozessoren billiger sind? Eine ganze Anzahl Ihrer potentiellen Kunden mag sich gut und gerne gegen Ihre Software bzw. ein Upgrade entschieden haben, weil sie die vollständigen Kosten (inkl. Hardware(-aufrüstung)) scheuen.
  3. Dies muss immer berücksichtigt werden. Der Schlüsselpunkt hierbei ist, dass bei genügend hohem Volumen signifikante Kostenersparnisse erreicht werden können, wenn Software-Geschwindigkeits-Optimierung es erlaubt, eine billigere CPU einzusetzen.
  4. Die Compiler sind die letzten Jahre über signifikant verbessert worden. Es ist aber definitiv ein moderner Mythos, dass ein professionell geschriebenes und von einem aktuellen Compiler kompiliertes Programm eine unverbesserbare Geschwindigkeit erreicht. Beinahe jede Software, die nicht mehrere Optimierungszyklen durch einen in Software-Geschwindigkeits-Optimierung erfahrenen Software-Entwickler hinter sich hat, kann optimiert werden, in den meisten Fällen signifikant (d.h., mehr als Faktor 2)

Und dies sind nicht die einzigen Argumente für Software-Geschwindigkeits-Optimierung:

  1. Eine höhere Geschwindigkeit macht es oft möglich, neue Features oder komplexere Operationen in die Software einzubauen. Haben Sie überlegt, was Ihre Software mehr leisten könnte, wenn sie nur schneller liefe? Typische Beispiele sind komplexere Simulationen (z.B. für Wettervorhersagen), höhere Auflösung, 3D statt 2D. usw. usw.
  2. Für viele Applikationen ist Geschwindigkeit ein Differenzierungsmerkmal. Wenn alle anderen Eigenschaften der Software gleich sind, wird ein schnelleres Programm als das bessere angesehen.

 

Für eine ganze Klasse von Applikationen, solche, bei denen der Stromverbrauch wichtig ist, ist folgender Punkt wichtig:

  1. Schnellere Ausführung ist gleich niedrigerer Stromverbrauch (und aus diesem Grunde, bei Baterie-betriebenen Geräten,  längere Nutzungszeit). Ermöglicht wird dies entweder durch Erhöhung des Anteils der Zeit, in der der Prozessor in den Stromsparmodus geschaltet ist, oder durch Einsatz eines langsameren Prozessores, der weniger Strom verbraucht und typischerweise weniger kostet.

 

Und schließlich muss einer der Argumente angeführt werden, welches mit das höchste Potential für Kostenersparnis und Risikominimierung bietet:

  1. In vielen Fällen kann Software-Geschwindigkeits-Optimierung vermeiden helfen, auf andere, teurere und komplexere Hardware-Plattformen (wie z.B. Multiprozessorsysteme) oder dedizierte Hardware umzusteigen.

Zum Seitenanfang zurück

 

Wie viel schneller kann eine Software durch Software-Geschwindigkeits-Optimierung werden?

Die hängt maßgeblich vom spezifischem Kontext und dem Entwicklungsaufwand ab, der in Software-Geschwindigkeits-Optimierung investiert wurde. Grundsätzlich, wenn die fraglichen Funktionen / Module nicht bereits durchoptimiert sind (z.B. Mathematik-Routinen des Compiler-Herstellers) und die Aufgabe nicht I/O-limitiert ist (durch die Geschwindigkeit des Speichers oder der Festplatte limitiert) und die Aufgabe nicht eher einfach ist (z.B. Element-weise Addition von 2 Arrays, Matrix-Multiplikation etc.), dann liegen die erreichbaren Beschleunigungsfaktoren in vielen Fällen im Bereich 2 .. 5. Und in manchen Fällen noch deutlich höher. Das ist, als ob Ihre Software auf einer Maschine mit bis zu 10 GHz oder sogar mehr als 20 GHz laufen würde! (Bei Annahme einer 2 GHz Maschine als Basis)

 

Warum kann die Beschleunigung so hoch sein? Die Hauptgründe hierfür sind:

  • Typische Software ist durch den Programmier nicht wirklich optimiert
  • Ein Compiler kann einige Reihe von Schlüsselpunkten für die Optimierung nicht beeinflussen, wie z.B. das Datenlayout, die Datentypen, die geforderte Genauigkeit von Algorithmen, die eingesetzten Algorithmen etc. 
  • Ein Compiler weiß nichts von einigen Schlüsselpunkten wie z.B.: Wie oft ist ein if-Ausdruck wahr oder mit welchen Parametern wird eine Funktion aufgerufen (obwohl ein sog. extended profile guided Compiler dies wissen könnte)
  • Ein Compiler versteht den eigentlichen Zweck des Codes nicht, dies verhindert häufig komplexere Optimierungen
  • Ein Compiler hat immer eine limitiertere Sicht bzgl. welche Instruktionen eingesetzt werden könnten (insbesondere bzgl. SIMD Instruktionen), grundsätzlich wird ein Compiler immer eine schematische Lösung für jede Aufgabe einsetzen
  • Compiler messen nicht die Performance verschiedener Code-Varianten und wählen darum nicht den besten Code aus
  • Compiler wenden immer weniger Optimierungsstrategien an als ein Experte für Optimierungen

 

Hayes Technologies kann das Potential für Beschleunigung analysieren inkl. einer Abschätzung des erforderlichen Aufwandes.

Bitte lesen Sie hierzu auch die Fallbeispiele, diese enthalten Zahlen bzgl. der erreichten Beschleunigungsfaktoren, und den Abschnitt über Technologie, dort werden einige der Gründe für die Beschleunigungsfaktore näher erläutert.

Zum Seitenanfang zurück

 

Warum einen Experten für Software-Geschwindigkeits-Optimierung beauftragen?

Grundsätzlich hält Sie nichts davon ab, die Software-Geschwindigkeits-Optimierung selbst in die Hand zu nehmen. Die Praxis zeigt aber, dass nur wenige Teams oder Organisationen tatsächlich diese Aufgabe in einer geeigneten Weise angehen. Nicht ohne Grund: Der Schlüsselgrund hierfür ist, dass Software-Geschwindigkeits-Optimierung eine separate Fachdisziplin ist, die umfassendes Wissen und umfassende Erfahrung erfordert, ähnlich wie bei, z.B., der Entwicklung von Device Drivern oder Betriebssystem-Kerneln.

Zusätzlich zu allen Standardfertigkeiten muss ein Experte für Software-Geschwindigkeits-Optimierung folgendes mitbringen:

  • eine Anzahl von Jahren Erfahrung mit High Level und Assembler Programmierung
  • ein umfassendes Verständnis / Wissen über die interne(n) Arbeitsweise der relevanten Prozessorfamilien und der entsprechenden Assemblersprachen, insbesondere inkl. der neueren Befehlssatzerweiterungen
  • ein umfassendes Verständnis der / Wissen über die Speicherhierarchien und des Cachingverhaltens
  • Wissen über und Erfahrung mit Profiling und Zeitmessung
  • ein umfassendes Wissen über Software-Geschwindigkeits-Optimierungen
  • mehrere Jahre Erfahrung mit Software-Geschwindigkeits-Optimierung

 

Typischerweise bedeutet dies, dass entweder diese Fähigkeiten im Hause nicht vorhanden sind, oder aber sie sind vorhanden, aber die Opportunitätskosten sind sehr hoch, weil es impliziert, dass die erfahrensten Entwickler sich nicht mit anderen wichtigen Aufgaben befassen können, mit der Folge, dass wahrscheinlich Verzögerungen, sub-optimales Software Design, weniger Features etc. auftreten und somit, als letztliche Konsequenz, Reduktion der Gewinne.

 

Werden all diese Punkte berücksichtigt, wird in den meisten Fällen ein externer Experte nicht nur gerechtfertigt, sondern erforderlich sein.

Zum Seitenanfang zurück

Plattformen: x86 · Pentium · Pentium MMX · Pentium II · Pentium III · Pentium 4 · Core · Core 2 · Xeon · Itanium · Athlon · DSPs · Embedded CPUs · Windows · Linux · RT-OS

Besonders profitierende Applikationsgebiete: Bildverarbeitung · Signalverarbeitung · High Performance Computing / Number Crunching · Simulationen · Kompression · Spiele · 3D Software · Gerätetreiber · Multi-Prozessor Systeme · Multi-Computer Systeme / Cluster · Embedded Geräte · Echtzeit-Systeme · Interaktive Systeme · Und viele mehr...