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