360 likes | 505 Views
Programmierung von Parallelrechnern. C. Boehme, O. Haan, U. Schwardmann GWDG. Übungen II. Beispiele. Berechnung von p durch numerische Integration Raleigh - Ritz - Methode Spaltenblock -Verteilung Reihenblock - Verteilung 2-dim Wärmeleitungsgleichung. Berechnung von p.
E N D
Programmierung von Parallelrechnern C. Boehme, O. Haan, U. Schwardmann GWDG Übungen II
Beispiele • Berechnung von p durch numerische Integration • Raleigh - Ritz - Methode • Spaltenblock -Verteilung • Reihenblock - Verteilung • 2-dim Wärmeleitungsgleichung Programmierung von Parallelrechnern: Übungen II
Berechnung von p Inhalt des Kreissegmentes = p / 4 Programmierung von Parallelrechnern: Übungen II
Numerische Integration Das Programm numint in pi.f (pi.py) berechnet diese Summe Programmierung von Parallelrechnern: Übungen II
Aufgabe 1 Verteile die Berechnung der Summe auf nproc Tasks p0 p1 p2 p3 pi_mpi.fpi_mpi.py Programmierung von Parallelrechnern: Übungen II
Numerische Integration mit vorgegebener Genauigkeit Das Programm numintprec in pi_p.f (pi_p.py) berechnet die Summe mit vorgegebener Genauigkeit Programmierung von Parallelrechnern: Übungen II
Numerische Integration mit vorgegebener Genauigkeit Unterteilung des Integrationsgebietesin nin Intervalle, jedes Intervall mit eigenem D zur Erzielung der vorgegebenen Genauigkeit b a Programmierung von Parallelrechnern: Übungen II
Verarbeitungsmodell Farmer-Worker Verteile die Berechnung der nin Integrale auf nproc Tasks Farmer: me = 0 tres = 0 Schleife über nin Intervalle i Empfange res von anytask tres = tres + res ipw = status(mpi_source) Sende i nach ipw Schleife über np-1 Worker ipw Sende -1 nach ipw • Worker: me > 0 • res = 0 • Sende res nach 0 • Schleife über nin Iterationen • Empfange i von 0 • Wenn i <0 fertig • res = work(i) • sende res nach 0 pi_p_mpi.fpi_p_mpi.py Programmierung von Parallelrechnern: Übungen II
Aufgabe 2 Modifiziere das Verarbeitungsmodell! Programmierung von Parallelrechnern: Übungen II
Modifiziertes Verarbeitungsmodell Verteile die Berechnung der nin Integrale auf nproc Tasks Farmer: me = 0 tres = 0 Schleife über np-1 Worker iw: Sende iw nach iw Schleife über nin Intervalle i Empfange res von anytask tres = tres + res iw = status(mpi_source) Wenn i<nin-np+1: Sende i + np-1 nach iw Sonst: Sende -1 nach iw Worker: me > 0 Schleife über nin+np Empfange i von 0 Wenn i <0 fertig res = work(i) sende res nach 0 Programmierung von Parallelrechnern: Übungen II
Raleigh - Ritz - Methode Eigenwertproblem : Sei Programmierung von Parallelrechnern: Übungen II
Algorithmus Raleigh - Ritz Sequentielles Fortran Programm Sequentielles python Programm Programmierung von Parallelrechnern: Übungen II
Parallele Matrix-Vektor Multiplikation Verteilung in Spaltenblöcken Programmierung von Parallelrechnern: Übungen II
Parallele Matrix-Vektor Multiplikation Spaltenblock-Verteilung Lokale Teilergebnisse Globale Summierung Programmierung von Parallelrechnern: Übungen II
Programm ritz_dist_col ritz_dist_col dist_index dist_matrix_colblock (fortranpython) DGEMV collect_vector (fortranpython) MPI_BCAST Paralleler Raley-Ritz Algorithmus mit Spaltenblock-Verteilung Ser Eingabe: Matrixdimension n Ser Initialisierung von A Par Verteilung von A nach Al Par Startwert von xl Schleife Par yt = Al * xl Par globale Summe yl Ser l = yl(1) Par verteile l Par xl = 1/l * yl Programmierung von Parallelrechnern: Übungen II
Globale Summierung I : MPI_REDUCE Programm in reduce_vector.f reduce_vector.py Programmierung von Parallelrechnern: Übungen II
Aufgabe 1: MPI_REDUCE_SCATTER • Modifikation von collect-vector mit MPI_REDUCE_SCATTER • Syntax : MPI_Reduce_scatter(sendbuf, recvbuf, recvcounts, datatype, operation, comm) • n=firstind(nproc) Elemente in sendbuf werden mit MPI_SUM über alle Prozesse summiert. • recvcounts(ip) Elemente werden nach Prozess ip gescattert Programmierung von Parallelrechnern: Übungen II
Globale Summierung II : Sammeln Programm in collect_vector.f Programmierung von Parallelrechnern: Übungen II
Aufgabe 2: • Modifikation von collect-vector: Sammeln • (Dateien in Uebungen/Ritz) Programmierung von Parallelrechnern: Übungen II
Send-Receive Bei blockierendem Senden Deadlockgefahr! SENDRECV vermeidet Deadlock Programmierung von Parallelrechnern: Übungen II
Parallele Matrix-Vektor Multiplikation Verteilung in Zeilenblöcken Programmierung von Parallelrechnern: Übungen II
Parallele Matrix-Vektor Multiplikation Zeilenblock-Verteilung Bereitstellung des globalen Vektors Lokale Ergebnisse Programmierung von Parallelrechnern: Übungen II
Programm ritz_dist_row Paralleler Raley-Ritz Algorithmus mit Zeilenblock-Verteilung Ser Eingabe: Matrixdimension n Ser Initialisierung von A Par Verteilung von A nach Al Par Startwert von xl Schleife Par globaler Vektor xt Par yl = Al * xt Ser l= yl(1) Par verteile l Par xl = 1/l * yl ritz_dist_row dist_index dist_matrix_rowblock (fortranpython) global_vector (fortranpython) DGEMV MPI_BCAST Programmierung von Parallelrechnern: Übungen II
Abgeleitete Datentypen für die Verteilung der globalen Matrix a MPI_Type_vector(count, blocklen, stride, oldtype, newtype) z.B. ml x n Zeilenblock einer m x n Matrix: n count = nblocklen = mlstride = m ml m Programmierung von Parallelrechnern: Übungen II
Aufgabe: Benutze Type_vector zur Verteilung von a • Modifiziere dist_matrix_rowblock • Definition eines neuen Typs rowblock mit MPI_TYPE_VECTOR • Aktivieren des Typs mit MPI_TYPE_COMMIT(rowblock,ierrr) • Senden mitMPI_SEND(a[ia],1,rowblock,ip,0, MPI_COMM_WORLD,ierr) • Deaktivieren des Typs mitMPI_TYPE_FREE(rowblock,ierr) Programmierung von Parallelrechnern: Übungen II
Aufgabe 2: global_vector • Modifikation von global_vector mit MPI_ALLGATHERSyntax:MPI_ALLGATHERV(sendbuf, sendcount, sendtype, recvbuf, recvcounts, displs, recvtype, comm, ierr) do ip = 0 , nproc -1 recvcounts(ip) = firstind(ip+1) – firstind(ip) displs(ip) = firstind(ip) – 1 end do • (Dateien in Uebungen/Ritz) Programmierung von Parallelrechnern: Übungen II
Aufgabe 2a: global_vector • Modifikation von global_vector mit MPI_SENDRECV Programmierung von Parallelrechnern: Übungen II
Wärmeleitungsgleichung Programmierung von Parallelrechnern: Übungen II
Finite-Differenzen Gitter Programmierung von Parallelrechnern: Übungen II
Algorithmus Wärmeleitung Waermeleitung (fortranpython) initialisierung Zeitschritt (fortranpython) norm kopie Programmierung von Parallelrechnern: Übungen II
Partitionierung mit Randaustausch Programmierung von Parallelrechnern: Übungen II
Algorithmus Wärmeleitung - parallel Waermeleitung_mpi (fortranpython) Initialisierung_mpi Randaustausch(fortranpython) zeitschritt norm kopie Programmierung von Parallelrechnern: Übungen II
Randaustausch Mit MPI_SENDRECV: Jeder Prozessor sendet 1. Spalte nach links, empfängt Werte für 0. Spalte von links, Jeder Prozessor sendet n2l. Spalte nach rechts, empfängt Werte für n2l+1. Spalte von rechts. Randspalten werden mit Prozessor MPI_PROC_NULL ausgetauscht! subroutine randaustausch (fortranpython) Programmierung von Parallelrechnern: Übungen II
Skalierungsanalyse Programmierung von Parallelrechnern: Übungen II
2-dimensionale Verteilung Programmierung von Parallelrechnern: Übungen II
Aufgabe 3: Wärmeleitungsgleichung mit 2-dim. Verteilung Modifikation gegenüber 1-dim Verteilung: Eingabe von nq1,nq2 Überprüfen, ob nq1*nq2 gleich nproc Generieren der Blockgrößen n1l,n2l Abbildung myid->(myid1,myid2) Initialisierung der lokalen Blöcke Randaustausch bei 2-dim Verteilung (Dateien in Uebungen/Waermeleitung) Programmierung von Parallelrechnern: Übungen II