Browse Source

MPI Gather hinzugefügt

Martin Thoma 11 years ago
parent
commit
cd7df763db

+ 25 - 8
documents/Programmierparadigmen/MPI.tex

@@ -73,7 +73,7 @@ Senden einer Nachricht an einen anderen Prozeß innerhalb eines Kommunikators. (
 \begin{itemize}
     \item \textbf{buf}: Anfangsadresse des Sendepuffers 
     \item \textbf{count}: Anzahl der Elemente des Sendepuffers (nichtnegativ) 
-    \item \textbf{datatype}: Typ der Elemente des Sendepuffers (handle)
+    \item \textbf{datatype}: Typ der Elemente des Sendepuffers (handle) (vgl. \cpageref{sec:MPI-Datatypes})
     \item \textbf{dest}: Rang des Empfängerprozesses in comm (integer)
     \item \textbf{tag}: message tag zur Unterscheidung verschiedener Nachrichten; 
 Ein Kommunikationsvorgang wird durch ein Tripel (Sender, Empfänger, tag) eindeutig beschrieben. 
@@ -92,7 +92,7 @@ Empfangen einer Nachricht (blockierend)
 \begin{itemize}
     \item \textbf{buf}: Anfangsadresse des Empfangspuffers
     \item \textbf{count}: Anzahl (d.~h. $\geq 0$) der Elemente im Empfangspuffer
-    \item \textbf{datatype}: Typ der zu empfangenden Elemente (handle)
+    \item \textbf{datatype}: Typ der zu empfangenden Elemente (handle) (vgl. \cpageref{sec:MPI-Datatypes})
     \item \textbf{source}: Rang des Senderprozesses in comm oder \texttt{MPI\_ANY\_SOURCE}
     \item \textbf{tag}: message tag zur Unterscheidung verschiedener Nachrichten
                   Ein Kommunikationsvorgang wird durch ein Tripel (Sender, Empfänger, tag) eindeutig beschrieben. Um Nachrichten mit beliebigen tags zu empfangen, benutzt man die Konstante \texttt{MPI\_ANY\_TAG}.
@@ -113,7 +113,7 @@ Führt eine globale Operation \textbf{op} aus; der Prozeß \enquote{root} erhäl
 \begin{itemize}
     \item \textbf{sendbuf}: Startadresse des Sendepuffers
     \item \textbf{count}: Anzahl der Elemente im Sendepuffer
-    \item \textbf{datatype}: Datentyp der Elemente von \texttt{sendbuf} (vgl. \cpageref{sec:MPI-Datatypes})
+    \item \textbf{datatype}: Typ der Elemente von \texttt{sendbuf} (vgl. \cpageref{sec:MPI-Datatypes})
     \item \textbf{op}: auszuführende Operation (handle)
     \item \textbf{root}: Rang des Root-Prozesses in comm, der das Ergebnis haben soll
     \item \textbf{comm}: Kommunikator (handle)
@@ -128,9 +128,9 @@ Teilt Daten von jedem Prozeß einer Gruppe an alle anderen auf.
 \begin{itemize}
     \item \textbf{sendbuf}: Startadresse des Sendepuffers 
     \item \textbf{sendcount}: Anzahl der Elemente im Sendepuffer
-    \item \textbf{sendtype}: Datentyp der Elemente des Sendepuffers (handle) 
+    \item \textbf{sendtype}: Typ der Elemente des Sendepuffers (handle) (vgl. \cpageref{sec:MPI-Datatypes})
     \item \textbf{recvcount}: Anzahl der Elemente, die von jedem einzelnen Prozeß empfangen werden
-    \item \textbf{recvtype}: Datentyp der Elemente im Empfangspuffer (handle) 
+    \item \textbf{recvtype}: Typ der Elemente im Empfangspuffer (handle) (vgl. \cpageref{sec:MPI-Datatypes})
     \item \textbf{comm}: Kommunikator (handle)
 \end{itemize}
 
@@ -147,7 +147,7 @@ angegebenen Kommunikators.
 \begin{itemize}
     \item \textbf{buffer}: Startadresse des Datenpuffers 
     \item \textbf{count}: Anzahl der Elemente im Puffer
-    \item \textbf{datatype}: Datentyp der Pufferelemente (handle) 
+    \item \textbf{datatype}: Typ der Pufferelemente (handle) (vgl. \cpageref{sec:MPI-Datatypes})
     \item \textbf{root}: Wurzelprozeß; der, welcher sendet
     \item \textbf{comm}: Kommunikator (handle)
 \end{itemize}
@@ -161,13 +161,30 @@ Verteilt Daten vom Prozess \texttt{root} unter alle anderen Prozesse in der Grup
 \begin{itemize}
     \item \textbf{sendbuf}: Anfangsadresse des Sendepuffers (Wert ist lediglich für 'root' signifikant) 
     \item \textbf{sendcount}: Anzahl der Elemente, die jeder Prozeß geschickt bekommen soll (integer) 
-    \item \textbf{sendtype}: Datentyp der Elemente in sendbuf (handle) 
+    \item \textbf{sendtype}: Typ der Elemente in sendbuf (handle) (vgl. \cpageref{sec:MPI-Datatypes})
     \item \textbf{recvcount}: Anzahl der Elemente im Empfangspuffer. Meist ist es günstig, recvcount = sendcount zu wählen. 
-    \item \textbf{recvtype}: Datentyp der Elemente des Empfangspuffers (handle) 
+    \item \textbf{recvtype}: Typ der Elemente des Empfangspuffers (handle) (vgl. \cpageref{sec:MPI-Datatypes})
     \item \textbf{root}: Rang des Prozesses in comm, der die Daten versendet
     \item \textbf{comm}: Kommunikator (handle)
 \end{itemize}
 
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\goodbreak
+\rule{\textwidth}{0.4pt}\xindex{MPI\_Gather@\texttt{MPI\_Gather}}%
+\inputminted[numbersep=5pt, tabsize=4]{c}{scripts/mpi/mpi-gather.c}
+Sammelt Daten, die in einer Prozeßgruppe verteilt sind, ein.
+
+\textbf{Parameter}
+\begin{itemize}
+    \item \textbf{sendbuf}: Startadresse des Sendepuffers 
+    \item \textbf{sendcount}: Anzahl der Elemente im Sendepuffer
+    \item \textbf{sendtype}: Datentyp der Elemente des Sendepuffers (handle) 
+    \item \textbf{recvcount}: Anzahl der Elemente, die jeder einzelne Prozeß sendet (nur für 'root' signifikant) 
+    \item \textbf{recvtype}: Typ der Elemente im Empfangspuffer (handle) (nur für 'root' signifikant) (vgl. \cpageref{sec:MPI-Datatypes})
+    \item \textbf{root}: Rang des empfangenden Prozesses in \texttt{comm}
+    \item \textbf{comm}: Kommunikator (handle)
+\end{itemize}
+
 \textbf{Beispiel}
 \inputminted[numbersep=5pt, tabsize=4]{c}{scripts/mpi/mpi-reduce-example.c}
 

BIN
documents/Programmierparadigmen/Programmierparadigmen.pdf


+ 19 - 0
documents/Programmierparadigmen/scripts/mpi/mpi-gather-example.c

@@ -0,0 +1,19 @@
+#include "mpi.h"
+#define ROOT 0
+
+int numprocs, myid, bufsize;
+int *sendbuf, *recvbuf;
+
+...
+MPI_Comm_size(MPI_COMM_WORLD, &numprocs);
+MPI_Comm_rank(MPI_COMM_WORLD, &myid);
+...
+... sendbuf allocieren, belegen ...
+... bufsize belegen ...
+if (myid==ROOT) {
+    ...
+    recvbuf=malloc(bufsize*sizeof(int));
+}
+MPI_Gather(sendbuf, bufsize, MPI_INT, recvbuf, bufsize, 
+           MPI_INT, ROOT, MPI_COMM_WORLD);
+...

+ 3 - 0
documents/Programmierparadigmen/scripts/mpi/mpi-gather.c

@@ -0,0 +1,3 @@
+int MPI_Gather(void *sendbuf, int sendcount, MPI_Datatype sendtype,
+    void *recvbuf, int recvcount, MPI_Datatype recvtype, int root,
+    MPI_Comm comm)