DSP-Algorithmen effizient implementieren – Teil 2

11. August 2009, 13:08 Uhr | Fabian Plepp
Diesen Artikel anhören

Fortsetzung des Artikels von Teil 3

Compiler-basierte Optimierungstechniken

Dieser Abschnitt beschreibt die compiler-basierten Möglichkeiten zur Optimierung mittels Visual DSP++, der intigrierten Entwicklungsumgebung von Analog Devices. Da die meisten Software-Anwendungen in einer Hochsprache verfasst werden, welche ermöglicht, die Anwendung relativ unabhängig von der Architektur zu implementieren, kommt dem Compiler eine wichtige Rolle bei der Optimierung zuteil. Dabei gibt es verschiedene Compiler-Ansätze, den Code zu optimieren. Die meisten modernen DSP-Compiler wie auch der Visual-DSP++-C/C++-Compiler übersetzen den Hochsprachen-Code zunächst in eine Zwischensprache, welche besser optimiert werden kann, bevor die endgültige Compilierung in Maschinensprache erfolgt. Ein solches Vorgehen ermöglicht auf diese Weise komplexere Optimierungsansätze. Zumeist wird der Code erst statisch optimiert, das heißt im Hinblick auf die statische Programmcode-Abfolge. Dazu wird der in die Zwischensprache übersetzte Programmcode analysiert und versucht, mittels mehrerer Kriterien zu optimieren.

Während Loop-Unrolling und Software-Pipelining schon fast zum Standard der statischen DSP-Optimierung gehören, sind konkrete Parallelisierungsansätze bei den Berechnungen nicht bei allen Compilern zu finden. Ein positives Beispiel stellt hier der TigerSHARC-Compiler dar. Während frühe Compiler zumeist ihre Optimierungen lokal begrenzt durchgeführt haben, ermöglichen es die heutigen, auch interprozedurale Optimierungen durchzuführen – d.h., Parameter, welche in mehreren Prozeduren und Funktionen benutzt werden, verbleiben in den Registern und müssen nicht auf dem Stapelspeicher (Stack) abgelegt und wieder geholt werden. Des Weiteren kann eine Speicheroptimierung vorgenommen werden. Die Ergebnisse der statischen Optimierung können die Ausführungszeit eines Programms bis auf ein Zwanzigstel der ursprünglichen Zeit reduzieren.

Ein weiteres Vorgehen ist die dynamische Optimierung. Das wichtigste Verfahren der dynamischen Optimierung ist die Statistical-Profiling-Methode (Profile-Guided-Optimization). Dazu wird der Code zunächst vollständig compiliert, mit Markern versehen und auf seine spätere Hardware-Plattform geladen. Dort sollte der Code in seiner eigentlichen Umgebung ablaufen, dass heißt, es sollten die gleichen Prozessabläufe stattfinden, die die Software später in der eigentlichen Applikation tätigen wird. Dabei werden statistische Werte bezüglich der Häufigkeit bestimmter Funktionen und Verzweigungen durch die Entwicklungs-Software erfasst. Mittels dieser Werte können später die Abläufe vom Compiler erfasst werden und so eine angepasste Optimierung an die eigentliche Anwendung vorgenommen werden.

Ein Beispiel hierfür wäre eine Automobil-Anwendung, welche in ihrer normalen Systemumgebung (dem Fahrzeug) und unter realen Bedingungen (Straßenverhältnisse, Brems- und Beschleunigungsvorgänge) vom Entwicklungssystem statistisch erfasst wird. Der Compiler benutzt später diese Statistiken, um die Anwendung hinsichtlich der gewonnen Daten zu optimieren. fr

Autor:

Dipl.-Ing. Fabian Plepp
studierte Elektrotechnik, Informatik, Mathematik und Betriebswirtschaftslehre an der TU Berlin und der Fernuniversität Hagen. Nach seinem Studium arbeitete er zunächst als Entwicklungsingenieur in der Avionik und ist seit 2006 als Applikationsingenieur bei Analog Devices tätig, wo er u.a. für die Optimierung von Algorithmen zuständig ist.

fabian.plepp@analog.com


  1. DSP-Algorithmen effizient implementieren – Teil 2
  2. Adressierung
  3. C-basierte Optimierungstechniken
  4. Compiler-basierte Optimierungstechniken

Jetzt kostenfreie Newsletter bestellen!