Zaawansowane metody obliczeń numerycznych 1
Zaawansowane? Algorytmy (skuteczniejsze) Dokładność obliczeń! Szybkość obliczeń Obliczenia równoległe Paradygmaty programowania Języki programowania Biblioteki Narzędzia programisty Elementy teorii obliczeń 2
przykłady Mnożenie macierzy A 1 A 2 A n- 1 A n Numeryczne obliczanie pochodnych, całek. Metoda Richardsona. Obliczanie pi na p procesorach. Fortran, java, prolog, haskel, Typy definiowane, parametryzowane BLAS, Lapack, BLACS, MKL, itd. make, gawk, sed, emacs Problem stopu. Maszyna Turinga. Rozstrzygalność. 3
Pseudokod mnożenia C <- A B Koszt mnożenia 2 macierzy. (Cormen, Leiserson, Rivest) MATRIX-MULTIPLY(A, B) 1 if columns[a] rows[b] 2 then error "incompatible dimensions" 3 else for i 1 to rows[a] 4 do for j 1 to columns[b] 5 do C[i, j] 0 6 for k 1 to columns[a] 7 do C[i, j] C[i, j] + A[i, k] B[k, j] 8 return C KOSZT: ~ pqr 4
A 1 (300,10)A 2 (10,300)A 3 (300,10) [A 1 (300, 10) x A 2 (10, 300)] x A 3 (300, 10) => 300*10*300 + 300*300*10 = 1 800 000 A 1 (300, 10) x [A 2 (10, 300) x A 3 (300, 10)] 10*300*10 + 300*10*10 = 600 1800000/600 = 3000 razy! 5
A 1 A 2 A 3 A 4 A 5 6
A 1 A 2 A 3 A 4 A 5 7
A 1 A 2 A 3 A 4 A 5 (*) 8
Pseudokod MATRIX- CHAIN- ORDER(p) 1 n length[p] - 1 2 for i 1 to n 3 do m[i, i] 0 4 for l 2 to n l is the chain length. 5 do for i 1 to n - l + 1 6 do j i + l - 1 7 m[i, j] 8 for k i to j - 1 9 do q m[i, k] + m[k + 1, j] + pi-1 pkpj 10 if q < m[i, j] 11 then m[i, j] q 12 s[i, j] k 13 return m and s MATRIX- CHAIN- ORDER determines the opomal number of scalar muloplicaoons needed to compute a matrix- chain product. 9
MATRIX- CHAIN- ORDER The algorithm first computes m[i, i] 0 for i = 1, 2,..., n (the minimum costs for chains of length 1) in lines 2-3. It then uses recurrence (*) to compute m[i, i +1] for i = 1, 2,..., n - 1 (the minimum costs for chains of length l = 2) during the first execuoon of the loop in lines 4-12. The second ome through the loop, it computes m[i, i + 2] for i = 1, 2,..., n - 2 (the minimum costs for chains of length l = 3), and so forth. At each step, the m[i, j] cost computed in lines 9-12 depends only on table entries m[i, k] and m[k + 1, j] already computed. 10
Pseudokod PRINT-OPTIMAL-PARENS(s, i, j) 1 if i = j 2 then print "A"i 3 else print "(" 4 PRINT-OPTIMAL-PARENS(s, i, s[i, j]) 5 PRINT-OPTIMAL-PARENS(s, s[i, j] + 1, j) 6 print ")" 11
Construcong an opomal soluoon Although MATRIX- CHAIN- ORDER determines the opomal number of scalar muloplicaoons needed to compute a matrix- chain product, it does not directly show how to muloply the matrices. It is not difficult to construct an opomal soluoon from the computed informaoon stored in the table s[1 n, 1 n]. Each entry s[i, j] records the value of k such that the opomal parenthesizaoon of Ai Ai+1 Aj splits the product between Ak and Ak+1. Thus, we know that the final matrix muloplicaoon in compuong A1 n opomally is A1 s[1,n] As[1,n]+1 n. The earlier matrix muloplicaoons can be computed recursively, since s[1, s[1, n]] determines the last matrix muloplicaoon in compuong A1 s[1,n], and s[s[1, n] + 1, n] determines the last matrix muloplicaoon in compuong As[1,n]+1 n. The following recursive procedure prints an opomal parenthesizaoon of Ai, Ai+1,..., Aj, given the s table computed by MATRIX- CHAIN- ORDER and the indices i and j. The inioal call PRINTOPTIMAL- PARENS(s, 1, n) prints an opomal parenthesizaoon of A1, A2,..., An. 12
Zadania (Cormen,,15.2.1, 15.2.2) Find an opomal parenthesizaoon of a matrix- chain product whose sequence of dimensions is 5, 10, 3, 12, 5, 50, 6. Give a recursive algorithm MATRIX- CHAIN- MULTIPLY(A, s, i, j) that actuallyperforms the opomal matrix- chain muloplicaoon, given the sequence of matrices A1, A2,..., An, the s table computed by MATRIX- CHAIN- ORDER, and theindices i and j. (The inioal call would be MATRIX- CHAIN- MULTIPLY(A, s, 1, n).) 13
Podział Przetwarzanie Komputer Von Neumanna RAM < - - > CPU < - - > I/O Potokowe, wektorowe RAM + wiele instrukcji jednocześnie < - - > CPU < - - > I/O Równoległe RAM + wiele zadań < - - > wiele PU < - - > I/O Architektura komputerów Zadaniowość 14
OBLICZENIA RÓWNOLEGŁE 15
Zadania SISD SIMD MISD MIMD S = single, I = instrucoon(s), M = mulo, D = data (rysunki: h ps://compuong.llnl.gov/tutorials/parallel_comp/#abstract) 16
SISD 17
SIMD 18
MISD 19
MIMD 20
Pamięć Wiele procesorów Pamięć współdzielona, dzielona, wspólna (shared) (openmp) Pamięć rozproszona, prywatna (Message Passing Interface = MPI) Mieszanina powyższych 21
Prawo Amdahl a Przyspieszenie obliczeń równoległych S (p = liczba procesorów, s = ułamek procesów sekwencyjnych, r = ułamek procesów równoległych) S = t seq /t par = (s + r)/[s + r/p] = 1/[s + (1 - s)/p] - - - - > 1/s, p - - > nsk. Wydajność (efficiency) procesora P.E. = S/p. P.E. = 1/[p s + (1 - s)] 22
Prawo Amdahl a - przyspieszenie S s = 0.01 przyspieszenie 80 60 40 s = 0.02 20 200 400 600 800 1000 n s = 0.10 liczba PU 23
Paradygmaty programowania równoległego Macro pipelining. Przykład. Strumień zadań PU PU PU FFT Praca IFFT ze współczynnikami Fouriera 24
dodawanie Policzyć a[i] = a[i] + a[(i- 1 MOD n) + 2], gdzie i=1,,n, a(i) =i. (Inaczej: Dodać przesunięte cyklicznie o 1 w lewo elementy macierzy a do a) 1. Wektorowo (f90) Integer, parameter :: n=100 Integer, dimension(n) :: a, aright Do i=1, n a(i) = i End Do aright = cshift(a, shift=-1, dim=1) a = a + aright! Wektorowe dodawanie 25
dodawanie 2. Równolegle (f90 + ~mpi). (Można inaczej) Integer, parameter :: n=100 Integer :: VecElem, RVecElem Integer :: MyNode, RNode, LNode MyNode = whoami() + 1! Numery procesów startują z 0 VecElem = MyNode RNode = Mod(MyNode+1,n)+1! Nie: Rnode = MyNode+1 LNode = Mod(MyNode-1+n,n)+1! Nie: Lnode = MyNode-1 Call SentAndGet(VecElem, Lnode, RVecElem, RNode) VecElem = VecElem + RVecElem! Zbieranie wyników 26
Zadania Zadanie. Zapisać poprzedni program w języku C lub C++. Podzielić pracę nad problemem Isinga z Hamiltonianem H = K Σ i,j s i.s j. Każdy spin s i oddziałuje z bezpośrednimi sąsiadami) na sieci 2D o W węzłach i topologii torusa, na p procesorów? Wykonać odpowiedni rysunek. 27
A teraz PRZYKŁADY 28
Maszyny wektorowe (pipelining) a(i- 1), b(i- 1) CPU a(i), b(i) a(i+1), b(i+1) a(i+2), b(i+2) a(i+3), b(i+3) a(i+3), b(i+3) POTOK DANYCH Justuje format Dodaje mantysy Wyrównuje potęgi Porównuje potęgi OPERACJA 1.013 x 10 4 - > 0.1013 x 10 3 - > 1.013 x 10 4 0.92 x 10 3 + 0.093 x 10 4 0.92 x 10 4 + 0.93 x 10 3 PRZYKŁAD For i=1 to N do c(i) = a(i) + b(i) End do 29
Hello (MPI) program hello include 'mpif.h' integer rank, size, ierror, tag, status(mpi_status_size) character(12) message call MPI_INIT(ierror) call MPI_COMM_SIZE(MPI_COMM_WORLD, size, ierror) call MPI_COMM_RANK(MPI_COMM_WORLD, rank, ierror) tag = 100 if (rank.eq. 0) then message = 'Hello, world' do i=1, size-1 call MPI_SEND(message, 12, MPI_CHARACTER, i, tag, & MPI_COMM_WORLD, ierror) enddo else call MPI_RECV(message, 12, MPI_CHARACTER, 0, tag, & MPI_COMM_WORLD, status, ierror) endif print*, 'node', rank, ':', message call MPI_FINALIZE(ierror) end program hello 30
π (MPI) Wyliczyć wartość π według formuły: π = 1 0 π 4 1+ x 2 dx 31
32
33
34
Zadanie Napisz program obliczeń równoległych pi (lub szkic programu w języku ludzkim), wykorzystując generator liczb losowych o nazwie Rand(). Oblicz pi (równolegle),używając Rand() i biorąc pod uwagę stosunek pól kwadratu o boku 1 i okręgu o promieniu 1. Patrz: h ps://pl.wikipedia.org/wiki/igła_buffona h p://mathworld.wolfram.com/buffonsneedleproblem.html 35
Macierze (MPI) 1 n 1 n i,j! Sekwencyjny (1 proces) do j = 1, n do i = 1,n a(i,j) = FUNC(i,j) end do end do FUNCTION FUNC(I,J)! Coś robimy z a(i,j) END 36
Macierze mystart myend! Równoległy (4 procesy) do j = mystart, myend do i = 1,n a(i,j) = FUNC(i,j) end do end do FUNCTION FUNC(I,J)! Coś robimy z a(i,j) END 37
Skurczowy algorytm MD MD = molecular dynamics Zespół n (>>1) oddziałujących czastek. Siła F i działa na cząstkę i- tą. Równania ruchu d 2 r i (t)/dt 2 = F i (R)/m i, gdzie r, R, F wektory Znaleźć charakterystyki fizyczne układu. (algorytm skurczowy - - > systolic algorithm) 38
Skurczowy algorytm MD Lat Lat Lat Lat Lat lok lok lok lok lok Węzeł: 1 2 3 P- 1 p lok = cząstki przydzielone do węzłą Lat = cząstki wędrujące p = liczba węzłów 39
Skurczowy algorytm MD ROUTINE NodeStep REPEAT Calculate forces on local parts Perform leap- frog step for local part UNTIL Program stops End Rouone NodeStep ROUTINE Calculate forces on local parts Calculate contribuoons from local parts Copy local parocles from right neighbour and load into traveling parocles DO K=1, p- 1 Send traveling parocles to the leš (modulo PBC) Receive data from right neighbour and load into traveling parocles Calculate contribuoons to local forces from traveling parocles END DO END ROUTINE Calculate forces on local parts 40
Model obliczeń typu master- slave Proces master rozdziela zadania, rejestruje wyniki pracy procesów slave Zadania wykonywane przez procesy slave mogą być różne (instrukcje 41
PROGRAM MASTER_WORKER USE MPI C PARAMETER (NJOBMX=10) INTEGER istatus(mpi_status_size) C CALL MPI_INIT(ierr) CALL MPI_COMM_SIZE(MPI_COMM_WORLD,nprocs,ierr) CALL MPI_COMM_RANK(MPI_COMM_WORLD,myrank,ierr) C IF (myrank.eq.0) THEN C C======= MASTER PART C THE MASTER RECIVES THE MASAGES FROM WORKERS AND IF SOME WORKER C IS IDLE IT SENDS TO IT A JOB NUMBER. THE WORKER REALIZES THIS C JOB AND SENDS THE MASSAGE AGAIN TO THE MASTER. IF ALL JOBS ARE C PROCESSED THEN IF THE WORKER HAS FINISHED THE MASTER SENDS THE C TERM SIGNAL (JOB=-1) TO THE WORKER AND THE WORKER EXITS. C (SEE: WORKER.F) C itag=1 C DO job=1,njobmx CALL MPI_RECV(iwk, 1, MPI_INTEGER, MPI_ANY_SOURCE, & itag, MPI_COMM_WORLD, istatus, ierr) idest=istatus(mpi_source) CALL MPI_SEND(job, 1, MPI_INTEGER, idest, & itag, MPI_COMM_WORLD, ierr) END DO C C.. FINISH.. DO i=1,nprocs-1 CALL MPI_RECV(iwk, 1, MPI_INTEGER, MPI_ANY_SOURCE, & itag, MPI_COMM_WORLD, istatus, ierr) idest=istatus(mpi_source) CALL MPI_SEND(-1, 1, MPI_INTEGER, idest, & itag, MPI_COMM_WORLD, ierr) END DO C ELSE C C======= WORKER PART C THE WORKER SENDS THE SIGNAL TO THE MASTER MEANING IT IS IDLE. C IF THERE ARE JOBS TO PROCESS THEN THE MASTER SENDS TO THE c WORKER THE JOB NUMBER (NJOB) AND THE WORKER PROCESSES THE JOB. C IF THERE ARE NO OTHER JOBS THE NUMBER NJOB SENT TO THE WORKER C IS EQUAL TO -1 AND AFTER RECIVING IT THE WORKER EXITS. C itag=1 iwk=0 C DO CALL MPI_SEND(iwk, 1, MPI_INTEGER, 0, & itag, MPI_COMM_WORLD, ierr)
C C C C C C C & CALL MPI_RECV(job, 1, MPI_INTEGER, 0, itag, MPI_COMM_WORLD, istatus, ierr) IF (job.eq. -1) EXIT CALL WORK(job) END DO END IF CALL MPI_FINALIZE(ierr) END SUBROUTINE WORK(JOB) Here one calculates everything for JOB RETURN END
Problem z fizyki fazy stałej (MC = Monte Carlo) Z tw. Blocha wynika, że równanie Schroedingera dla poszczególnych wektorów Blocha k w strefie Brillouina można rozwiązać niezależnie. Jeśli znamy efektywny potencjał elektronu to master nakazuje niewolnikom zdiagonalizować Hamiltonian dla różnych wektorów k, które wcześniej je otrzymały, niezależnie. Po diagonalizacji niewolnik wysyła wyniki do mistrza, a ten, na ich podstawie oblicza np. gęstość ładunku Jeśli niewolników jest mniej niż wektorów k, to po skończeniu swoich obliczeń niewolnik dostaje nowe k i działa dalej. Po obliczeniu ostatniego k master liczy co potrzeba. 42
Literatura - Designing and Building Parallel Programs". Ian Foster. h p://www.mcs.anl.gov/~iœ/dbpp/ - Overview of Recent Supercomputers. A.J. van der Steen, Jack Dongarra. OverviewRecentSupercomputers.2008.pdf - Morten Hjorth- Jensen. COMPUTATIONAL PHYSICS. University of Oslo, Fall 2008. (Internet edioon) 43
Problemy? 44