Ver- und Entpacken von Daten

Werbung
Ver- und Entpacken von Daten
Zwecks effizienterer Kommunikation kann eine Anzahl von Einzeldaten oder kürzeren Datenbereichen, anstatt sie als separate Pakete zu übertragen, zu dynamischen Strukturen (s. später)
zusammengefaßt werden. Alternativ kann man die Daten aber auch explizit in einen längeren,
zusammenhängenden Buffer “verpacken” und in dieser Form auf einmal verschicken.
Das Verpacken geschieht durch eine Folge von Aufrufen der Funktion
int MPI_Pack(void *data, int count, MPI_Datatype dtype,
void *buffer, int bsize, int *pos, MPI_Comm comm)
Dabei werden count Elemente vom Typ dtype aus dem Bereich data in den Bereich buffer
kopiert, beginnend pos Bytes hinter der Startadresse von buffer (die Größe bsize von buffer
wird ebenfalls in Bytes angegeben). Man setzt zu Beginn pos=0 und erhält nach jedem Aufruf
von MPI_Pack in pos automatisch den um die Anzahl der kopierten Bytes erhöhten Wert zurück.
Das Entpacken von Daten erfolgt mit der analogen Funktion
int MPI_Unpack(void *buffer, int bsize, int *pos,
void *data, int count, MPI_Datatype dtype, MPI_Comm comm)
Auch hier wird vor dem Auslesen des ersten Datenbereichs wieder pos=0 gesetzt.
Eine obere Schranke für die Größe des Buffers liefert die Funktion
int MPI_Pack_size(int count, MPI_Datatype dtype, MPI_Comm comm, int *bsize)
Hier sind count und dtype Anzahl und Datentyp der zu verpackenden Datenbereiche, und bsize
ist die maximale Größe (in Bytes) des dafür bereitzustellenden Buffers. Damit wird zwar i.a.
die tatsächlich notwendige Buffergröße etwas überschätzt, doch ist diese portablere Methode
einer “händischen” Berechnung (in C etwa mit Hilfe des sizeof-Operators) vorzuziehen, da
beim Verpacken eventuell auch Platz für implementationsabhängige Metadaten berücksichtigt
werden muß.
4
Herunterladen