Enthält kleinere Ergänzungen, die z.T. in den folgenden
Abschnitten benötigt werden.
-
Startup:
Start von MPI-Anwendungen bei vielen MPI-Implementierungen mit Skript
mpirun
in MPI-2 empfohlen, aber nicht zwingend:
-
mpiexec -n <numprocs> <program>
Syntaxvorschlag bei Anwendungen über mehrere Architekturen/Executables:
-
über Kommandozeilenparameter oder Konfigurations-Datei
-
Parameter an MPI_Comm_spawn angelehnt
-
Initialisierung von MPI
MPI_Init braucht in C Kommandozeilenparameter
argc, argv
in Bibliotheken, die MPI verwenden, u.U. nicht verfügbar
Ausweg in MPI-2:
-
argc = NULL; argv = NULL;
-
Systemabhängige Informationen
MPI_Info: Objekt für alle Sorten von systemabhängigen Informationen
Beispiele:
-
Zugriffsrechte von Dateien beim MPI_File_open
-
Arbeitsverzeichnis von neuen Tasks beim MPI_Comm_spawn
enthält Paare von Strings (key, value)
-
MPI-2 reserviert keys und ihre Bedeutung für einige MPI-Routinen
-
MPI_INFO_NULL für Defaultwerte, geht immer
Funktionen zum Info-Management:
-
int MPI_Info_create(MPI_Info *info)
-
int MPI_Info_set(MPI_Info info, char *key, char *value)
-
int MPI_Info_free(MPI_Info *info)
-
Speicher-Allozierung
auf einigen Architekturen besonderere Speicherbereiche vorhanden
Beispiele:
-
globaler Shared-Memory
-
Shared-Memory innerhalb eines Knotens
für manche Operationen nützlich wegen schnelleren Zugriffs
bei einseitiger Kommunikation u.U erforderlich (z.B. bei HP-UX)
Funktionen dafür an malloc/free angelehnt:
-
Erzeugen von Datentypen
Änderungen und Ergänzungen
-
neue Funktionen (benutzen MPI_Aint) für explizite Adressen
-
einfachere Manipulation von upper/lower bound
-
Datentypen für Teilmatrizen (nützlich für MPI-I/O)
-
Datentypen für verteilte Matrizen (block-zyklische Verteilung)
Beispiel: Erzeugung eines Spaltenblocks aus einer Matrix
-
-
MPI_Datatype columntype;
int sizes[2] = {100, 100};
int subsizes[2] = {100, 25};
int starts[2] = { 0, 0};
int rank;
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
starts[1]=rank*subsizes[1];
MPI_Type_create_subarray(2, sizes, subsizes, starts,
MPI_ORDER_C, MPI_DOUBLE, &columntype);
-
Mehrere Programmiersprachen in einer MPI-Anwendung
Initialisierung/Beenden:
-
gültig überall, unabhängig von Programmiersprache
Wandeln von Handeln:
-
explizite Funktionen in C zur Wandlung von und nach Fortran
-
Datentyp MPI_Fint in C für Fortran-Integer
-
Beispiel Communicator:
-
MPI_Comm MPI_Comm_f2c(MPI_Fint comm)
-
MPI_Fint MPI_Comm_c2f(MPI_Comm comm)
Nachrichten verschicken:
-
Typen bei send und receive müssen übereinstimmen!
(etwa beide MPI_INT oder beide MPI_INTEGER)
-
portables Verfahren:
-
eigenen Datentyp für Nachricht definieren
-
diesen (als Handle) in andere Sprache wandeln
-
nicht portabel:
-
Implementierung darf u.U. Mischung zulassen
-
z.B. falls C-int = FORTRAN-INTEGER:
senden als MPI_INTEGER in Fortran, empfangen als MPI_INT in C