Suchen

Mehrkern-Anwendungen In vier Schritten Embedded-Software auf Multicore-Systeme portieren

Autor / Redakteur: Adriaan Schmidt und Christian Prehofer * / Hendrik Härter

Wie lässt sich bestehende Software auf Multicore-Plattformen migrieren? Wir stellen Ihnen einen vierstufigen Ansatz aus Analyse, Refactoring, Parallelisierung und Optimierung vor.

Firmen zum Thema

Multicore-Systeme: Sie verarbeiten mehrere Aufgaben gleichzeitig. Auch eingebettete Systeme sollten davon profitieren.
Multicore-Systeme: Sie verarbeiten mehrere Aufgaben gleichzeitig. Auch eingebettete Systeme sollten davon profitieren.
(Bild: Processors / Processors / Ben Stassen / CC BY 2.0 / CC BY 2.0)

Bei der Einführung von Multicore-Systemen ist es aus Zeit- und Kostengründen meist nicht möglich, die gesamte Software neu zu schreiben. Eine Portierung des existierenden Legacy-Codes ist also wichtig, wird allerdings allgemein als sehr schwieriges Problem angesehen.

Die Forscher der Fraunhofer ESK entwickeln daher Methoden und Werkzeuge zur systematischen Migration von Embedded Anwendungen auf Multicore-Plattformen. Dabei entnehmen sie unter anderem Ansätze aus dem High-Performance-Computing, wo schon eine jahrzehntelange Erfahrung in der Entwicklung paralleler Anwendungen besteht. Das Fachwissen wird auf parallele eingebettete Systeme übertragen, um es für Embedded-Entwickler zugänglich zu machen.

Multicore-Plattformen: Ein 4-stufiger Ansatz zur Migration von Embedded Anwendungen
Multicore-Plattformen: Ein 4-stufiger Ansatz zur Migration von Embedded Anwendungen
(Bild: Fraunhofer ESK)

Bei der Portierung bestehender Anwendungen hat sich ein vierstufiger Ansatz aus Analyse, Refactoring, Parallelisierung und Optimierung bewährt. Durch dieses methodische und systematische Vorgehen werden Fehler vermieden und dadurch die Effizienz bei der Software-Entwicklung gesteigert.

1. Genaue Code-Analyse: statisch und dynamisch

Die Portierung der Legacy-Software auf Multicore-Plattformen kann in der Summe mit mehr Aufwand verbunden sein als eine Neuentwicklung. Bei der Migration müssen deshalb vorab die Struktur der Anwendung genau analysiert und die Fragen zu Chancen und Risiken einer Parallelisierung beantwortet werden:

  • An welchen Stellen im Programm kann sinnvoll parallelisiert werden und welcher Gewinn an Performance ist möglich?
  • Mit welchem Aufwand ist die Parallelisierung verbunden?

Zur Identifikation der Chancen ist eine dynamische Analyse des Programms hilfreich. Hier werden mit einem Profiler Daten zum Ausführungsverhalten der Anwendung gesammelt, um festzustellen, wo sich die kritischen Bereiche der Software befinden. Dadurch kann in den weiteren Portierungsschritten gezielt gearbeitet werden. Für die Abschätzung des Aufwands muss man den Quellcode analysieren und betrachten, wie die Software im Detail implementiert ist. Tools für diese statische Code-Analyse können beispielsweise aufdecken, an welcher Stelle von verschiedenen Funktionen auf gemeinsame Daten zugegriffen wird. Solche konkurrierenden Zugriffe benötigen bei der Parallelisierung besondere Beachtung.

2. Refactoring: Die Vorbereitung auf die Parallelisierung

Nach der Identifizierung der Stellen im Code, an denen eine Parallelisierung sinnvoll ist, muss der Quellcode vorbereitet werden. Dabei wird sichergestellt, dass eine parallele Ausführung verschiedener Programmteile oder mehrerer Instanzen desselben Codes gefahrlos möglich ist. Das kann im einfachen Fall erfordern, dass der Zugriff auf gemeinsam genutzte Daten durch eine Synchronisation abgesichert wird.

Es kann aber auch grundlegende Änderungen an der Struktur des Programms mit sich bringen. Vor allem die Parallelisierung von Software, die für eine schnelle Ausführung auf Singlecore-Systeme optimiert ist, ist besonders schwierig. Idealerweise wird beim Refactoring das Verhalten des Programms nicht beeinflusst. In dieser Migrationsphase findet keine Parallelisierung statt. Die Trennung dieses Arbeitsschrittes von der eigentlichen Parallelisierung reduziert die Komplexität der einzelnen Aufgaben. So lassen sich Fehler bei der Migration vermeiden.

3. Parallelisierung: lokal oder global?

Es gibt grundsätzlich zwei Ansätze der Parallelisierung:

  • Lokal: Parallelisierung einzelner Funktionen, ohne den Rest der Anwendung zu beeinflussen.
  • Global: Parallele Ausführung mehrerer, unabhängiger Aufgaben.

Lokales Parallelisierenung ist beispielsweise Optimieren von Schleifen unter Einsatz von Programmierschnittstellen wie OpenMP. Die Optimierung betrifft nur die jeweilige Funktion und ist außerhalb nicht sichtbar. Die lokale Vorgehensweise führt bei eingebetteten Systemen allerdings nicht immer zum Erfolg. Beispielsweise sind in der Steuerungstechnik oder Telekommunikation viele Operationen nicht rechenintensiv genug, um von einer Parallelisierung zu profitieren. In diesem Fall muss auf Ebene des Gesamtsystems nach Möglichkeiten einer parallelen Ausführung gesucht werden.

Eine solche globale Parallelisierung kann jedoch zu grundlegenden Veränderungen der Software-Architektur führen. Für viele der häufig auftretenden Probleme gibt es Lösungen in Form von Entwurfsmustern (Design Patterns), die auch speziell die parallele Ausführung berücksichtigen. Da der Entwurf einer parallelen Software-Architektur sehr komplex ist, sollte man diese bereits bestehenden, erprobten und dokumentierten Entwurfsmuster verwenden. Dadurch lassen sich Fehler, die durch die Synchronisation paralleler Abläufe entstehen, bereits beim Design vermeiden

4. Optimierung: Bessere Performance?

Liegt nach der Parallelisierung ein korrekt arbeitendes Programm vor, wird dieses in einem letzten Schritt optimiert. So wird sichergestellt, dass der Gewinn an Performance durch die Parallelisierung tatsächlich höher ist als der zusätzliche Aufwand, der zur Laufzeit durch die Synchronisation der parallelen Programmteile entsteht.

Ob eine Performance-Steigerung erzielt wurde, lässt sich durch die Messung der Ausführungszeit bestimmen. Sollte das Verhalten nicht den Erwartungen entsprechen, müssen die möglichen Ursachen untersucht werden. Hier helfen Werkzeuge zur dynamischen Analyse wie Profiler, aber auch Tools zur Visualisierung der Abläufe paralleler Programme.

Artikelfiles und Artikellinks

(ID:26838580)