next up previous contents
Next: SPP-UX Up: Neuigkeiten auf dem SPP-System Previous: Veclib

MPI

HP/Convex liefert jetzt für die SPP-Systeme eine MPI-Implementierung mit. Sie basiert auf der Public-Domain-Version MPICH 1.0.12, ist aber speziell für die SPP angepaßt worden. Wie alle derzeitigen MPI-Implementierungen ist auch diese nicht thread-safe, d.h. man kann nicht MPI-Calls mit der Shared-Memory-Programmierung via Compiler-Option oder Thread-Bibliothek mischen.

Die Anpassung macht sich in den Performance-Kennzahlen, insbesondere der Latency [1] deutlich bemerkbar. Wenn man keine nicht-blockierende Kommunikation verwendet (MPI_Isend etc.), kann man die Performance bei kleinen Nachrichten noch einmal drastisch verbessern, indem man eine Umgebungsvariable MPI_FLAGS auf b setzt. Dadurch wird in den MPI-Calls einiges an entsprechendem Overhead weggelassen. Das Ergebnis kann sich sehen lassen:

Latency [usec] Bandwidth [MB/s]
1 Node 2 Nodes 1 Node 2 Nodes
SPP-MPI 23 43 35.0 9.0
SPP-MPI (MPI_FLAG=b) 5 28 16.7 7.1
SPP-PVM (psend) 63 99 13.7 8.4

Zum Übersetzen muß man nur die MPI-Bibliothek mit -lmpi dazulinken, den Pfad zur Bibliothek und zur Includedatei mpi.h findet der cc selber. Dem Fortran-Compiler dagegen muß noch mit -I/usr/convex/mpich/include der Weg zu mpif.h gewiesen werden. Für Profiling-Zwecke sind entsprechend aufbereitete Bibliotheks-Versionen vorhanden [2]: Linkt man mit

-ltmpi -lpmpi -lmpi,
so liefert jeder MPI-Call zur Laufzeit eine Tracing-Zeile auf der Standard-Ausgabe; mit
-llmpi -lpmpi -lmpi
wird eine Profiling-Datei mit Zeitstempel erzeugt, die graphisch z.B. mit den Tools upshot oder nupshot dargestellt werden kann - allerdings z.Zt. nicht auf der hydra, weil beide Programme auf veralteten Tk/Tcl-Versionen beruhen.

Das fertig übersetzte Programm ruft man einfach auf mit

a.out -np ANZ [OPTIONEN]
wobei ANZ die Zahl der Tasks ist. Da Tasks hier nicht über Threads realisiert werden, sondern eigene Prozesse sind, lassen sich problemlos auch mehr Tasks als CPUs starten. Die Kommunikation erfolgt über den globalen Speicher, sie ist auf einen Subcomplex beschränkt. Insbesondere besteht keine Möglichkeit, Tasks auch auf anderen Maschinen zu starten.

Eine nützliche Erweiterung gegenüber der PD-Version ist die Debug-Option: Übersetzt und linkt man sein Programm wie gewohnt mit -cxdb und setzt zusätzlich die Variable MPI_FLAGS auf ecxdb, so wird beim normalen Programmstart für jede Task ein CXdb gestartet. Man kann nun Breakpoints setzen wie gewohnt, muß dann aber vor dem Weitermachen mit continue noch in jedem Fenster folgenden Befehl absetzen:

print MPI_DEBUG_CONT=1
bzw. in Fortran
    
     fill MPI_DEBUG_CONT \; 1
Leider ist das Debuggen noch etwas instabil, gelegentlich trat bei mir in völlig harmlosen Programmen Segmentation violation auf.

Weitere Informationen zur MPI-Implementierung auf der hydra sind im Online- Manual pinpoint zu finden. Außerdem weise ich noch einmal auf den demnächst stattfinden MPI-Kurs hin (s.o.).

[1] Zeit, um 0 Byte zu schicken, auf der hydra auch noch für 32 Byte gültig
[2] die leider nur mit C-Programmen funktionieren!


next up previous contents
Next: SPP-UX Up: Neuigkeiten auf dem SPP-System Previous: Veclib

Marco Budde
Mon Jul 8 18:15:29 MESZ 1996