diff --git a/documents/Programmierparadigmen/MPI.tex b/documents/Programmierparadigmen/MPI.tex index 06eb67e..663d094 100644 --- a/documents/Programmierparadigmen/MPI.tex +++ b/documents/Programmierparadigmen/MPI.tex @@ -13,11 +13,57 @@ Das wird \texttt{mpicc hello-world.c} kompiliert.\\ Mit \texttt{mpirun -np 14 scripts/mpi/a.out} werden 14 Kopien des Programms gestartet. -\section{Syntax} +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +\section{Funktionen} +\inputminted[numbersep=5pt, tabsize=4]{c}{scripts/mpi/comm-size.c} +Liefert die Größe des angegebenen Kommunikators; dh. die Anzahl der Prozesse in der Gruppe. + +\textbf{Parameter} +\begin{itemize} + \item \textbf{comm}: Kommunikator (handle) + \item \textbf{size}: Anzahl der Prozesse in der Gruppe von \texttt{comm} +\end{itemize} + +\textbf{Beispiel} +\inputminted[numbersep=5pt, tabsize=4]{c}{scripts/mpi/comm-size-example.c} +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +\rule{\textwidth}{0.4pt} +\inputminted[numbersep=5pt, tabsize=4]{c}{scripts/mpi/comm-rank.c} +Bestimmt den Rang des rufenden Prozesses innerhalb des Kommunikators. + +Der Rang wird von MPI zum Identifizieren eines Prozesses verwendet. Die Rangnummer ist innerhalb eines Kommunikators eindeutig. Dabei wird stets von Null beginnend durchnumeriert. Sender und Empfänger bei Sendeoperationen oder die Wurzel bei kollektiven Operationen werden immer mittels Rang angegeben. + +\textbf{Parameter} +\begin{itemize} + \item \textbf{comm}: Kommunikator (handle) + \item \textbf{rank}: Rang des rufenden Prozesses innerhalb von \texttt{comm} +\end{itemize} + +\textbf{Beispiel} +\inputminted[numbersep=5pt, tabsize=4]{c}{scripts/mpi/comm-rank-example.c} +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +\rule{\textwidth}{0.4pt} +\inputminted[numbersep=5pt, tabsize=4]{c}{scripts/mpi/mpi-reduce.c} +Führt eine globale Operation \textbf{op} aus; der Prozeß \enquote{root} erhält das Resultat. +\textbf{Parameter} +\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} + \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) +\end{itemize} + +\textbf{Beispiel} +\inputminted[numbersep=5pt, tabsize=4]{c}{scripts/mpi/mpi-reduce-example.c} + \section{Beispiele} \section{Weitere Informationen} \begin{itemize} + \item \url{http://mpitutorial.com/} \item \url{http://www.open-mpi.org/} + \item \url{http://www.tu-chemnitz.de/informatik/RA/projects/mpihelp/} \end{itemize} \index{MPI|)} \ No newline at end of file diff --git a/documents/Programmierparadigmen/Programmierparadigmen.pdf b/documents/Programmierparadigmen/Programmierparadigmen.pdf index 1f7beb9..8cc5ec7 100644 Binary files a/documents/Programmierparadigmen/Programmierparadigmen.pdf and b/documents/Programmierparadigmen/Programmierparadigmen.pdf differ diff --git a/documents/Programmierparadigmen/scripts/mpi/comm-rank-example.c b/documents/Programmierparadigmen/scripts/mpi/comm-rank-example.c new file mode 100644 index 0000000..ec82925 --- /dev/null +++ b/documents/Programmierparadigmen/scripts/mpi/comm-rank-example.c @@ -0,0 +1,13 @@ +#include "mpi.h" + + int rank; + MPI_Comm comm; + + ... + MPI_Comm_rank(comm, &rank); + if (rank==0) { + ... Code fur Prozess 0 ... + } + else { + ... Code fur die anderen Prozesse ... + } \ No newline at end of file diff --git a/documents/Programmierparadigmen/scripts/mpi/comm-rank.c b/documents/Programmierparadigmen/scripts/mpi/comm-rank.c new file mode 100644 index 0000000..688c340 --- /dev/null +++ b/documents/Programmierparadigmen/scripts/mpi/comm-rank.c @@ -0,0 +1 @@ +int MPI_Comm_rank( MPI_Comm comm, int *rank ) \ No newline at end of file diff --git a/documents/Programmierparadigmen/scripts/mpi/comm-size-example.c b/documents/Programmierparadigmen/scripts/mpi/comm-size-example.c new file mode 100644 index 0000000..bae79de --- /dev/null +++ b/documents/Programmierparadigmen/scripts/mpi/comm-size-example.c @@ -0,0 +1,7 @@ +#include "mpi.h" + + int size; + MPI_Comm comm; + ... + MPI_Comm_size(comm, &size); + ... \ No newline at end of file diff --git a/documents/Programmierparadigmen/scripts/mpi/comm-size.c b/documents/Programmierparadigmen/scripts/mpi/comm-size.c new file mode 100644 index 0000000..3484af3 --- /dev/null +++ b/documents/Programmierparadigmen/scripts/mpi/comm-size.c @@ -0,0 +1 @@ +int MPI_Comm_size( MPI_Comm comm, int *size ) \ No newline at end of file diff --git a/documents/Programmierparadigmen/scripts/mpi/mpi-reduce-example.c b/documents/Programmierparadigmen/scripts/mpi/mpi-reduce-example.c new file mode 100644 index 0000000..5e3ad3e --- /dev/null +++ b/documents/Programmierparadigmen/scripts/mpi/mpi-reduce-example.c @@ -0,0 +1,10 @@ +#include "mpi.h" + + int myid; + int recvbuf[DATASIZE], sendbuf[DATA_SIZE]; + + ... + /* Minimum bilden */ + MPI_Reduce(sendbuf, recvbuf, DATA_SIZE, MPI_INT, MPI_MIN, + 0, MPI_COMM_WORLD); + ... \ No newline at end of file diff --git a/documents/Programmierparadigmen/scripts/mpi/mpi-reduce.c b/documents/Programmierparadigmen/scripts/mpi/mpi-reduce.c new file mode 100644 index 0000000..03ae98b --- /dev/null +++ b/documents/Programmierparadigmen/scripts/mpi/mpi-reduce.c @@ -0,0 +1,3 @@ +int MPI_Reduce(const void *sendbuf, void *recvbuf, + int count, MPI_Datatype datatype, + MPI_Op op, int root, MPI_Comm comm) \ No newline at end of file