Die Präsentation wird geladen. Bitte warten

Die Präsentation wird geladen. Bitte warten

C. Boehme, O. Haan, U. Schwardmann GWDG Übungen II Programmierung von Parallelrechnern.

Ähnliche Präsentationen


Präsentation zum Thema: "C. Boehme, O. Haan, U. Schwardmann GWDG Übungen II Programmierung von Parallelrechnern."—  Präsentation transkript:

1 C. Boehme, O. Haan, U. Schwardmann GWDG Übungen II Programmierung von Parallelrechnern

2 Programmierung von Parallelrechnern: Übungen II2 Beispiele Berechnung von  durch numerische Integration Raleigh - Ritz - Methode –Spaltenblock -Verteilung –Reihenblock - Verteilung 2-dim Wärmeleitungsgleichung

3 Programmierung von Parallelrechnern: Übungen II3 Berechnung von  Inhalt des Kreissegmentes =  / 4

4 Programmierung von Parallelrechnern: Übungen II4 Numerische Integration Das Programm numint in pi.f ( pi.py ) berechnet diese Summe pi.f pi.py

5 Programmierung von Parallelrechnern: Übungen II5 Aufgabe 1 Verteile die Berechnung der Summe auf nproc Tasks p0 p1 p2 p3 pi_mpi.fpi_mpi.f pi_mpi.pypi_mpi.py

6 Programmierung von Parallelrechnern: Übungen II6 Numerische Integration mit vorgegebener Genauigkeit Das Programm numintprec in pi_p.f ( pi_p.py ) berechnet die Summe mit vorgegebener Genauigkeit pi_p.f pi_p.py

7 Programmierung von Parallelrechnern: Übungen II7 Numerische Integration mit vorgegebener Genauigkeit Unterteilung des Integrationsgebietes in nin Intervalle, jedes Intervall mit eigenem  zur Erzielung der vorgegebenen Genauigkeit a b

8 Programmierung von Parallelrechnern: Übungen II8 Verarbeitungsmodell Farmer-Worker 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 Verteile die Berechnung der nin Integrale auf nproc Tasks pi_p_mpi.fpi_p_mpi.f pi_p_mpi.pypi_p_mpi.py

9 Programmierung von Parallelrechnern: Übungen II9 Aufgabe 2 Modifiziere das Verarbeitungsmodell!

10 Worker: me > 0 Schleife über nin+np Empfange i von 0 Wenn i <0 fertig res = work(i) sende res nach 0 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

11 Programmierung von Parallelrechnern: Übungen II11 Raleigh - Ritz - Methode Eigenwertproblem : Sei

12 Programmierung von Parallelrechnern: Übungen II12 Algorithmus Raleigh - Ritz Sequentielles Fortran Programm Sequentielles python Programm

13 Programmierung von Parallelrechnern: Übungen II13 Parallele Matrix-Vektor Multiplikation Verteilung in Spaltenblöcken

14 Programmierung von Parallelrechnern: Übungen II14 Parallele Matrix-Vektor Multiplikation Spaltenblock-Verteilung Lokale Teilergebnisse Globale Summierung

15 Programmierung von Parallelrechnern: Übungen II15 Programm ritz_dist_col 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  = yl(1) Par verteile Par xl = 1/  * yl ritz_dist_col dist_index dist_matrix_colblock (fortran python)fortranpython DGEMV collect_vector (fortran python)fortranpython MPI_BCAST

16 Programmierung von Parallelrechnern: Übungen II16 Globale Summierung I : MPI_REDUCE Programm in reduce_vector.f reduce_vector.f reduce_vector.py

17 Programmierung von Parallelrechnern: Übungen II17 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

18 Programmierung von Parallelrechnern: Übungen II18 Globale Summierung II : Sammeln Programm in collect_vector.fcollect_vector.f

19 Programmierung von Parallelrechnern: Übungen II19 Aufgabe 2: Modifikation von collect-vector: Sammeln (Dateien in Uebungen/Ritz )

20 Programmierung von Parallelrechnern: Übungen II20 Send-Receive Bei blockierendem Senden Deadlockgefahr! SENDRECV vermeidet Deadlock

21 Programmierung von Parallelrechnern: Übungen II21 Parallele Matrix-Vektor Multiplikation Verteilung in Zeilenblöcken

22 Programmierung von Parallelrechnern: Übungen II22 Parallele Matrix-Vektor Multiplikation Zeilenblock-Verteilung Bereitstellung des globalen Vektors Lokale Ergebnisse

23 Programmierung von Parallelrechnern: Übungen II23 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  = yl(1) Par verteile Par xl = 1/ * yl ritz_dist_row dist_index dist_matrix_rowblock (fortran python)fortranpython global_vector (fortran python)fortranpython DGEMV MPI_BCAST

24 Programmierung von Parallelrechnern: Übungen II24 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: m n ml count = n blocklen = ml stride = m

25 Programmierung von Parallelrechnern: Übungen II25 Aufgabe: Benutze Type_vector zur Verteilung von a Modifiziere dist_matrix_rowblock dist_matrix_rowblock 1.Definition eines neuen Typs rowblock mit MPI_TYPE_VECTOR 2.Aktivieren des Typs mit MPI_TYPE_COMMIT(rowblock,ierrr) 3.Senden mit MPI_SEND(a[ia],1,rowblock,ip,0, MPI_COMM_WORLD,ierr) 4.Deaktivieren des Typs mit MPI_TYPE_FREE(rowblock,ierr)

26 Programmierung von Parallelrechnern: Übungen II26 Aufgabe 2: global_vector Modifikation von global_vector mit MPI_ALLGATHER Syntax: 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 )

27 Programmierung von Parallelrechnern: Übungen II27 Aufgabe 2a: global_vector Modifikation von global_vector mit MPI_SENDRECV

28 Programmierung von Parallelrechnern: Übungen II28 Wärmeleitungsgleichung

29 Programmierung von Parallelrechnern: Übungen II29 Finite-Differenzen Gitter

30 Programmierung von Parallelrechnern: Übungen II30 Algorithmus Wärmeleitung Zeitschritt (fortran python)fortranpython initialisierung norm kopie Waermeleitung (fortran python)fortranpython

31 Programmierung von Parallelrechnern: Übungen II31 Partitionierung mit Randaustausch

32 Programmierung von Parallelrechnern: Übungen II32 Algorithmus Wärmeleitung - parallel zeitschritt Initialisierung_mpi norm kopie Waermeleitung_mpi (fortran python)fortranpython Randaustausch (fortran python)fortranpython

33 Programmierung von Parallelrechnern: Übungen II33 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 (fortran python)fortranpython

34 Programmierung von Parallelrechnern: Übungen II34 Skalierungsanalyse

35 Programmierung von Parallelrechnern: Übungen II35 2-dimensionale Verteilung

36 Programmierung von Parallelrechnern: Übungen II36 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 )


Herunterladen ppt "C. Boehme, O. Haan, U. Schwardmann GWDG Übungen II Programmierung von Parallelrechnern."

Ähnliche Präsentationen


Google-Anzeigen