From 3cb9ccf6cb2828a5e433262a6a74064f3ffe5657 Mon Sep 17 00:00:00 2001 From: Marco Ammon Date: Sat, 14 Sep 2019 20:28:43 +0200 Subject: [PATCH] MPI: restliche Folien --- 2-3-mpi.tex | 57 +++++++++++++++++++++++++++++++++++++++++++-- zusammenfassung.tex | 2 +- 2 files changed, 56 insertions(+), 3 deletions(-) diff --git a/2-3-mpi.tex b/2-3-mpi.tex index 5f663a5..b225ac5 100644 --- a/2-3-mpi.tex +++ b/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} \ No newline at end of file diff --git a/zusammenfassung.tex b/zusammenfassung.tex index 65e9897..c81cc85 100644 --- a/zusammenfassung.tex +++ b/zusammenfassung.tex @@ -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,