Präsentation herunterladen
Die Präsentation wird geladen. Bitte warten
Veröffentlicht von:Immanuel Laufenberg Geändert vor über 9 Jahren
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<nin-np+1: Sende i + np-1 nach iw Sonst: Sende -1 nach iw Programmierung von Parallelrechnern: Übungen II10 Modifiziertes Verarbeitungsmodell Verteile die Berechnung der nin Integrale auf nproc Tasks
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 )
Ähnliche Präsentationen
© 2024 SlidePlayer.org Inc.
All rights reserved.