Die Software des Kunden wurde um den Faktor 6-7 beschleunigt: Der optimierte Code nutzt die AVX-Vektoreinheiten des Prozessors aus und verbessert die Datenlokalität. Eine abschließende Schulung erläuterte den Mitarbeitern die verwendeten Ansätze.

Fallstudie: Beschleunigung und Vektorisierung eines Programms zur Echtzeit-Signalverarbeitung

Thunfische Photo: Danilo Cedrone, NOAA Photo Library

Die Portierung algorithmischer, rechenintensiver Software auf eine andersartige Hardware bringt oft Überraschungen hinsichtlich der Performanz auf dem neuen System mit sich — leider meist keine guten. Auf derartige Schwierigkeiten stieß auch die L-3 Communications ELAC Nautik GmbH aus Kiel, ein führendes Unternehmen im Bereich Unterwasserakustik für Marine- und Vermessungstechnik sowie Navigationssystemen. Die interne C++-Software zur Echtzeit-Verarbeitung von akustischen Signalen (Sonare) war für spezielle DSP-Prozessoren optimiert. Für ein neues Projekt portierte der Kunde die Software auf eine handelsübliche Intel Server-Architektur. Allerdings war die erzielte Performanz auf dem Intel-Prozessor nicht zufriedenstellend, verglichen mit dessen theoretischer Peak-Performance. Eine Untersuchung des generierten Assembler-Programmcodes durch ELAC-Mitarbeiter ergab, dass die AVX-Vektoreinheiten dieses Prozessors in zwei kritischen Schleifen nicht ausgenutzt wurden.

Da die internen Ressourcen zur Lösung dieses Problems knapp waren, kam die ELAC Nautik GmbH auf mich zu. Im Rahmen eines unverbindlichen Vorgesprächs haben wir die Problemstellung gemeinsam umrissen und uns über den Umfang und Inhalt meiner Unterstützung bei der Lösung dieser Aufgabe verständigt.

Analyse

Die eigentliche Arbeit fand dann remote statt. Meine Analyse des kritischen Programmcodes ergab mehrere Ursachen für die mangelnde Performanz:

  1. Indirekte Adressierung
  2. Unklares Aliasing
  3. Stellenweise eine unzureichende Datenlokalität

Optimierung

Im Fall der ersten Schleife gelang es, den Algorithmus so transformieren, dass eine Fallunterscheidung aus der innersten Schleife herausgezogen wurde, um somit die indirekte Adressierung zu vermeiden. Damit wurde eine automatische Vektorisierung möglich.

Im zweiten Falle konnte ich zunächst die Datenlokalität durch Umordnung der Schleifen deutlich verbessern und weiter eine automatische Vektorisierung der dann innersten Schleife erreichen.

Ergebnisse

Insgesamt konnte die Anwendung um den Faktor 6-7 beschleunigt werden. Das übertraf die erwartete Performanz-Steigerung deutlich und ermöglichte es dem Kunden sogar, diesen Anwendungsteil auf nur einem einzelnen Kern laufen zu lassen, wodurch die restlichen Kerne für andere Aufgaben frei blieben.

Der Aufwand für dieses Projekt betrug ca. 7 Manntage.

Schulung

Im Anschluss an das Projekt kam bei ELAC der Wunsch auf, die Mitarbeiter zu schulen, um für zukünftige Portierungen und Fragen der effizienten Programmierung von Algorithmen auf modernen Prozessoren besser gerüstet zu sein. Dazu entwickelte ich für die Software-Abteilung eine maßgeschneiderte eintägige Inhouse-Schulung zu dem Themenbereich Performanz, Speicherhierarchien, Vektorisierung und Multi-Core Parallelisierung, an der 12 Mitarbeiter der Firma teilnahmen. Die Schulung behandelte insbesondere das Thema Vektorisierung eingehend; viele Konzept wurden dabei anhand konkreter Beispiele aus der Software des Kunden und dem vorausgegangenen Optimierungs-Projekt erläutert. Im Dialog mit den Seminarteilnehmern klärten sich viele Fragen direkt. Die Konfrontation von allgemeinen Konzepten mit Beispielen aus der täglichen Praxis der Entwickler führte zu interessanten Denkanstößen und Diskussionen; die Schulung wurde sehr positiv aufgenommen.

Die Schulung hat meine Erwartungen hinsichtlich Inhalt und Detailtiefe vollauf erfüllt.
Marco Hahn, Head of Application Software, L3-Communications, ELAC Nautik GmbH, Kiel