Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
Download

📚 The CoCalc Library - books, templates and other resources

132930 views
License: OTHER
1
%!TEX root = Programmierparadigmen.tex
2
\chapter{MPI}
3
\index{MPI|(}
4
5
Message Passing Interface (kurz: MPI) ist ein Standard,
6
der den Nachrichtenaustausch bei parallelen Berechnungen auf
7
verteilten Computersystemen beschreibt.
8
9
Prozesse kommunizieren in MPI über sog. \textit{Kommunikatoren}. Ein Kommunikator
10
(\texttt{MPI\_Comm}\xindex{MPI\_Comm@\texttt{MPI\_Comm}})
11
definiert eine Menge an Prozessen, die miteinander kommunizieren können. In dieser
12
Prozessgruppe hat jeder Prozess einen eindeutigen \textit{rank}\xindex{rank} über den die Prozesse
13
sich identifizieren können.
14
15
\section{Erste Schritte}
16
\inputminted[numbersep=5pt, tabsize=4, frame=lines, label=hello-world.c]{c}{scripts/mpi/hello-world.c}
17
18
Das wird \texttt{mpicc hello-world.c} kompiliert.\\
19
Mit \texttt{mpirun -np 14 scripts/mpi/a.out} werden 14 Kopien des Programms
20
gestartet.
21
22
Hierbei ist \texttt{MPI\_COMM\_WORLD}\xindex{MPI\_COMM\_WORLD@\texttt{MPI\_COMM\_WORLD}} der Standard-Kommunikator,
23
der von \texttt{MPI\_Init} erstellt wird.
24
25
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
26
\section{MPI Datatypes}\label{sec:MPI-Datatypes}\xindex{MPI datatypes}%
27
28
\begin{table}[h]
29
\begin{tabular}{|l|l||p{3.2cm}|l|}
30
\hline
31
\textbf{MPI datatype} & \textbf{C datatype} & \textbf{MPI datatype} & \textbf{C datatype} \\ \hline
32
MPI\_INT & signed int & MPI\_FLOAT & float \\
33
MPI\_UNSIGNED & unsigned int & MPI\_DOUBLE & double \\
34
MPI\_CHAR & signed char & MPI\_UNSIGNED\newline{}\_CHAR & unsigned char \\ \hline
35
\end{tabular}
36
\end{table}
37
38
\section{Funktionen}
39
\inputminted[numbersep=5pt, tabsize=4]{c}{scripts/mpi/comm-size.c}\xindex{MPI\_Comm\_size@\texttt{MPI\_Comm\_size}}%
40
Liefert die Größe des angegebenen Kommunikators; dh. die Anzahl der Prozesse in der Gruppe.
41
42
\textbf{Parameter}
43
\begin{itemize}
44
\item \textbf{comm}: Kommunikator (handle)
45
\item \textbf{size}: Anzahl der Prozesse in der Gruppe von \texttt{comm}
46
\end{itemize}
47
48
\textbf{Beispiel}
49
\inputminted[numbersep=5pt, tabsize=4]{c}{scripts/mpi/comm-size-example.c}
50
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
51
\goodbreak
52
\rule{\textwidth}{0.4pt}\xindex{MPI\_Comm\_rank@\texttt{MPI\_Comm\_rank}}%
53
\inputminted[numbersep=5pt, tabsize=4]{c}{scripts/mpi/comm-rank.c}
54
Bestimmt den Rang des rufenden Prozesses innerhalb des Kommunikators.
55
56
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.
57
58
\textbf{Parameter}
59
\begin{itemize}
60
\item \textbf{comm}: Kommunikator (handle)
61
\item \textbf{rank}: Rang des rufenden Prozesses innerhalb von \texttt{comm}
62
\end{itemize}
63
64
\textbf{Beispiel}
65
\inputminted[numbersep=5pt, tabsize=4]{c}{scripts/mpi/comm-rank-example.c}
66
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
67
\goodbreak
68
\rule{\textwidth}{0.4pt}\xindex{MPI\_Send@\texttt{MPI\_Send}}%
69
\inputminted[numbersep=5pt, tabsize=4]{c}{scripts/mpi/mpi-send.c}
70
Senden einer Nachricht an einen anderen Prozeß innerhalb eines Kommunikators. (Standard-Send)
71
72
\textbf{Parameter}
73
\begin{itemize}
74
\item \textbf{buf}: Anfangsadresse des Sendepuffers
75
\item \textbf{count}: Anzahl der Elemente des Sendepuffers (nichtnegativ)
76
\item \textbf{datatype}: Typ der Elemente des Sendepuffers (handle) (vgl. \cpageref{sec:MPI-Datatypes})
77
\item \textbf{dest}: Rang des Empfängerprozesses in comm (integer)
78
\item \textbf{tag}: message tag zur Unterscheidung verschiedener Nachrichten;
79
Ein Kommunikationsvorgang wird durch ein Tripel (Sender, Empfänger, tag) eindeutig beschrieben.
80
\item \textbf{comm}: Kommunikator (handle)
81
\end{itemize}
82
83
\textbf{Beispiel}
84
\inputminted[numbersep=5pt, tabsize=4]{c}{scripts/mpi/mpi-send-example.c}
85
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
86
\goodbreak
87
\rule{\textwidth}{0.4pt}\xindex{MPI\_Recv@\texttt{MPI\_Recv}}%
88
\inputminted[numbersep=5pt, tabsize=4]{c}{scripts/mpi/mpi-receive.c}
89
Empfangen einer Nachricht (blockierend)
90
91
\textbf{Parameter}
92
\begin{itemize}
93
\item \textbf{buf}: Anfangsadresse des Empfangspuffers
94
\item \textbf{count}: Anzahl (d.~h. $\geq 0$) der Elemente im Empfangspuffer
95
\item \textbf{datatype}: Typ der zu empfangenden Elemente (handle) (vgl. \cpageref{sec:MPI-Datatypes})
96
\item \textbf{source}: Rang des Senderprozesses in comm oder \texttt{MPI\_ANY\_SOURCE}
97
\item \textbf{tag}: message tag zur Unterscheidung verschiedener Nachrichten
98
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}.
99
\item \textbf{comm}: Kommunikator (handle)
100
\item \textbf{status}: Status, welcher source und tag angibt (\texttt{MPI\_Status}).
101
Soll dieser Status ignoriert werden, kann \texttt{MPI\_STATUS\_IGNORE}\xindex{MPI\_STATUS\_IGNORE@\texttt{MPI\_STATUS\_IGNORE}} angegeben werden.
102
\end{itemize}
103
104
\textbf{Beispiel}
105
\inputminted[numbersep=5pt, tabsize=4]{c}{scripts/mpi/mpi-receive-example.c}
106
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
107
\goodbreak
108
\rule{\textwidth}{0.4pt}\xindex{MPI\_Reduce@\texttt{MPI\_Reduce}}%
109
\inputminted[numbersep=5pt, tabsize=4]{c}{scripts/mpi/mpi-reduce.c}
110
Führt eine globale Operation \textbf{op} aus; der Prozeß \enquote{root} erhält das Resultat.
111
112
\textbf{Input-Parameter}
113
\begin{itemize}
114
\item \textbf{sendbuf}: Startadresse des Sendepuffers
115
\item \textbf{count}: Anzahl der Elemente im Sendepuffer
116
\item \textbf{datatype}: Typ der Elemente von \texttt{sendbuf} (vgl. \cpageref{sec:MPI-Datatypes})
117
\item \textbf{op}: auszuführende Operation (handle)
118
\item \textbf{root}: Rang des Root-Prozesses in comm, der das Ergebnis haben soll
119
\item \textbf{comm}: Kommunikator (handle)
120
\end{itemize}
121
122
\textbf{Output-Parameter}
123
\begin{itemize}
124
\item \textbf{recvbuf}: Adresse des Puffers, in den das Ergebnis abgelegt wird (nur für \texttt{root} signifikant)
125
\end{itemize}
126
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
127
\goodbreak
128
\rule{\textwidth}{0.4pt}\xindex{MPI\_Alltoall@\texttt{MPI\_Alltoall}}%
129
\inputminted[numbersep=5pt, tabsize=4]{c}{scripts/mpi/mpi-alltoall.c}
130
Teilt Daten von jedem Prozeß einer Gruppe an alle anderen auf.
131
132
\textbf{Input-Parameter}
133
\begin{itemize}
134
\item \textbf{sendbuf}: Startadresse des Sendepuffers
135
\item \textbf{sendcount}: Anzahl der Elemente im Sendepuffer
136
\item \textbf{sendtype}: Typ der Elemente des Sendepuffers (handle) (vgl. \cpageref{sec:MPI-Datatypes})
137
\item \textbf{recvcount}: Anzahl der Elemente, die von jedem einzelnen Prozeß empfangen werden
138
\item \textbf{recvtype}: Typ der Elemente im Empfangspuffer (handle) (vgl. \cpageref{sec:MPI-Datatypes})
139
\item \textbf{comm}: Kommunikator (handle)
140
\end{itemize}
141
142
\textbf{Output-Parameter}
143
\begin{itemize}
144
\item \textbf{recvbuf}: Anfangsadresse des Empfangspuffers
145
\end{itemize}
146
147
\textbf{Beispiel}
148
\inputminted[numbersep=5pt, tabsize=4]{c}{scripts/mpi/mpi-alltoall-example.c}
149
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
150
\goodbreak
151
\rule{\textwidth}{0.4pt}\xindex{MPI\_Bcast@\texttt{MPI\_Bcast}}%
152
\inputminted[numbersep=5pt, tabsize=4]{c}{scripts/mpi/mpi-bcast.c}
153
Sendet eine Nachricht vom Prozess \texttt{root} an alle anderen Prozesse des
154
angegebenen Kommunikators.
155
156
\textbf{Parameter}
157
\begin{itemize}
158
\item \textbf{buffer}: Startadresse des Datenpuffers
159
\item \textbf{count}: Anzahl der Elemente im Puffer
160
\item \textbf{datatype}: Typ der Pufferelemente (handle) (vgl. \cpageref{sec:MPI-Datatypes})
161
\item \textbf{root}: Wurzelprozeß; der, welcher sendet
162
\item \textbf{comm}: Kommunikator (handle)
163
\end{itemize}
164
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
165
\goodbreak
166
\rule{\textwidth}{0.4pt}\xindex{MPI\_Scatter@\texttt{MPI\_Scatter}}%
167
\inputminted[numbersep=5pt, tabsize=4]{c}{scripts/mpi/mpi-scatter.c}
168
Verteilt Daten vom Prozess \texttt{root} unter alle anderen Prozesse in der Gruppe, so daß, soweit möglich, alle Prozesse gleich große Anteile erhalten.
169
170
\textbf{Input-Parameter}
171
\begin{itemize}
172
\item \textbf{sendbuf}: Anfangsadresse des Sendepuffers (Wert ist lediglich für \texttt{root} signifikant)
173
\item \textbf{sendcount}: Anzahl der Elemente, die jeder Prozeß geschickt bekommen soll (integer)
174
\item \textbf{sendtype}: Typ der Elemente in sendbuf (handle) (vgl. \cpageref{sec:MPI-Datatypes})
175
\item \textbf{recvcount}: Anzahl der Elemente im Empfangspuffer. Meist ist es günstig, recvcount = sendcount zu wählen.
176
\item \textbf{recvtype}: Typ der Elemente des Empfangspuffers (handle) (vgl. \cpageref{sec:MPI-Datatypes})
177
\item \textbf{root}: Rang des Prozesses in comm, der die Daten versendet
178
\item \textbf{comm}: Kommunikator (handle)
179
\end{itemize}
180
181
\textbf{Output-Parameter}
182
\begin{itemize}
183
\item \textbf{recvbuf}: Adresse des Empfangsbuffers; auch \texttt{root} findet seinen Anteil an Daten nach der Operation dort
184
\end{itemize}
185
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
186
\goodbreak
187
\rule{\textwidth}{0.4pt}\xindex{MPI\_Allgather@\texttt{MPI\_Allgather}}%
188
\inputminted[numbersep=5pt, tabsize=4]{c}{scripts/mpi/mpi-allgather.c}
189
Sammelt Daten, die in einer Prozeßgruppe verteilt sind, ein und verteilt das Resultat an alle Prozesse in der Gruppe.
190
191
\textbf{Input-Parameter}
192
\begin{itemize}
193
\item \textbf{sendbuf}: Startadresse des Sendepuffers
194
\item \textbf{sendcount}: Anzahl der Elemente im Sendepuffer
195
\item \textbf{sendtype}: Datentyp der Elemente des Sendepuffers (handle) (vgl. \cpageref{sec:MPI-Datatypes})
196
\item \textbf{recvcount}: Anzahl der Elemente, die jeder einzelne Prozeß sendet (integer)
197
\item \textbf{recvtype}: Datentyp der Elemente im Empfangspuffer (handle) (vgl. \cpageref{sec:MPI-Datatypes})
198
\item \textbf{comm}: Kommunikator (handle)
199
\end{itemize}
200
201
\textbf{Output-Parameter}
202
\begin{itemize}
203
\item \textbf{recvbuf}: Anfangsadresse des Empfangspuffers
204
\end{itemize}
205
206
\textbf{Beispiel}
207
\inputminted[numbersep=5pt, tabsize=4]{c}{scripts/mpi/mpi-allgather-example.c}
208
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
209
\goodbreak
210
\rule{\textwidth}{0.4pt}\xindex{MPI\_Gather@\texttt{MPI\_Gather}}%
211
\inputminted[numbersep=5pt, tabsize=4]{c}{scripts/mpi/mpi-gather.c}
212
Sammelt Daten, die in einer Prozeßgruppe verteilt sind, ein.
213
214
\textbf{Input-Parameter}
215
\begin{itemize}
216
\item \textbf{sendbuf}: Startadresse des Sendepuffers
217
\item \textbf{sendcount}: Anzahl der Elemente im Sendepuffer
218
\item \textbf{sendtype}: Datentyp der Elemente des Sendepuffers (handle)
219
\item \textbf{recvcount}: Anzahl der Elemente, die jeder einzelne Prozeß sendet (nur für \texttt{root} signifikant)
220
\item \textbf{recvtype}: Typ der Elemente im Empfangspuffer (handle) (nur für \texttt{root} signifikant) (vgl. \cpageref{sec:MPI-Datatypes})
221
\item \textbf{root}: Rang des empfangenden Prozesses in \texttt{comm}
222
\item \textbf{comm}: Kommunikator (handle)
223
\end{itemize}
224
225
\textbf{Output-Parameter}
226
\begin{itemize}
227
\item \textbf{recvbuf}: Adresse des Empfangspuffers (nur für \texttt{root} signifikant)
228
\end{itemize}
229
230
\textbf{Beispiel}
231
\inputminted[numbersep=5pt, tabsize=4]{c}{scripts/mpi/mpi-reduce-example.c}
232
233
\section{Beispiele}
234
\subsection{sum-reduce Implementierung}\xindex{MPI\_Reduce@\texttt{MPI\_Reduce}}%
235
\inputminted[numbersep=5pt, tabsize=4]{c}{scripts/mpi/mpi-sum-reduce.c}
236
237
\subsection[broadcast Implementierung]{broadcast Implementierung\footnote{Klausur WS 2012 / 2013}}\xindex{MPI\_Bcast@\texttt{MPI\_Bcast}}%
238
\inputminted[numbersep=5pt, tabsize=4]{c}{scripts/mpi/mpi-mybroadcast.c}
239
240
\section{Weitere Informationen}
241
\begin{itemize}
242
\item \url{http://mpitutorial.com/}
243
\item \url{http://www.open-mpi.org/}
244
\item \url{http://www.tu-chemnitz.de/informatik/RA/projects/mpihelp/}
245
\end{itemize}
246
247
\index{MPI|)}
248