Parallel-Programmierung mit bekannten Mitteln

Eines ist klar: Mikroprozessoren mit mehreren Cores werden in Embedded Systemen einen immer größeren Marktanteil gewinnen. Softwareentwickler müssen aber ihren Code entsprechend gestalten, um den vollen Nutzen aus derartigen Systemen ziehen zu können. Allerdings bereitet...

Eines ist klar: Mikroprozessoren mit mehreren Cores werden in Embedded Systemen einen immer größeren Marktanteil gewinnen. Softwareentwickler müssen aber ihren Code entsprechend gestalten, um den vollen Nutzen aus derartigen Systemen ziehen zu können. Allerdings bereitet ihnen Parallelprogrammierung eher Sorgen, denn praktisch der gesamte bestehende Code wurde für nicht parallel verarbeitende Plattformen geschrieben. Dabei existieren verschiedene Parallel-Softwaremodelle, die den Entwicklern doch recht bekannt sind.

Um die Leistungsfähigkeit eines Prozessors auszunutzen, gibt es einige seit langem bewährte Methoden: schnellere Taktraten, tiefere Pipelines und größere Cache-Speicher. Doch diese Ansätze gehen auf Kosten von Chipfläche und Verlustleistung, die die letzten zehn Prozent Leistungssteigerung nicht rechtfertigen. Allerdings gibt es in manchen Anwendungen keine Alternative, als die Taktfrequenz zu erhöhen sowie die Stromversorgungs- und Kühlsysteme aufzurüsten. Lässt sich eine Arbeitslast aber auf mehrere Prozessoren verteilen, muss die maximale Leistungsfähigkeit nicht mehr komplett ausgenutzt werden: Das Design der Datenverarbeitungselemente gestaltet sich einfacher und effizienter. Dieser Ansatz findet sich heute in PCs, Servern und Workstations genauso wie in Embedded-SoC-Designs, von denen viele heute schon auf mehreren Prozessoren basieren, diese aber in einer applikationsspezifischen oder »lose gekoppelten« Art und Weise nutzen. Bis vor kurzem waren SoC-Designoptionen für softwarefreundliches Multiprocessing noch stark beschränkt. Mit der Einführung von SoC-Designbestandteilen wie dem »MIPS32 1004K«, einem kohärenten Processing-System (CPS), wurde das symmetrische Multiprocessing (SMP) auf einem Chip unter einem einzigen Betriebssystem zu einer echten Designoption.

Datenparallele Algorithmen sind eine Möglichkeit, einzelne grundlegende Probleme bezüglich der Datenverarbeitung anzugehen. Dabei wird der Datensatz idealerweise für eine große Anzahl an CPUs zerlegt, um mehr als nur einen Prozessor zu nutzen. Laut Lehrbuch besteht ein großer Datensatz aus einer großen Eingabedatei oder einem Datenfeld (Array). In Embedded Systemen kann dies jedoch eine hohe Anzahl von I/Os und Event-Servicebandbreite bedeuten. In einigen SoC-Architekturen können verschiedene Eingangsdatenquellen, zum Beispiel Netzwerk-Schnittstellenports, von denen jeder gleich zu behandeln ist, statisch mehreren Prozessoren zugewiesen werden. Diese arbeiten den gleichen Treiber/ Router-Code ab und spiegeln einen normalen Datenparallelismus wider.

Datenparallele Algorithmen

Wird die Leistung mehrerer Prozessoren auf ein einzelnes Datenfeld oder einen Eingabe-Stream angewendet, kommen datenparallele Algorithmen zum Einsatz, um die Daten auf zwei CPUs aufzuteilen (Bild 1). Solche Algorithmen sind weniger optimal für einen einzigen Prozessor, gleichen ihre Ineffizienz aber dadurch aus, dass sie ihre rechenbezogene Bandbreite skalierbar nutzen (Ausgleich durch schiere Masse). Diese Algorithmen sind der skalierbarste Ansatz für die parallele Datenverarbeitung. Ausgehend von Faktoren wie den Abhängigkeitscharakteristika des Programms kann dann die Umwandlung eines funktionsfähigen, sequenziell ablaufenden Programms in ein datenparalleles Programm einfach, schwierig oder unmöglich sein.

Ein Systementwickler, der eine bestehende Applikation mit mehr Leistungsfähigkeit ausstatten will, wird vor allem versuchen, datenparallele Algorithmen zu implementieren – vorausgesetzt, relativ wenige reguläre Rechenschleifen mit langen Durchläufen führen den Großteil der Rechenarbeit durch.

Seitdem es Multicore-x86-Prozessoren für PCs, Workstations und Server gibt, haben eine Reihe Firmen mehr in neue Bibliotheken und Toolkits investiert sowie bei einer überschaubaren Zahl an Prozessoren an einfach anwendbaren parallelen Algorithmen geforscht. Viele dieser Tools sind zu Open-Source-Werkzeugen kompatibel und lassen sich auf Embedded-Architekturen wie zum Beispiel MIPS portieren. OpenMP-Erweiterungen auf GCC (GNU Compiler Collection) für datenparalleles C/C++ und Fortran werden Teil des Standardangebots von GNU-Compilern.