Introducing
Your new presentation assistant.
Refine, enhance, and tailor your content, source relevant images, and edit visuals quicker than ever before.
Trending searches
Dorr B. J., Lee J.-H., Lin D., Suh S. Efficient Parsing for Korean and English: A Parameterized Message Passing Approach. In Computational Linguistics, Vol. 21, Num. 2, MIT Press, Boston 1995.
Hennesey, J. L., Patterson, D. A. Computer Architecture, Fifth Edition: A Quantitative Approach. Morgan Kaufmann, Burlington 2011.
Lin, D., Goebel, R. Context-free Grammar Parsing by Message Passing. In Proceedings of PACLING-93. Vancouver, 1993.
MacKay, D. J.C. Information Theory, Inference, and Learning Algorithms. Campbridge University Press, Campbridge 2003.
Radenski, A. Shared Memory, Message Passing, and Hybrid Merge Sorts for Standalone and Clustered SMPs. PDPTA’11, the 2011 International Conference on Parallel and Distributed Processing Techniques and Applications. CSREA Press, Las Vegas 2011.
Rauber T, Günger G. Parallel Programming: for Multicore and Cluster Systems. Springer Berlin Heidelberg, 2010.
Rauber T, Günger G. Parallele Programmierung. Springer Berlin Heidelberg, 2012.
Rolfe, T. A Specimen of Parallel Programming: Parallel Merge Sort Implementation. In ACM Inroads, Vol. 1, Issue 4. ACM, New York 2012.
Ziel: für einen beliebigen Satz die syntaktische Struktur zu bilden
Seit 1997 ist eine zweite Version des MPI-Standards verfügbar, die einige Erweiterungen zu dem weiterhin bestehenden MPI-1.1 Standard hinzufügt. Zu diesen Erweiterungen gehören unter anderem
<N, O, T, s, P, L>:
N - Nichterminalsymbole
O - Pre-terminalsymbole (Wortarten); O ist eine Untermenge von N
T - Terminalsymbole; T ist disjunkt mit N
s - Startzustand
P - die Menge der Produktionen
L - Wörterbuch (w, p)
Was machen wir?
1. Wir bilden einen Graph.
Problem: Soldaten marschieren im Nebel. Wie kann der Kommandeur wissen, ob niemand verloren ist?
Schlechte Lösung: Jeder Soldat muss jede Minute schreien , dass er mitmarschiert.
Bessere Lösung: global function
2. Die Knoten unterhalten miteinander mit den Nachrichten
3. Für den Satz markieren wir, welche Position welches Wort besetzt.
Grammatik
Graph
Wie funktioniert es:
1. Die Nachrichten sind Intervalle, die von unten nach oben übergeben werden
2. Jeder Knoten sammelt die Paare <Nachricht, Label der Kante, mit der diese Nachricht angekommen ist>
3. Produktionsknoten können neue Paare aus zwei angekommenen Paaren <m, l> und <n, k> erzeugen, wenn:
4. Wenn Startsymbol das Intervall [0, n] bekommt, bedeutet das, das eine syntaktische Struktur für den Satz gefunden ist.
Beste Lösung: MPP. Alle Soldaten in Gruppen zu bilden. Dadurch entsteht ein Graph
wie die Nachrichten übergeben wurden
was am Ende bleibt
Sortieralgorithmen laufen schneller beim Benutzen von MPP
Es gibt 2 Punkte (A und B) auf der Ebene. Wie viele Wege von A nach B gibt es?
Viele klassische Sortieralgorithmen haben parallelisierte Version
Beispiel: Mergesort
Schlechte Lösung: alle Wege einfach zählen
Gute Lösung: Message-Passing. Schicke „1“ aus A. Wenn ein Knoten Nachrichten von allen seinen oberen und linken Nachbarn bekommt, dann schickt er die Summe von allen diesen Zahlen weiter unten und rechts.
Weitere Probleme, die man mit MPP lösen kann: Random path sampling, Finding the lowest-cost path
Es gibt auch besondere parallele Meggesort-Varianten, z.B. Odd-even Mergesort and Bitonic Mergesort. Die beiden haben die Komplexität O(log n).
2
Bibliotheken:
Programmiersprachen: C, C++, Fortran-77, Fortran-95
MPI_IDENT
MPI_SIMILAR
MPI_UNEQUAL
int MPI_Group_compare
MPI_IDENT
MPI_CONGRUENT
MPI_SIMILAR
MPI_UNEQUAL
int MPI_Group_size
int MPI_Group_rank
Das Duplizieren eines Kommunikators
int MPI_Comm_create
int MPI_Comm_size
int MPI_Comm_rank
int MPI_Comm_compare
int MPI_Comm_dup
int MPI_Comm_free
int MPI_Comm_split
int MPI_Group_excl
Erzeugung einer Untergruppe
Löschen der Prozesse
int MPI_Group_incl
erlauben die Ausführung von Punkt-zu-
Punkt-Kommunikation zwischen zwei Prozessgruppen
int MPI_Group_difference
erlauben die Ausführung beliebiger kollektiver Kommunikationsanweisungen auf einer Gruppe von Prozessen
int MPI_Group_intersection
inter
int MPI_Group_union
intra
Kommunikatoren
1. Message-Passing Programmierung (weiter MPP) ist eine Model die auf die Abstraktion von dem parallelen Rechnern basiert, wobei:
2. MPP wird mit einem Set von Prozessen realisiert.
Im sendbuf stellt jeder Prozess für jeden anderen Prozess einen Datenblock mit sendcount Elementen vom Typ sendtype zur Verfügung.
int MPI_Alltoall (void *sendbuf,
int sendcount,
MPI_Datatype sendtype,
void *recvbuf,
int recvcount,
MPI_Datatype recvtype,
MPI_Comm comm)
Bei einem Gesamtaustausch schickt jeder beteiligte Prozess an jeden anderen beteiligtem Prozess eine eventuell unterschiedliche Nachricht
Hier benutzt man dieselben Operationen, wie in Akkumulationsoperation
int MPI_Allreduce (void *sendbuf,
void *recvbuf,
int count,
MPI_Datatype type,
MPI_Op op,
MPI_Comm comm).
Bei einer Multi-Akkumulationsoperation führt jeder beteiligte Prozess eine (Einzel-) Akkumulationsoperation aus, wobei für jede dieser Akkumulationsoperationen von jedem Prozess unterschiedliche Daten zur Verfügung gestellt werden.
Totaler Austausch
int MPI_Allgather (void *sendbuf,
int sendcount,
MPI_Datatype sendtype,
void *recvbuf,
int recvcount,
MPI_Datatype recvtype,
MPI_Comm comm).
Multi-Akkumulationsoperation
Durch Ausführen der Multi-Broadcastingoperation werden die Daten aller beteiligten Prozesse aufgesammelt und jedem der Prozesse zur Verfügung gestellt.
Es gibt keinen Wurzelprozess.
int MPI_Gather (void *sendbuf,
int sendcount,
MPI_Datatype sendtype,
void *recvbuf,
int recvcount,
MPI_Datatype recvtype,
int root,
MPI_Comm comm)
int MPI_Scatter (void *sendbuf,
int sendcount,
MPI_Datatype sendtype,
void *recvbuf,
int recvcount,
MPI_Datatype recvtype,
int root,
MPI_Comm comm)
die Anzahl der Elemente, die Wurzelprozess von jedem Sender empfängt
die Anzahl der Elemente von jedem Sender
Multi-Broadcastoperation
Bei einer Gatheroperation stellt jeder an der Operation beteiligte Prozess Daten zur Verfügung, die (ohne Anwendung einer Reduktionsoperation) am angegebenen Wurzelprozess aufgesammelt werden
Bei einer Scatteroperation stellt ein Wurzelprozess für jeden an der Operation beteiligten Prozess eventuell unterschiedliche Daten zur Verfügung, die durch Ausführen der Operation an die beteiligten Prozesse verteilt werden.
int MPI_Reduce (void *sendbuf,
void *recvbuf,
int count,
MPI_Datatype type,
MPI_Op op,
int root,
MPI_Comm comm)
MPI_MAX Maximum
MPI_MIN Minimum
MPI_SUM Summe
MPI_PROD Produkt
MPI_LAND logisches Und
MPI_BAND bitweises Und
MPI_LOR logisches Oder
MPI_BOR bitweises Oder
MPI_LXOR logisches exklusives Oder
MPI_BXOR bitweises exklusives Oder
MPI_MAXLOC maximaler Wert und dessen Index
MPI_MINLOC minimaler Wert und dessen Index
Gatheroperation
Scatteroperation
Akkumulationsoperation stellt jeder beteiligte Prozess Daten zur Verfügung, die mit Hilfe der angegebenen binären Operation verknüpft werden. Das Ergebnis wird von einem ausgezeichneten Wurzelprozess aufgesammelt.
die Anzahl der Nachrichten
Akkumulationsoperation
Bei einer Broadcastoperation schickt ein ausgewählter Prozess die gleichen Daten an alle anderen Prozesse einer Gruppe.
int MPI_Bcast (void *message,
int count,
MPI_Datatype type,
int root,
MPI_Comm comm)
a
Broadcastoperation
Eine globale Kommunikationsoperation ist eine Kommunikationsoperation, an der alle Prozesse eines parallelen Programms bzw. einer Teilmenge oder Gruppe dieser Prozesse beteiligt sind.
Es gibt blockierende und nichtblockierende Versionen von den globalen Kommunikationsoperationen.
Alle Kommunikationsoperationen werden in MPI mit Hilfe von Kommunikatoren verschickt, wobei ein Kommunikator eine Menge von Prozessen . Diese Menge von Prozessen heißt Kommunikationsgebiet.
MPI_COMM_WORLD ist Kommunikator, der by default benutzt wird.
Aber man kann neue Kommunikatoren für die bestimmten Untermengen von den Prozessen erzeugen.
Puffermodus: der Sender wartet nicht auf den Start der zugehörigen Empfangsoperation. Wenn die zugehörige Empfangsoperation noch nicht gestartet wurde, muss das Laufzeitsystem die Nachricht in Puffern ablegen
Evgeny Fedko (evgfedko@yandex.ru)
Alexandra Faynveyts (fainalex@yandex.ru)
Synchroner Modus: eine Sendeoperation beendet erst dann, wenn die zugehörige Empfangsoperation gestartet und mit dem Empfang von Daten begonnen wurde
Standardmodus: das Laufzeitsystem bestimmt, ob Nachrichten in Systempuffern zwischengespeichert werden oder ob sie direkt dem Empfänger zugestellt werden
bestimmen Koordination der Sende- und Empfangsoperationen.
Proseminar "Parallele Programmierung"
Jeder Prozess, der an der Kommunikation teilnimmt, hat seinen einzigartigen Rang (die Nummer). Die Range sind von 0 bis n-1 numeriert, wobei n die Anzahl der Prozesse ist.
Jede Nachricht hat einen Tag. Der Tag hilft dem Empfänger, die verschiedenen Nachrichten von demselben Sender zu unterscheiden.
int MPI_Irecv (void *buffer,
int count,
MPI_Datatype type,
int source,
int tag,
MPI_Comm comm,
MPI_Request *request).
der zusätzliche Parameter bezeichnet eine für den Programmierer nicht direkt zugreifbare Datenstruktur
Eine nichtblockierende Empfangsoperation startet eine Empfangsoperation, bringt diese aber nicht zum Abschluss, sondern informiert das Laufzeitsystem darüber, dass Daten im Empfangspuffer abgelegt werden können.
ein Empfangsprozess (Empfänger)
Empfangspuffer
maximale Anzahl der Elemente
der Rang des Prozesses, von dem die Nachricht empfangen werden soll
der Status
enthält folgende Information:
Die einfachste Form des Datenaustausches zwischen Prozessen ist ein Einzeltransfer (Punkt-zu-Punkt-Kommunikation), da genau zwei Prozesse beteiligt sind:
int MPI_Recv(void *rmessage,
int count,
MPI_Datatype datatype,
int source,
int tag,
MPI_Comm comm,
MPI_Status *status)
Typ der zu empfangenden Elemente
int MPI_Isend (void *buffer,
int count,
MPI_Datatype type,
int dest,
int tag,
MPI_Comm comm,
MPI_Request *request)
flag=true, wenn die von request bezeichnete Operation beendet ist
Die Funktion MPI_Wait blockiert den ausführenden Prozess, bis die von request bezeichnete Operation vollständig beendet ist.
MPI_CHAR signed char
MPI_SHORT signed short int
MPI_INT signed int
MPI_LONG signed long int
MPI_UNSIGNED_CHAR unsigned char
MPI_UNSIGNED_SHORT unsigned short int
MPI_UNSIGNED unsigned int
MPI_UNSIGNED_LONG unsigned long int
MPI_FLOAT float
MPI_DOUBLE double
MPI_LONG_DOUBLE long double
MPI_PACKED
MPI_BYTE
int MPI_Wait (MPI_Request *request,
MPI_Status *status)
ein Sendeprozess (Sender)
int MPI_Test (MPI_Request *request,
int *flag,
MPI_Status *status).
Mit Hilfe von MPI_Test kann es überprüft werden, ob eine gestartete nichtblockierende Operation bereits abgeschlossen ist bzw. die den ausführenden Prozess blockieren, bis die entsprechende Operation beendet ist.
der Typ der Elemente
Anzahl der zu sendenden Elemente
Sendepuffer
der Kommunikator
der Rang des Zielprozesses
der Tag
int MPI_Send (void *smessage,
int count,
MPI_Datatype datatype,
int dest,
int tag,
MPI_Comm comm)
Eine nichtblockierende Sendeoperation startet den Sendevorgang ohne sicherzustellen, dass nach Abschluss der Operation die Nachricht aus dem Sendepuffer kopiert wurde.
Die Daten werden aus dem Sendepuffer smessage in einen Systempuffer kopiert. Ein Kopf (header) hinzugefügt wird, der Informationen über den Sender der Nachricht, den Zielprozess, die Markierung und den Kommunikator enthält.
Die Daten werden über das Netzwerk des Parallelrechners vom Sender zum Empfänger geschickt.
Die Daten werden vom Empfänger dest aus dem Systempuffer, in dem die Nachricht empfangen wurde, in den angegebenen Empfangspuffer kopiert.
die maximale Anzahl der zu empfangenden Elemente
der Rang des Empfängers
der Rang des Senders
sendbuf und recvbuf sollen disjunkt sein, aber können verschiedene Länge haben.
Die Daten von verschiedenen Typen können geschickt und empfangen werden.
Intialisierung ist notwendig
int MPI_Sendrecv (void *sendbuf,
int sendcount,
MPI_Datatype sendtype,
int dest,
int sendtag,
void *recvbuf,
int recvcount,
MPI_Datatype recvtype,
int source,
int recvtag,
MPI_Comm comm,
MPI_Status *status)
MPI_Send und MPI_Recv sind beide blockierend und asynchron
Finalisierung ist auch notwendig
Ein MPI-Programm wird als sicher (engl. secure) bezeichnet, wenn seine Korrektheit nicht auf Annahmen über das Vorhandensein von Systempuffern oder die Größe von Systempuffern beruht, d. h. sichere MPI-Programme werden auch ohne Systempuffer korrekt ausgeführt.
Das Auftreten eines Deadlocks kann auch davon abhängen, ob die Implementierung des Laufzeitsystems von MPI einen Systempuffer benutzt