Revision history for Mpi
Additions:
~-[[MpiCompileAndDebug Kompilieren und Debuggen]]
Deletions:
Additions:
~-[[Kompilieren und Debuggen MpiCompileAndDebug]]
Additions:
==a==Erforderlich==a==
~-[[MpiMpdRing MPD]] einrichten
~-[[http://phase.hpcc.jp/mirrors/mpi/mpich2/downloads/mpich2-doc-user.pdf MPICH2-Benutzerdokumentation]]
==a==Zusätzliches Material==a==
**mpiexec** runs an MPI program (damit startet man die Programme)
~-[[MpiMpdRing MPD]] einrichten
~-[[http://phase.hpcc.jp/mirrors/mpi/mpich2/downloads/mpich2-doc-user.pdf MPICH2-Benutzerdokumentation]]
==a==Zusätzliches Material==a==
**mpiexec** runs an MPI program (damit startet man die Programme)
Deletions:
**mpiexec** runs an MPI program
==a==MPD-Ring auf mehreren Rechnern einrichten==a==
Voraussetzung: MPICH2 ist [[MpiInstallation installiert]].
~-Die Datei /etc/hosts auf allen Rechner anpassen oder mit [[DnsServer DNS-Server]] arbeiten. Aufpassen mit //localhost//! Siehe dazu unten Fehlerbehandlung.
~-Einen extra Benutzer auf allen Maschinen für die Arbeit mit MPI einrichten. Bei der Arbeit mit MPI muss man davon ausgehen, dass sich ei Eindringling ohne weitere Vorkehrungen von jedem beliebigen System auf alle anderen Systeme Zugang verschaffen kann.
~-Am besten mittels [[NfsServer NFS]] einen User-Account auf allen Rechnern einrichten, so sind alle benutzerspezifischen Einstellungen und die Parallelprogramme auf allen Rechner gleich vorhanden.
~-Etwas bequemer geht es beim Start des mpd, wenn die Passworteingaben wegfallen. Das kann mittels [[LinuxSshPublicKeyAuth Public-Key-Authentifizierung]] erreicht werden.
~-[[MpiMpdRing MPD-Ring]] mit bootmpd starten.
mehr dazu unter [[MpiMpdRing MPD-Ring]]
Auf diese Weise kann man MPI-Programme mit mpiexec auf einem beliebigen Rechner ausführen.
Additions:
Voraussetzung: [[MpiMpdRing MPD-Ring]] ist eingerichtet.
Deletions:
Additions:
~- [[MpiExerciseMandel Mandelbrot]] von [[http://de.wikipedia.org/wiki/Argonne_National_Laboratory Argonne National Laboratory]]
Additions:
~-[[http://ci-tutor.ncsa.uiuc.edu/login.php Übungen]] - Introduction to MPI und OpenMP
~-[[http://www.mcs.anl.gov/research/projects/mpich2/ MPICH2-Homepage]]
==a==MPD-Ring auf mehreren Rechnern einrichten==a==
Voraussetzung: MPICH2 ist [[MpiInstallation installiert]].
Voraussetzung: [[MpiMpdRing MPD-Ring] ist eingerichtet.
~-[[http://www.mcs.anl.gov/research/projects/mpich2/ MPICH2-Homepage]]
==a==MPD-Ring auf mehreren Rechnern einrichten==a==
Voraussetzung: MPICH2 ist [[MpiInstallation installiert]].
Voraussetzung: [[MpiMpdRing MPD-Ring] ist eingerichtet.
Deletions:
~-[[http://www.mcs.anl.gov/research/projects/mpich2/ Übungen]]
~~-Introduction to MPI
~~-Intermediate MPI
=a=MPD-Ring auf mehreren Rechnern einrichten=a=
Additions:
~- [[MpiBeispiel01 Hello MPI!]] gut zum Testen
Deletions:
Additions:
~-[[MpiFehlerbehandlung Fehlerbehandlung]]
=a=MPD-Ring auf mehreren Rechnern einrichten=a=
mehr dazu unter [[MpiMpdRing MPD-Ring]]
==a==MPI-Programme==a==
=a=MPD-Ring auf mehreren Rechnern einrichten=a=
mehr dazu unter [[MpiMpdRing MPD-Ring]]
==a==MPI-Programme==a==
Deletions:
==a==Beispiele==a==
==a==Fehlerbehandlung==a==
=a=Fehlermeldung von mpd oder mpdboot=a=
mpd HOST1 (handle_mpd_output 392): failed to handshake with mpd on HOST2; recvd output={}
/etc/hosts
%%
127.0.0.1 localhost.localdomain localhost
10.3.6.1 HOST1
10.3.6.2 HOST2
%%
=a=mpd bereinigen=a=
Bei Experimentieren kann das löschen aller Überreste von mpd interessant sein.
Auf jeder Maschine ausführen
%%mpdallexit; mpdcleanup%%
=a=mpd beschäftigt=a=
mpiexec_amygdala (mpiexec 392): no msg recvd from mpd when expecting ack of request
1 Minute abwarten und nochmal versuchen
Additions:
~- [[MpiExerciseMpmdQt MPMD mit Qt]] ist ein Beispiel, wie MPI im Prinzip zusamen mir Qt als grafische Oberfläche genutzt werden kann.
Additions:
~- [[MpiBeispielBalancing Load Balancing]] bei ungleich leistungsstarken Rechnern nach dem [[MasterWorkerSchema Master-Worker-Schema]]
Deletions:
Additions:
~-Die Datei /etc/hosts auf allen Rechner anpassen oder mit [[DnsServer DNS-Server]] arbeiten. Aufpassen mit //localhost//! Siehe dazu unten Fehlerbehandlung.
Auf diese Weise kann man MPI-Programme mit mpiexec auf einem beliebigen Rechner ausführen.
~- [[MpiBeispielBalancing Load Balancing]] bei ungleich leistungsstarken Rechnern nach dem Master-Worker-Shema
Auf diese Weise kann man MPI-Programme mit mpiexec auf einem beliebigen Rechner ausführen.
~- [[MpiBeispielBalancing Load Balancing]] bei ungleich leistungsstarken Rechnern nach dem Master-Worker-Shema
Deletions:
~- [[MpiBeispielBalancing Load Balancing]] bei ungleich leistungsstarken Rechnern
Additions:
MPI ist nicht zu verwechseln mit OpenMP.
Ich entscheide mich für MPICH2.
~-[[http://www.mpi-forum.org/docs/ Spezifikation]] (MPI-Standard 2.1)
Ich entscheide mich für MPICH2.
~-[[http://www.mpi-forum.org/docs/ Spezifikation]] (MPI-Standard 2.1)
Deletions:
~-http://de.wikipedia.org/wiki/Message_Passing_Interface
~-[[http://www.mpi-forum.org/docs/ Spezifikation]]
Additions:
~-Die Datei /etc/hosts auf allen Rechner anpassen oder mit [[DnsServer DNS-Server]] arbeiten. Aufpassen mit //localhost//! Siehe dazu unten Fehlerbehandlung.
Deletions:
=a=Einen einzelnen mpd zum testen starten=a=
%%mpd -d%%
=a=mpd auf einem Rechner mit 4 Cpus einrichten=a=
%%(bash)mpd --daemon --ncpus=4%%
~-Die Datei /etc/hosts auf allen Rechner anpassen oder mit [[DnsServer DNS-Server]] arbeiten. Aufpassen mit localhost! Siehe dazu unten Fehlerbehandlung.
=a=Weitere Parameter für mpd=a=
echo gibt Informationen aus, wie z.B. die Portnummer
%%mpd --echo%%
--listenport=4991
Additions:
~-[[BoostLibMpi Vereinfachte Funktionen in der Boost-Bibliothek für die MPI-Unterstützung]]
Additions:
~-[[http://linux.die.net/man/1/mpiexec mpiexec]] man page
Additions:
~- [[MpiBeispielBalancing Load Balancing]] bei ungleich leistungsstarken Rechnern
Additions:
~-[[MpiReferenzBlatt Referenz zum Programmieren]] mit MPI
==a==MPD einrichten==a==
~-Die Datei /etc/hosts auf allen Rechner anpassen oder mit [[DnsServer DNS-Server]] arbeiten. Aufpassen mit localhost! Siehe dazu unten Fehlerbehandlung.
~-Einen extra Benutzer auf allen Maschinen für die Arbeit mit MPI einrichten. Bei der Arbeit mit MPI muss man davon ausgehen, dass sich ei Eindringling ohne weitere Vorkehrungen von jedem beliebigen System auf alle anderen Systeme Zugang verschaffen kann.
~-Am besten mittels [[NfsServer NFS]] einen User-Account auf allen Rechnern einrichten, so sind alle benutzerspezifischen Einstellungen und die Parallelprogramme auf allen Rechner gleich vorhanden.
~-Etwas bequemer geht es beim Start des mpd, wenn die Passworteingaben wegfallen. Das kann mittels [[LinuxSshPublicKeyAuth Public-Key-Authentifizierung]] erreicht werden.
~-[[MpiMpdRing MPD-Ring]] mit bootmpd starten.
==a==MPD einrichten==a==
~-Die Datei /etc/hosts auf allen Rechner anpassen oder mit [[DnsServer DNS-Server]] arbeiten. Aufpassen mit localhost! Siehe dazu unten Fehlerbehandlung.
~-Einen extra Benutzer auf allen Maschinen für die Arbeit mit MPI einrichten. Bei der Arbeit mit MPI muss man davon ausgehen, dass sich ei Eindringling ohne weitere Vorkehrungen von jedem beliebigen System auf alle anderen Systeme Zugang verschaffen kann.
~-Am besten mittels [[NfsServer NFS]] einen User-Account auf allen Rechnern einrichten, so sind alle benutzerspezifischen Einstellungen und die Parallelprogramme auf allen Rechner gleich vorhanden.
~-Etwas bequemer geht es beim Start des mpd, wenn die Passworteingaben wegfallen. Das kann mittels [[LinuxSshPublicKeyAuth Public-Key-Authentifizierung]] erreicht werden.
~-[[MpiMpdRing MPD-Ring]] mit bootmpd starten.
Deletions:
MpiMpdRing
==a==Funktionen in C==a==
MPICH
%%(c)
int MPI_Send (void* buf, int count, MPI_Datatype datatype, int dest, int tag, MPI_Comm comm)
int MPI_Recv (void* buf, int count, MPI_Datatype datatype, int source, int tag, MPI_Comm comm, MPI_Status* status)
int MPI_Isend (void* buf, int count, MPI_Datatype datatype, int dest, int tag, MPI_Comm comm, MPI_Request* request)
int MPI_Irecv (void* buf, int count, MPI_Datatype datatype, int source, int tag, MPI_Comm comm, MPI_Request* request)
int MPI_Test (MPI_Request* request, int* flag, MPI_Status* status)
int MPI_Wait (MPI_Request* request, MPI_Status* status)
int MPI_Comm_group (MPI_Comm comm, MPI_Group* group)
int MPI_Group_union (MPI_Group group1, MPI_Group group2, MPI_Group* new_group)
int MPI_Group_intersection (MPI_Group group1, MPI_Group group2, MPI_Group* new_group)
int MPI_Group_difference (MPI_Group group1, MPI_Group group2, MPI_Group* new_group)
int MPI_Bcast (void *buffer, int count, MPI_Datatype type, int root, MPI_Comm comm)
int MPI_Gather (void *sendbuf, int sendcount, MPI_Datatype sendtype, void *recvbuf, int recvcount, MPI_Datatype recvtype, int root, MPI_Comm comm)
int MPI_Gatherv (void *sendbuf, int sendcount, MPI_Datatype sendtype, void *recvbuf, int *recvcounts, int *displs, MPI_Datatype recvtype, int root, MPI_Comm comm)
int MPI_Scatter (void *sendbuf, int sendcount, MPI_Datatype sendtype, void *recvbuf, int recvcount, MPI_Datatype recvtype, int root, MPI_Comm comm)
int MPI_Scatterv (void *sendbuf, int *sendcounts, int *displs, MPI_Datatype sendtype, void *recvbuf, int recvcount, MPI_Datatype recvtype, int root, MPI_Comm comm)
int MPI_Reduce (void *sendbuf, void *recvbuf, int count, MPI_Datatype type, MPI_Op op, int root, MPI_Comm comm)
Additions:
~-[[http://www.inf.fu-berlin.de/lehre/WS01/VS/Talks/lamMpi.pdf MPI mit LAM]] einrichten
Additions:
~-[[http://ci-tutor.ncsa.uiuc.edu/login.php Übungen]] für MPI und OpenMP
~-http://de.wikipedia.org/wiki/Message_Passing_Interface
~-[[http://www.mcs.anl.gov/research/projects/mpich2/ Übungen]]
~~-Introduction to MPI
~~-Intermediate MPI
~-http://de.wikipedia.org/wiki/Message_Passing_Interface
~-[[http://www.mcs.anl.gov/research/projects/mpich2/ Übungen]]
~~-Introduction to MPI
~~-Intermediate MPI
Additions:
==a==Eigenschaften==a==
~-Architektur und Hardware unabhängig
~-geeignet für Rechner mit mehreren CPUs und für Cluster mit mehreren Rechnern (auch für Cluster mit Multicorerechnern)
~-sichere Datenübertragung
~-Entwicklung von parallelen Algorithmen, Anwendungen und Bibliotheken
~~-[[http://www.lrz-muenchen.de/services/compute/linux-cluster/cpjava/mpijava.html mpiJava: MPI für Java]]
~-Architektur und Hardware unabhängig
~-geeignet für Rechner mit mehreren CPUs und für Cluster mit mehreren Rechnern (auch für Cluster mit Multicorerechnern)
~-sichere Datenübertragung
~-Entwicklung von parallelen Algorithmen, Anwendungen und Bibliotheken
~~-[[http://www.lrz-muenchen.de/services/compute/linux-cluster/cpjava/mpijava.html mpiJava: MPI für Java]]
Additions:
~-[[http://www.lam-mpi.org/about/overview/ LAM/MPI]]
~-[[http://www.mpi-forum.org/docs/ Spezifikation]]
~-[[http://debianclusters.cs.uni.edu/index.php/MPICH:_Pick_Your_Paradigm Debian Clusters for Education and Research]]
~-http://wiki.freepascal.org/MPICH
~-[[MpiInstallation Installation]]
~-[[http://www.mpi-forum.org/docs/ Spezifikation]]
~-[[http://debianclusters.cs.uni.edu/index.php/MPICH:_Pick_Your_Paradigm Debian Clusters for Education and Research]]
~-http://wiki.freepascal.org/MPICH
~-[[MpiInstallation Installation]]
Deletions:
http://packages.debian.org/sid/mpich-bin
http://wiki.freepascal.org/MPICH
==a==Installation==a==
=a=unter Linux (Debian)=a=
für OpenMPI mit aptitude
aptitude install openmpi-dev openmpi-dbg
für MPICH2 mit aptitude
aptitude install mpich-bin libmpich1.0-dev openmpi-dev openmpi-dbg mpich-mpd-bin mpich-mpd-bin libmpich-mpd1.0-dev
oder herunterladen und kompiieren von MPICH2
%%(bash)
wget http://www.mcs.anl.gov/research/projects/mpich2/downloads/tarballs/1.0.8/mpich2-1.0.8.tar.gz
tar xzf mpich2-1.0.8.tar.gz
./configure --prefix=/opt/mpi
make
make install
""~""/bash_profile erweitern um
PATH=/opt/mpi/bin:"${PATH}"
LD_LIBRARY_PATH=/opt/mpi/lib
=a= unter Windows=a=
unter Windows
MPI 1.0.8
.NET 2.0. SP1
gcc MINGW 32
~- .Net framework 2.0 installieren, falls nicht vorhanden (der MPICh installer startet nicht, wenn .net 2.0 fehlt): dotnetfx.exe herunterladen und ausführen
~- .Net 2.0 Service pack 1 installieren: NetFx20_SP1_x86 herunterladen und ausführen
~- MPICH2 installieren: MPICH2 für Windows 32bit herunterladen, ausführen
~- Gcc aus MingW installieren, falls kein anderer C-Compiler vorhanden. Die Installation der neuen Version 1.08 habe ich nur mit Gcc getestet. VisualC++ oder Borland sollten auch funktionieren
~- SMPD als Dienst installieren (smpd -h listet die Optionen): smpd -install und smpd -register_spn
~- Suchpfad ergänzen (<MINGW_ROOT>/bin und <MPICH2_ROOT>/bin hinzufügen)
~- Das fertige Beispiel testen: cd <MPICH2_ROOT>/examples und mpirun -n 4 cpi
==a==Vorbereitung==a==
""~""/.mpich2
%%(bash)
export PATH=/local/mpich2/bin:$PATH
export LD_LIBRARY_PATH=/local/mpich2/lib:$LD_LIBRARY_PATH
%%(bash)
source ~/.mpich2
Kompiliren
%%(bash)
mpicc cpi.c
""~/.mpd.conf"" erstellen
%%(bash)
echo "MPD_SECRETWORD=..." > ~/.mpd.conf
Rechte setzen
%%(bash)
chmod 600 ~/.mpd.conf
HPC-Server starten
%%(bash)
mpd &
Test
%%(bash)
mpiexec -n 4 ~/mpi_ex/simple/spi
Additions:
~- [[MpiBeispielRing Nachricht in einem Ring weiterleiten]] (ring.c)
~- [[MpiBeispielCpi Berechnung von PI]] (cpi.c)
~- [[MpiBeispielCpi Berechnung von PI]] (cpi.c)
Deletions:
Additions:
=a=mpd beschäftigt=a=
mpiexec_amygdala (mpiexec 392): no msg recvd from mpd when expecting ack of request
1 Minute abwarten und nochmal versuchen
mpiexec_amygdala (mpiexec 392): no msg recvd from mpd when expecting ack of request
1 Minute abwarten und nochmal versuchen
Additions:
**mpdringtest** measures the time a single message going around the ring of mpds <num> times (default once): mpdringtest 100
Additions:
==a==MPD einstellen==a==
=a=Einen einzelnen mpd zum testen starten=a=
%%mpd -d%%
=a=mpd auf einem Rechner mit 4 Cpus einrichten=a=
%%(bash)mpd --daemon --ncpus=4%%
=a=mpd-Ring auf mehreren Rechnern einrichten=a=
=a=Weitere Parameter für mpd=a=
--listenport=4991
=a=Einen einzelnen mpd zum testen starten=a=
%%mpd -d%%
=a=mpd auf einem Rechner mit 4 Cpus einrichten=a=
%%(bash)mpd --daemon --ncpus=4%%
=a=mpd-Ring auf mehreren Rechnern einrichten=a=
=a=Weitere Parameter für mpd=a=
--listenport=4991
Deletions:
=a=Parameter für mpd=a=
=a=mpd-Ring auf mehreren Rechnern=a=
Additions:
""~""/bash_profile erweitern um
Deletions:
Additions:
für OpenMPI mit aptitude
für MPICH2 mit aptitude
oder herunterladen und kompiieren von MPICH2
wget http://www.mcs.anl.gov/research/projects/mpich2/downloads/tarballs/1.0.8/mpich2-1.0.8.tar.gz
tar xzf mpich2-1.0.8.tar.gz
~/bash_profile erweitern um
PATH=/opt/mpi/bin:"${PATH}"
LD_LIBRARY_PATH=/opt/mpi/lib
für MPICH2 mit aptitude
oder herunterladen und kompiieren von MPICH2
wget http://www.mcs.anl.gov/research/projects/mpich2/downloads/tarballs/1.0.8/mpich2-1.0.8.tar.gz
tar xzf mpich2-1.0.8.tar.gz
~/bash_profile erweitern um
PATH=/opt/mpi/bin:"${PATH}"
LD_LIBRARY_PATH=/opt/mpi/lib
Deletions:
für MPICH2
oder herunterladen und kompiieren
Additions:
nicht zu verwechseln mit OpenMP
**mpdcleanup** removes the Unix socket on local (the default) and remote machines in case the mpd crashed badly and did not remove it
**mpdtrace** Llsts hostname of each of the mpds in the ring
MpiMpdRing
=a=Fehlermeldung von mpd oder mpdboot=a=
=a=mpd bereinigen=a=
Bei Experimentieren kann das löschen aller Überreste von mpd interessant sein.
Auf jeder Maschine ausführen
%%mpdallexit; mpdcleanup%%
**mpdcleanup** removes the Unix socket on local (the default) and remote machines in case the mpd crashed badly and did not remove it
**mpdtrace** Llsts hostname of each of the mpds in the ring
MpiMpdRing
=a=Fehlermeldung von mpd oder mpdboot=a=
=a=mpd bereinigen=a=
Bei Experimentieren kann das löschen aller Überreste von mpd interessant sein.
Auf jeder Maschine ausführen
%%mpdallexit; mpdcleanup%%
Deletions:
mpdallexit; mpdcleanup; mpdboot -d -n 2 -f ../mpd_hosts
mpd_hosts mit zwei Rechnern
Unbedingt die /etc/hosts anpassen (siehe Fehlerbehandlung unten)
HOST1:1
HOST2:1
Starten von drei Prozessen auf HOST1 und einem Prozess auf HOST2
Insgesamt werden vier Prozesse ([[MpiBeispielRing Quellcode]]) gestartet.
mpiexec -n 3 -host HOST1 ~/code/mpi/04_ring/ring : -n 1 -host HOST2 ~/mpi/ring
Ausgabe
R1 is waiting for R0...
R2 is waiting for R1...
R3 is waiting for R2...
R0 sent data to R1.
R0 is waiting for R3...
R1 received from R0: Wir spielen mit MPI!
R1 sent data to R2.
R1 is waiting for R0...
R2 received from R1: Wir spielen mit MPI!
R2 sent data to R3.
...
R0 bis R2 wurden auf HOST1 ausgeführt und R3 auf HOST2
Die Nachricht 2Wir spielen mit MPI!" wurde von R0 initial an R1 gesendet,
dann von R1 an R2,
dann von R2 an R3,
dann von R3 an R0
usw.
Additions:
CategoryStudiumSE
Deletions:
Additions:
StudiumMasterSE
Additions:
Insgesamt werden vier Prozesse ([[MpiBeispielRing Quellcode]]) gestartet.
Eigene Beispiele
~- [[MpiBeispiel01 Beispiel 1]]
~- [[MpiBeispielRing ring.c]]
Beispiele aus MPICH2
Eigene Beispiele
~- [[MpiBeispiel01 Beispiel 1]]
~- [[MpiBeispielRing ring.c]]
Beispiele aus MPICH2
Deletions:
~- MpiBeispielRing
Additions:
R0 bis R2 wurden auf HOST1 ausgeführt und R3 auf HOST2
Die Nachricht 2Wir spielen mit MPI!" wurde von R0 initial an R1 gesendet,
dann von R1 an R2,
dann von R2 an R3,
dann von R3 an R0
usw.
Die Nachricht 2Wir spielen mit MPI!" wurde von R0 initial an R1 gesendet,
dann von R1 an R2,
dann von R2 an R3,
dann von R3 an R0
usw.
Additions:
""~""/.mpich2
Deletions:
Additions:
10.3.6.1 HOST1
10.3.6.2 HOST2
10.3.6.2 HOST2
Deletions:
... HOST2
Additions:
Starten von drei Prozessen auf HOST1 und einem Prozess auf HOST2
Deletions:
Additions:
=a=Parameter für mpd=a=
echo gibt Informationen aus, wie z.B. die Portnummer
%%mpd --echo%%
=a=mpd-Ring auf mehreren Rechnern=a=
mpd_hosts mit zwei Rechnern
Unbedingt die /etc/hosts anpassen (siehe Fehlerbehandlung unten)
Starten von drei Prozessen auf HOST (Pentium III) 1 und einem Prozess auf HOST2 (486 nur zum Testen)
echo gibt Informationen aus, wie z.B. die Portnummer
%%mpd --echo%%
=a=mpd-Ring auf mehreren Rechnern=a=
mpd_hosts mit zwei Rechnern
Unbedingt die /etc/hosts anpassen (siehe Fehlerbehandlung unten)
Starten von drei Prozessen auf HOST (Pentium III) 1 und einem Prozess auf HOST2 (486 nur zum Testen)
Deletions:
Gibt Informationen aus, wie z.B. die Portnummer
mpd --echo
mpd_hosts
Starten von drei Prozessen auf HOST1 und einem Prozess auf HOST2
Additions:
**mpdclean**
==a==MPD setup==a==
=a=Parameter=a=
mpdallexit; mpdcleanup; mpdboot -d -n 2 -f ../mpd_hosts
mpd_hosts
HOST1:1
HOST2:1
Starten von drei Prozessen auf HOST1 und einem Prozess auf HOST2
mpiexec -n 3 -host HOST1 ~/code/mpi/04_ring/ring : -n 1 -host HOST2 ~/mpi/ring
Ausgabe
R1 is waiting for R0...
R2 is waiting for R1...
R3 is waiting for R2...
R0 sent data to R1.
R0 is waiting for R3...
R1 received from R0: Wir spielen mit MPI!
R1 sent data to R2.
R1 is waiting for R0...
R2 received from R1: Wir spielen mit MPI!
R2 sent data to R3.
...
==a==MPD setup==a==
=a=Parameter=a=
mpdallexit; mpdcleanup; mpdboot -d -n 2 -f ../mpd_hosts
mpd_hosts
HOST1:1
HOST2:1
Starten von drei Prozessen auf HOST1 und einem Prozess auf HOST2
mpiexec -n 3 -host HOST1 ~/code/mpi/04_ring/ring : -n 1 -host HOST2 ~/mpi/ring
Ausgabe
R1 is waiting for R0...
R2 is waiting for R1...
R3 is waiting for R2...
R0 sent data to R1.
R0 is waiting for R3...
R1 received from R0: Wir spielen mit MPI!
R1 sent data to R2.
R1 is waiting for R0...
R2 received from R1: Wir spielen mit MPI!
R2 sent data to R3.
...
Deletions:
Additions:
mpd HOST1 (handle_mpd_output 392): failed to handshake with mpd on HOST2; recvd output={}
127.0.0.1 localhost.localdomain localhost
... HOST1
... HOST2
127.0.0.1 localhost.localdomain localhost
... HOST1
... HOST2
Deletions:
Additions:
~- MpiBeispielRing
Additions:
**mpdallexit** shutdown all process magers (mpd)
==a==MPD==a==
Gibt Informationen aus, wie z.B. die Portnummer
mpd --echo
==a==MPD==a==
Gibt Informationen aus, wie z.B. die Portnummer
mpd --echo
Additions:
**mpd** process mager
Additions:
=a=unter Linux (Debian)=a=
für MPICH2
aptitude install mpich-bin libmpich1.0-dev openmpi-dev openmpi-dbg mpich-mpd-bin mpich-mpd-bin libmpich-mpd1.0-dev
oder herunterladen und kompiieren
./configure --prefix=/opt/mpi
für MPICH2
aptitude install mpich-bin libmpich1.0-dev openmpi-dev openmpi-dbg mpich-mpd-bin mpich-mpd-bin libmpich-mpd1.0-dev
oder herunterladen und kompiieren
./configure --prefix=/opt/mpi
Deletions:
unter Linux
Quellen herunterladen
./com
smpd -install
oder speziell unter Debian
und MPICH2
aptitude install mpich-bin libmpich1.0-dev
aptitude install mpi-doc
aptitude remove --purge mpich-bin libmpich1.0-dev openmpi-dev openmpi-dbg
./configure --prefix=/opt
sudo make install
Additions:
==a==Fehlerbehandlung==a==
/etc/hosts
127.0.0.1 <HOSTNAME> localhost.localdomain localhost
/etc/hosts
127.0.0.1 <HOSTNAME> localhost.localdomain localhost
Additions:
echo "MPD_SECRETWORD=..." > ~/.mpd.conf
Deletions:
Additions:
""~/.mpd.conf"" erstellen
Deletions:
Additions:
HPC-Server starten
Test
Test
Deletions:
Additions:
~/.mpd.conf erstellen
echo "MPD_SECRETWORD=..." > ~/.mpd.conf%%
echo "MPD_SECRETWORD=..." > ~/.mpd.conf%%
Deletions:
MPD_SECRETWORD=...
Additions:
~- MpiBeispiel01
~- shared/examples_graphics/cpi_anim
~- shared/examples_graphics/cxgraphics
~- shared/examples_graphics/cpi_anim
~- shared/examples_graphics/cxgraphics
Deletions:
shared/examples_graphics
Additions:
==a==Programme bei MPICH2==a==
**mpicc** compiles and links MPI programs written in C
**mpicxx** compiles and links MPI programs written in C++
**mpiexec** runs an MPI program
shared/examples_graphics
**mpicc** compiles and links MPI programs written in C
**mpicxx** compiles and links MPI programs written in C++
**mpiexec** runs an MPI program
shared/examples_graphics
Additions:
~~-[[http://www.rz.rwth-aachen.de/global/show_document.asp?id=aaaaaaaaaabftzu Programmieren mit MPI und Java]]
~~-[[http://users.cs.cf.ac.uk/David.W.Walker/CM0323/code.html Beispiele]]
~~-[[http://users.cs.cf.ac.uk/David.W.Walker/CM0323/code.html Beispiele]]
Additions:
~-[[http://www.hpjava.org/mpiJava.html mpiJava]]
==a==Informationsmaterial==a==
==a==Beispiele==a==
==a==Informationsmaterial==a==
==a==Beispiele==a==
Deletions:
Additions:
==a==Implementierungen==a==
~-[[http://www.mcs.anl.gov/research/projects/mpich2/ MPICH2]] ist eine MPI-1- und MPI-2-Implementierung
~-[[http://www.open-mpi.org/ OpenMPI]] ist eine MPI-2-Implementierung eines Konsortiums von Partnern aus der akademischen Einrichtungen, Forschungseinrichtungen und der Industrie.
==a==Beispile==a==
==a==Funktionen in C==a==
MPICH
~- .Net framework 2.0 installieren, falls nicht vorhanden (der MPICh installer startet nicht, wenn .net 2.0 fehlt): dotnetfx.exe herunterladen und ausführen
~- .Net 2.0 Service pack 1 installieren: NetFx20_SP1_x86 herunterladen und ausführen
~- MPICH2 installieren: MPICH2 für Windows 32bit herunterladen, ausführen
~- Gcc aus MingW installieren, falls kein anderer C-Compiler vorhanden. Die Installation der neuen Version 1.08 habe ich nur mit Gcc getestet. VisualC++ oder Borland sollten auch funktionieren
~- SMPD als Dienst installieren (smpd -h listet die Optionen): smpd -install und smpd -register_spn
~- Suchpfad ergänzen (<MINGW_ROOT>/bin und <MPICH2_ROOT>/bin hinzufügen)
~- Das fertige Beispiel testen: cd <MPICH2_ROOT>/examples und mpirun -n 4 cpi
~-[[http://www.mcs.anl.gov/research/projects/mpich2/ MPICH2]] ist eine MPI-1- und MPI-2-Implementierung
~-[[http://www.open-mpi.org/ OpenMPI]] ist eine MPI-2-Implementierung eines Konsortiums von Partnern aus der akademischen Einrichtungen, Forschungseinrichtungen und der Industrie.
==a==Beispile==a==
==a==Funktionen in C==a==
MPICH
~- .Net framework 2.0 installieren, falls nicht vorhanden (der MPICh installer startet nicht, wenn .net 2.0 fehlt): dotnetfx.exe herunterladen und ausführen
~- .Net 2.0 Service pack 1 installieren: NetFx20_SP1_x86 herunterladen und ausführen
~- MPICH2 installieren: MPICH2 für Windows 32bit herunterladen, ausführen
~- Gcc aus MingW installieren, falls kein anderer C-Compiler vorhanden. Die Installation der neuen Version 1.08 habe ich nur mit Gcc getestet. VisualC++ oder Borland sollten auch funktionieren
~- SMPD als Dienst installieren (smpd -h listet die Optionen): smpd -install und smpd -register_spn
~- Suchpfad ergänzen (<MINGW_ROOT>/bin und <MPICH2_ROOT>/bin hinzufügen)
~- Das fertige Beispiel testen: cd <MPICH2_ROOT>/examples und mpirun -n 4 cpi
Deletions:
dotnetfx.exe herunterladen und ausführen
B) .Net 2.0 Service pack 1 installieren:
NetFx20_SP1_x86 herunterladen und ausführen
C) MPICH2 installieren
MPICH2 für Windows 32bit herunterladen, ausführen
D) Gcc aus MingW installieren, falls kein anderer C-Compiler vorhanden. Die Installation der neuen Version 1.08 habe ich nur mit Gcc getestet. VisualC++ oder Borland sollten auch funktionieren
E) SMPD als Dienst installieren (smpd -h listet die Optionen):
smpd -register_spn
F) Suchpfad ergänzen (<MINGW_ROOT>/bin und <MPICH2_ROOT>/bin hinzufügen)
G) Das fertige Beispiel testen:
cd <MPICH2_ROOT>/examples
mpirun -n 4 cpi
Additions:
aptitude remove --purge mpich-bin libmpich1.0-dev openmpi-dev openmpi-dbg
./configure --prefix=/opt
sudo make install
./configure --prefix=/opt
sudo make install
Additions:
http://debianclusters.cs.uni.edu/index.php/MPICH:_Pick_Your_Paradigm
http://packages.debian.org/sid/mpich-bin
http://wiki.freepascal.org/MPICH
http://packages.debian.org/sid/mpich-bin
http://wiki.freepascal.org/MPICH
Additions:
%%(c)
int MPI_Send (void* buf, int count, MPI_Datatype datatype, int dest, int tag, MPI_Comm comm)
int MPI_Recv (void* buf, int count, MPI_Datatype datatype, int source, int tag, MPI_Comm comm, MPI_Status* status)
int MPI_Isend (void* buf, int count, MPI_Datatype datatype, int dest, int tag, MPI_Comm comm, MPI_Request* request)
int MPI_Irecv (void* buf, int count, MPI_Datatype datatype, int source, int tag, MPI_Comm comm, MPI_Request* request)
int MPI_Test (MPI_Request* request, int* flag, MPI_Status* status)
int MPI_Wait (MPI_Request* request, MPI_Status* status)
int MPI_Comm_group (MPI_Comm comm, MPI_Group* group)
int MPI_Group_union (MPI_Group group1, MPI_Group group2, MPI_Group* new_group)
int MPI_Group_intersection (MPI_Group group1, MPI_Group group2, MPI_Group* new_group)
int MPI_Group_difference (MPI_Group group1, MPI_Group group2, MPI_Group* new_group)
int MPI_Bcast (void *buffer, int count, MPI_Datatype type, int root, MPI_Comm comm)
int MPI_Gather (void *sendbuf, int sendcount, MPI_Datatype sendtype, void *recvbuf, int recvcount, MPI_Datatype recvtype, int root, MPI_Comm comm)
int MPI_Gatherv (void *sendbuf, int sendcount, MPI_Datatype sendtype, void *recvbuf, int *recvcounts, int *displs, MPI_Datatype recvtype, int root, MPI_Comm comm)
int MPI_Scatter (void *sendbuf, int sendcount, MPI_Datatype sendtype, void *recvbuf, int recvcount, MPI_Datatype recvtype, int root, MPI_Comm comm)
int MPI_Scatterv (void *sendbuf, int *sendcounts, int *displs, MPI_Datatype sendtype, void *recvbuf, int recvcount, MPI_Datatype recvtype, int root, MPI_Comm comm)
int MPI_Reduce (void *sendbuf, void *recvbuf, int count, MPI_Datatype type, MPI_Op op, int root, MPI_Comm comm)
int MPI_Send (void* buf, int count, MPI_Datatype datatype, int dest, int tag, MPI_Comm comm)
int MPI_Recv (void* buf, int count, MPI_Datatype datatype, int source, int tag, MPI_Comm comm, MPI_Status* status)
int MPI_Isend (void* buf, int count, MPI_Datatype datatype, int dest, int tag, MPI_Comm comm, MPI_Request* request)
int MPI_Irecv (void* buf, int count, MPI_Datatype datatype, int source, int tag, MPI_Comm comm, MPI_Request* request)
int MPI_Test (MPI_Request* request, int* flag, MPI_Status* status)
int MPI_Wait (MPI_Request* request, MPI_Status* status)
int MPI_Comm_group (MPI_Comm comm, MPI_Group* group)
int MPI_Group_union (MPI_Group group1, MPI_Group group2, MPI_Group* new_group)
int MPI_Group_intersection (MPI_Group group1, MPI_Group group2, MPI_Group* new_group)
int MPI_Group_difference (MPI_Group group1, MPI_Group group2, MPI_Group* new_group)
int MPI_Bcast (void *buffer, int count, MPI_Datatype type, int root, MPI_Comm comm)
int MPI_Gather (void *sendbuf, int sendcount, MPI_Datatype sendtype, void *recvbuf, int recvcount, MPI_Datatype recvtype, int root, MPI_Comm comm)
int MPI_Gatherv (void *sendbuf, int sendcount, MPI_Datatype sendtype, void *recvbuf, int *recvcounts, int *displs, MPI_Datatype recvtype, int root, MPI_Comm comm)
int MPI_Scatter (void *sendbuf, int sendcount, MPI_Datatype sendtype, void *recvbuf, int recvcount, MPI_Datatype recvtype, int root, MPI_Comm comm)
int MPI_Scatterv (void *sendbuf, int *sendcounts, int *displs, MPI_Datatype sendtype, void *recvbuf, int recvcount, MPI_Datatype recvtype, int root, MPI_Comm comm)
int MPI_Reduce (void *sendbuf, void *recvbuf, int count, MPI_Datatype type, MPI_Op op, int root, MPI_Comm comm)
Additions:
MpiBeispiel01
Additions:
=====MPI=====
==a==Installation==a==
=a=unter Linux=a=
unter Linux
Quellen herunterladen
./com
make
make install
smpd -install
oder speziell unter Debian
für OpenMPI
aptitude install openmpi-dev openmpi-dbg
und MPICH2
aptitude install mpich-bin libmpich1.0-dev
aptitude install mpi-doc
=a= unter Windows=a=
unter Windows
MPI 1.0.8
.NET 2.0. SP1
gcc MINGW 32
A) .Net framework 2.0 installieren, falls nicht vorhanden (der MPICh installer startet nicht, wenn .net 2.0 fehlt):
dotnetfx.exe herunterladen und ausführen
B) .Net 2.0 Service pack 1 installieren:
NetFx20_SP1_x86 herunterladen und ausführen
C) MPICH2 installieren
MPICH2 für Windows 32bit herunterladen, ausführen
D) Gcc aus MingW installieren, falls kein anderer C-Compiler vorhanden. Die Installation der neuen Version 1.08 habe ich nur mit Gcc getestet. VisualC++ oder Borland sollten auch funktionieren
E) SMPD als Dienst installieren (smpd -h listet die Optionen):
smpd -install
smpd -register_spn
F) Suchpfad ergänzen (<MINGW_ROOT>/bin und <MPICH2_ROOT>/bin hinzufügen)
G) Das fertige Beispiel testen:
cd <MPICH2_ROOT>/examples
mpirun -n 4 cpi
==a==Vorbereitung==a==
~/.mpich2
%%
export PATH=/local/mpich2/bin:$PATH
export LD_LIBRARY_PATH=/local/mpich2/lib:$LD_LIBRARY_PATH
%%
%%(bash)
source ~/.mpich2
%%
Kompiliren
%%
mpicc cpi.c
%%
~/.mpd.conf
%%
MPD_SECRETWORD=...
%%
Rechte setzen
%%
chmod 600 ~/.mpd.conf
%%
HPC-Server
%%
mpd &
%%
%%
mpiexec -n 4 ~/mpi_ex/simple/spi
%%
==a==Installation==a==
=a=unter Linux=a=
unter Linux
Quellen herunterladen
./com
make
make install
smpd -install
oder speziell unter Debian
für OpenMPI
aptitude install openmpi-dev openmpi-dbg
und MPICH2
aptitude install mpich-bin libmpich1.0-dev
aptitude install mpi-doc
=a= unter Windows=a=
unter Windows
MPI 1.0.8
.NET 2.0. SP1
gcc MINGW 32
A) .Net framework 2.0 installieren, falls nicht vorhanden (der MPICh installer startet nicht, wenn .net 2.0 fehlt):
dotnetfx.exe herunterladen und ausführen
B) .Net 2.0 Service pack 1 installieren:
NetFx20_SP1_x86 herunterladen und ausführen
C) MPICH2 installieren
MPICH2 für Windows 32bit herunterladen, ausführen
D) Gcc aus MingW installieren, falls kein anderer C-Compiler vorhanden. Die Installation der neuen Version 1.08 habe ich nur mit Gcc getestet. VisualC++ oder Borland sollten auch funktionieren
E) SMPD als Dienst installieren (smpd -h listet die Optionen):
smpd -install
smpd -register_spn
F) Suchpfad ergänzen (<MINGW_ROOT>/bin und <MPICH2_ROOT>/bin hinzufügen)
G) Das fertige Beispiel testen:
cd <MPICH2_ROOT>/examples
mpirun -n 4 cpi
==a==Vorbereitung==a==
~/.mpich2
%%
export PATH=/local/mpich2/bin:$PATH
export LD_LIBRARY_PATH=/local/mpich2/lib:$LD_LIBRARY_PATH
%%
%%(bash)
source ~/.mpich2
%%
Kompiliren
%%
mpicc cpi.c
%%
~/.mpd.conf
%%
MPD_SECRETWORD=...
%%
Rechte setzen
%%
chmod 600 ~/.mpd.conf
%%
HPC-Server
%%
mpd &
%%
%%
mpiexec -n 4 ~/mpi_ex/simple/spi
%%