2.8 Von-Neumann-Sprachen
125
2.8.3 Kommunikationsbibliotheken
Gewöhnliche von-Neumann-Sprachen verfügen über keinerlei eingebaute Kommunikationsfunktionen. Diese können aber durch Bibliotheken zur Verfügung gestellt
werden. Es gibt einen Trend dahin, sowohl die Kommunikation innerhalb eines
Systems wie auch Kommunikation über größere Entfernungen zu unterstützen. Zunehmend werden Internetprotokolle angewandt.
MPI
Die Programmierung von Mehrkern-Systemen ist mit dem sogenannten Message
Passing Interface (MPI) möglich. MPI ist eine sehr häufig eingesetzte Bibliothek,
die ursprünglich für Hochleistungsrechner entwickelt wurde. Sie basiert auf Nachrichtenaustausch und ermöglicht synchronen wie auch asynchronen Nachrichtenaustausch.
Synchroner Nachrichtenaustausch ist beispielsweise mit Hilfe der Bibliotheksfunktion MPI_Send möglich [396]:
MPI_Send(buffer, count, type, dest, tag, comm) mit:
• buffer : Adresse der zu sendenden Daten,
• count: Anzahl zu sendender Datenelemente,
• type: zu sendender Datentyp (z.B. MPI_CHAR, MPI_SHORT, MPI_INT ),
• dest : Prozess-ID des Zielprozesses,
• tag : Nachrichten-ID (zur Sortierung ankommender Nachrichten),
• comm : Kommunikationskontext (Menge von Prozessen, für die das Zielfeld gültig
ist) und
• Funktionsergebnis: gibt Erfolg oder Misserfolg an.
Die folgende Funktion ist eine asynchrone Bibliotheksfunktion:
MPI_Isend(buffer, count, type, dest, tag, comm, request) mit
• buffer, count, type, dest, tag, comm: wie oben und
• das System erzeugt zusätzlich eine eindeutige „Anfrage-Nummer”. Der Programmierer kann diese in einer Warteroutine nutzen, um festzustellen, ob die nichtblockierende Operation beendet wurde.
Die Aufteilung von Rechenressourcen zwischen verschiedenen Prozessoren muss
bei MPI explizit erfolgen, das Gleiche gilt für die Kommunikation und das Verteilen
von Daten. Synchronisation ist implizit durch die Kommunikation, zusätzlich ist
explizite Synchronisation möglich. Demzufolge ist ein Großteil des Verwaltungscodes explizit zu implementieren, was einen großen Arbeitsaufwand für den Programmierer bedeutet. Zudem skaliert dieser Ansatz nicht gut, wenn die Anzahl der
Prozessoren sich nennenswert ändert [553].
Um MPI-artige Kommunikation auf Echtzeitsysteme anwenden zu können, wurde
eine Echtzeit-Version von MPI definiert, MPI/RT genannt [501]. MPI/RT deckt
Funktionalität wie Thread-Erzeugung und -Beendigung nicht ab. MPI/RT wird als
125
2.8.3 Kommunikationsbibliotheken
Gewöhnliche von-Neumann-Sprachen verfügen über keinerlei eingebaute Kommunikationsfunktionen. Diese können aber durch Bibliotheken zur Verfügung gestellt
werden. Es gibt einen Trend dahin, sowohl die Kommunikation innerhalb eines
Systems wie auch Kommunikation über größere Entfernungen zu unterstützen. Zunehmend werden Internetprotokolle angewandt.
MPI
Die Programmierung von Mehrkern-Systemen ist mit dem sogenannten Message
Passing Interface (MPI) möglich. MPI ist eine sehr häufig eingesetzte Bibliothek,
die ursprünglich für Hochleistungsrechner entwickelt wurde. Sie basiert auf Nachrichtenaustausch und ermöglicht synchronen wie auch asynchronen Nachrichtenaustausch.
Synchroner Nachrichtenaustausch ist beispielsweise mit Hilfe der Bibliotheksfunktion MPI_Send möglich [396]:
MPI_Send(buffer, count, type, dest, tag, comm) mit:
• buffer : Adresse der zu sendenden Daten,
• count: Anzahl zu sendender Datenelemente,
• type: zu sendender Datentyp (z.B. MPI_CHAR, MPI_SHORT, MPI_INT ),
• dest : Prozess-ID des Zielprozesses,
• tag : Nachrichten-ID (zur Sortierung ankommender Nachrichten),
• comm : Kommunikationskontext (Menge von Prozessen, für die das Zielfeld gültig
ist) und
• Funktionsergebnis: gibt Erfolg oder Misserfolg an.
Die folgende Funktion ist eine asynchrone Bibliotheksfunktion:
MPI_Isend(buffer, count, type, dest, tag, comm, request) mit
• buffer, count, type, dest, tag, comm: wie oben und
• das System erzeugt zusätzlich eine eindeutige „Anfrage-Nummer”. Der Programmierer kann diese in einer Warteroutine nutzen, um festzustellen, ob die nichtblockierende Operation beendet wurde.
Die Aufteilung von Rechenressourcen zwischen verschiedenen Prozessoren muss
bei MPI explizit erfolgen, das Gleiche gilt für die Kommunikation und das Verteilen
von Daten. Synchronisation ist implizit durch die Kommunikation, zusätzlich ist
explizite Synchronisation möglich. Demzufolge ist ein Großteil des Verwaltungscodes explizit zu implementieren, was einen großen Arbeitsaufwand für den Programmierer bedeutet. Zudem skaliert dieser Ansatz nicht gut, wenn die Anzahl der
Prozessoren sich nennenswert ändert [553].
Um MPI-artige Kommunikation auf Echtzeitsysteme anwenden zu können, wurde
eine Echtzeit-Version von MPI definiert, MPI/RT genannt [501]. MPI/RT deckt
Funktionalität wie Thread-Erzeugung und -Beendigung nicht ab. MPI/RT wird als
