Code-Optimierung

Implementierung eines schnellen FIR-Filters mit dem Atom-Prozessor

3. Februar 2010, 13:59 Uhr | Fritz Gerneth
Diesen Artikel anhören

Fortsetzung des Artikels von Teil 2

Vermeiden horizontaler Rechenoperationen

FIR-Filter-Code
Bild 5. Eine optimierte Implementierung für das horizontale Aufsummieren der Akkumulatoren.

Als letzter Schritt verbleibt das Ersetzen der bequemen, aber langsamen phaddd-Befehle durch schnellere Alternativen. Eine Kaskade von drei horizontalen Additionen (wie in Bild 4 rot umrandet) kann durch eine längere und trotzdem schnellere Befehlsfolge (wie in Bild 5 illustriert) ersetzt werden. Die verwendeten Befehle sind in [1] beschrieben. Mit diesem letzten Optimierungsschritt gelingt es, die Berechnungszeit für 640 Werte eines FIR-Filters 63. Ordnung auf ca. 13 680 CPU-Zyklen zu reduzieren. Die noch bestehende Lücke zum theoretischen Limit von 10 240 Zyklen ist zum Großteil algorithmisch bedingt (das zur Optimierung der Speicherzugriffe eingeführte Padding der Filterkoeffizienten erzwingt zusätzliche Berechnungen, die nicht zum Ergebnis beitragen). Hinzu kommt ein gewisser Aufwand für Akkumulation, Skalieren und Abspeichern der Ergebnisse. Die Optimierung eines FIR-Filters für die Atom-Architektur wurde hier an einem 16-bit-Fixpoint-Filter 63. Ordnung beschrieben. Die Leistung des Filters wurde mehr als verfünffacht und bis auf wenige Prozent an das theoretisch mögliche Maximum herangeführt. Gelungen ist das durch Ausrollen der Programmschleifen, konsequenten Einsatz von SSE-Instruktionen, Berücksichtigung der Speicher-Alignment-Anforderung sowie geschickte Auswahl der schnellsten (statt der naheliegendsten) SSEBefehle.

passend zum Thema

Fritz Gerneth Intel
Dipl.-Inf. Fritz Gerneth studierte Informatik an der TU München. Derzeit unterstützt er Kunden bei der Optimierung von Software mit Schwerpunkt auf mobilen und Embedded- Anwendungen. Fritz.Gerneth@intel.com
© Fritz Gerneth

Die hier beschriebene Implementierung ist mit geringen Änderungen auf andere FIR-Filter übertragbar. Die Anzahl der berechneten Werte pro Funktionsaufruf kann von 640 auf beliebige Vielfache von 8 angepasst werden. Die Vorteile der SSE-Instruktionen kommen dabei um so mehr zum Tragen, je höher die Ordung des Filters und die Anzahl der berechneten Werte sind. Floatingpoint-basierende FIR-Filter lassen sich nach demselben Rezept optimieren, wobei der SSE-Befehlssatz hier vierfache Parallelität erlaubt. Eine häufig verwendete Variante von FIRFiltern sind Multi-Raten- Filter. Hier wird mittels Interpolation und Dezimation zusätzlich die Datenrate umgerechnet, so dass z.B. aus 640 Eingangswerten 480 Ergebniswerte berechnet werden. Auch Multi-Raten- Filter lassen sich mit den hier beschriebenen Schritten optimal der Atom-Architektur anpassen.


  1. Implementierung eines schnellen FIR-Filters mit dem Atom-Prozessor
  2. 10 240 statt 70 480 Taktzyklen
  3. Vermeiden horizontaler Rechenoperationen

Lesen Sie mehr zum Thema


Jetzt kostenfreie Newsletter bestellen!

Weitere Artikel zu INTEL GmbH