MPI: restliche Folien
This commit is contained in:
parent
69f6e369ba
commit
3cb9ccf6cb
57
2-3-mpi.tex
57
2-3-mpi.tex
@ -70,10 +70,12 @@
|
||||
\item \lstinline|MPI_Bcast(void *buf, int count, MPI_Datatype datatype, int root, MPI_Comm comm)|: Versenden bzw. Empfangen einer Nachricht von einem Knoten an alle anderen
|
||||
\item \lstinline|MPI_Scatter(void *sendbuf, int sendcount, MPI_Datatype sendtype, void *recvbuf, int recvcount, MPI_Datatype recvtype, int root, MPI_Comm comm)|: elementweises Verteilen eines Arrays an alle Prozesse des Kommunikators
|
||||
\item \lstinline|MPI_Gather(void *sendbuf, int sendcount, MPI_Datatype sendtype, void *recvbuf, int recvcount, MPI_Datatype recvtype, int root, MPI_Comm comm)|: Aufsammeln von Datenelementen von allen Prozessen und Speicherung als Array in einem Prozess
|
||||
\item \lstinline|MPI_Allgather(void *sendbuf, int sendcount, MPI_Datatype sendtype, void *recvbuf, int recvcount, MPI_Datatype recvtype, MPI_Comm comm)|: Aufsammeln von Datenelementen von allen Prozessen und Speicherung als Array in jedem Prozess
|
||||
\item \lstinline|MPI_Allgather(void *sendbuf, int sendcount, MPI_Datatype sendtype, void *recvbuf, int recvcount, MPI_Datatype recvtype, MPI_Comm comm)|: Aufsammeln von Datenelementen von allen Prozessen und Speicherung als Array in jedem Prozess (Transponieren der Arrays über die Nodes)
|
||||
\end{itemize}
|
||||
\item Reduktion: \begin{itemize}
|
||||
\item
|
||||
\item \lstinline|MPI_Reduce(void *data, void *result, int count, MPI_Datatype datatype, MPI_Op operator, int root, MPI_Comm comm)|: Globale Reduktion auf verteilten Daten
|
||||
\item \lstinline|MPI_Allreduce(void *data, void *result, int count, MPI_Datatype datatype, MPI_Op operator, MPI_Comm comm)|: Globale Reduktion auf verteilten Daten mit Ergebnis auf jedem Knoten
|
||||
\item \lstinline|MPI_Scan(void *sendbuf, void *recvbuf, int count, MPI_Datatype datatype, MPI_Op operator, MPI_Comm comm)|: Globale Reduktion, jeder Node erhält Ergebnis bis einschließlich sich selbst
|
||||
\end{itemize}
|
||||
\end{itemize}
|
||||
|
||||
@ -110,4 +112,55 @@
|
||||
\item Vektor: \lstinline|MPI_Type_vector(int count, int blocklength, int stride, MPI_Datatype oldtype, MPI_Datatype *newtype)|
|
||||
\item \lstinline|MPI_Type_commit(MPI_Datatype *type)|: Festlegen des Datentyps
|
||||
\end{itemize}
|
||||
\end{itemize}
|
||||
|
||||
\subsubsection{MPI-2}
|
||||
\begin{itemize}
|
||||
\item dynamisches Starten von Prozessen
|
||||
\item Socket-Programmierung
|
||||
\item nicht-blockierende kollektive Operationen
|
||||
\item Remote Memory Access mit Speicherfenstern: \begin{itemize}
|
||||
\item \lstinline|MPI_Win_create (void *base, int size, int disp_unit, MPI_Info info, MPI_Comm comm MPI_Win *win)|: kollektives Erstellen eines Fensters
|
||||
\item \lstinline|MPI_Put(void *buffer, int or_count, MPI_Datatype or_type, int ta_rank, MPI_Aint ta_disp, int ta_count, MPI_Datatype ta_type, MPI_Win win)|: Schreiben in entferntes Speicherfenster
|
||||
\item \lstinline|MPI_Win_fende(MPI_Win win)|: Synchronisation bezüglich des Fensters
|
||||
\item \lstinline|MPI_Accumulate(void *buffer, int or_count, MPI_Datatype or_type, int ta_rank, MPI_Aint ta_disp, int ta_count, MPI_Datatype ta_type, MPI_Op op, MPI_Win win)|: wie \texttt{MPI\_Reduce} auf entfernten Speicherfenstern
|
||||
\end{itemize}
|
||||
\item Multi-Threading-Unterstützung mit \lstinline|MPI_Init_thread(int **argc, char ***argv, int required, int *provided)|:\begin{itemize}
|
||||
\item \texttt{MPI\_THREAD\_SINGLE}: es existiert pro Prozess nur ein einzelner Thread
|
||||
\item \texttt{MPI\_THREAD\_FUNNELED}: mehrere Threads können pro Prozess existieren, aber nur einer tätigt MPI-Aufrufe
|
||||
\item \texttt{MPI\_THREAD\_SERIALIZED}: mehrere Threads können pro Prozess existieren, aber nur einer tätig MPI-Aufrufe gleichzeitig
|
||||
\item \texttt{MPI\_THREAD\_MULTIPLE}: mehrere Threads können gleichzeitig MPI-Aufrufe tätigen
|
||||
\end{itemize}
|
||||
\end{itemize}
|
||||
|
||||
\subsubsection{Implementierung}
|
||||
\begin{itemize}
|
||||
\item Kommunikation über UNIX-Sockets (aber relativ teuer; besser: Userspace-Kommunikation)
|
||||
\item Verbindungsaufbau vollvermaschtes Netz von $n$ Nodes: Nodes $i+1$ bis $n$ verbinden sich mit Knoten $i$
|
||||
\item Header notwendig für Filterung und Allokation von Empfangspuffer: \begin{lstlisting}
|
||||
struct header {
|
||||
int num_bytes;
|
||||
int from;
|
||||
int to;
|
||||
int tag;
|
||||
char buffer[PAYLOAD_SMALL_SIZE];
|
||||
}
|
||||
\end{lstlisting}
|
||||
\item Versenden von Header und Payload mit \lstinline|int writev(int fd, iovec *iov, int iovcnt)|/\lstinline|int readv(int fd, iovec *iov, int iovcnt)|
|
||||
\item Empfangen von Nachrichten von mehreren Hosts gleichzeitig: \texttt{select}/\texttt{poll}/\texttt{epoll}
|
||||
\item Sperren mit Mutexen für Multithreading-Unterstützung beim Senden
|
||||
\item Synchronisierte Warteschlange für Multithreading-Unterstützung beim Empfangen
|
||||
\item zusätzliche Operation \texttt{probe} blockiert, bis Paket vorliegt
|
||||
\item Vermeidung von Kopieren großer Payloads durch Warten bis Empfänger bereit ist, dann ist keine Pufferung auf Empfängerseite notwendig: \texttt{sync\_send}
|
||||
\item Implementierung von Multi- und Broadcast durch Gruppen in IP-Netzen (Verwaltung durch IGMP) bei UDP
|
||||
\item kleine Payloads direkt in Header integrierbar
|
||||
\item Verwendung alternativer Protokolle statt TCP:\begin{itemize}
|
||||
\item UDP bringt performance-technisch Nachteile
|
||||
\item SCTP ab geringen Paketverlusten besser
|
||||
\end{itemize}
|
||||
\item optimierte Topologie für kollektive Operationen ausnutzen: \begin{itemize}
|
||||
\item jeder Knoten baut eigenen minimalen Spannbaum auf
|
||||
\item ringförmiges Weiterleiten der Puffer
|
||||
\item Broadcasts nur an Subnetze sowie einen Host in anderen Subnetzen für Weiterleitung
|
||||
\end{itemize}
|
||||
\end{itemize}
|
@ -38,7 +38,7 @@
|
||||
\tikzset{rectangle state/.style={draw,rectangle}}
|
||||
|
||||
\lstset{
|
||||
frame=tb,
|
||||
% frame=tb,
|
||||
language=C,
|
||||
basicstyle={\small\ttfamily},
|
||||
keywordstyle=\color{fau_blau}\bfseries,
|
||||
|
Loading…
Reference in New Issue
Block a user