From 65b8e4294d65420700b7cfad5b4b6259ebdf1d69 Mon Sep 17 00:00:00 2001 From: Anthony Scemama Date: Sun, 21 Nov 2021 16:12:12 +0100 Subject: [PATCH] MPI Fini --- deadlock.png | Bin 0 -> 13640 bytes parallelism_scemama.org | 255 ++++++++++++++++++++++++++++++++++++++-- pi_v1.png | Bin 0 -> 21961 bytes pi_v2.png | Bin 0 -> 27233 bytes 4 files changed, 246 insertions(+), 9 deletions(-) create mode 100644 deadlock.png create mode 100644 pi_v1.png create mode 100644 pi_v2.png diff --git a/deadlock.png b/deadlock.png new file mode 100644 index 0000000000000000000000000000000000000000..ae75653e06f6f7efe56adf42c941088172ac4a70 GIT binary patch literal 13640 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 RJ{pBkme-Igmw6EU-vAgWkaPe5 literal 0 HcmV?d00001 diff --git a/parallelism_scemama.org b/parallelism_scemama.org index a559ed2..d02c16f 100644 --- a/parallelism_scemama.org +++ b/parallelism_scemama.org @@ -1212,6 +1212,25 @@ $ python pi_server_python.py & - Receive: ~MPI_RECV(buffer, count, datatype, source, tag, communicator, status, ierror)~ + +** Synchronous or asynchronous? + + - ~MPI_Ssend~ :: Blocking synchronous send. Returns upon notification + that the message has been received (safe). + - ~MPI_Isend~ :: Non-blocking send. Returns immediately (dangerous). + - ~MPI_Send~ :: Returns when the send buffer is ready for + use. Non-deterministic: depends on MPI implementation, size of + the data, number of ranks, ... (dangerous) + + #+LATEX: \begin{alertblock}{Important} + - Writing the program and Debugging: + - /Always/ use ~MPI_Ssend~ + - Use ~MPI_Isend~ only when ~MPI_Ssend~ is irrelevant + - Once the code is well checked + - You can replace ~MPI_Ssend~ by ~MPI_Send~ as an optimization. + - If ~MPI_Send~ is still too slow, consider rewriting for ~MPI_Isend~ + #+LATEX: \end{alertblock} + ** Point-to-point communication (Python) #+begin_src python :tangle Codes/mpi_rank.py @@ -1225,7 +1244,7 @@ def main(): if rank == 0: data = 42 print("Before: Rank: %d Size: %d Data: %d"%(rank, size, data)) - comm.send(data, dest=1, tag=11) + comm.ssend(data, dest=1, tag=11) print("After : Rank: %d Size: %d Data: %d"%(rank, size, data)) elif rank == 1: data = 0 @@ -1278,7 +1297,7 @@ program test_rank if (rank == 0) then data = 42 print *, "Before: Rank:", rank, "Size:", size, "Data: ", data - call MPI_SEND(data, 1, MPI_INTEGER, 1, 11, MPI_COMM_WORLD, ierr) + call MPI_SSEND(data, 1, MPI_INTEGER, 1, 11, MPI_COMM_WORLD, ierr) print *, "After : Rank:", rank, "Size:", size, "Data: ", data else if (rank == 1) then @@ -1293,18 +1312,223 @@ program test_rank end program #+end_src +** Deadlocks + #+LATEX: \begin{columns} + #+LATEX: \begin{column}{0.3\textwidth} + #+ATTR_LATEX: :height 0.8 \textheight + [[./deadlock.png]] + #+LATEX: \end{column} + #+LATEX: \begin{column}{0.7\textwidth} + + #+LATEX: \begin{exampleblock}{Deadlock} + Each process waits for a message coming from another process + #+LATEX: \end{exampleblock} + + Example: round-robin + #+LATEX: \end{column} + #+LATEX: \end{columns} + +** Deadlock example + + #+begin_src fortran :tangle Codes/mpi_deadlock.f90 +program deadlock + use mpi + implicit none + integer :: rank, size, value, source, destination, ierr + integer, parameter :: tag=100 + + call MPI_INIT(ierr) + call MPI_COMM_RANK(MPI_COMM_WORLD, rank, ierr) + call MPI_COMM_SIZE(MPI_COMM_WORLD, size, ierr) + + source = mod(size+rank-1, size) + destination = mod(rank+1 , size) + + call MPI_SSEND(rank+10, 1, MPI_INTEGER, destination, tag, MPI_COMM_WORLD, ierr) + call MPI_RECV(value, 1, MPI_INTEGER, source, tag, MPI_COMM_WORLD, MPI_STATUS_IGNORE, ierr) + + print *, rank, 'received', value, 'from', source + call MPI_FINALIZE(ierr) +end program + #+end_src + +** Send-receive + + The ~MPI_Sendrecv~ function sends and receives a message /simultaneously/. + It can avoid deadlocks. + + #+begin_example +MPI_SENDRECV(SENDBUF, SENDCOUNT, SENDTYPE, DEST, SENDTAG, + RECVBUF, RECVCOUNT, RECVTYPE, SOURCE, RECVTAG, + COMM, STATUS, IERROR) + + SENDBUF(*), RECVBUF(*) +INTEGER :: SENDCOUNT, SENDTYPE, DEST, SENDTAG +INTEGER :: RECVCOUNT, RECVTYPE, SOURCE, RECVTAG, COMM +INTEGER :: STATUS(MPI_STATUS_SIZE), IERROR + #+end_example + +** Send-receive + + #+begin_src fortran :tangle Codes/mpi_sendrecv.f90 +program sendrecv + use mpi + implicit none + integer :: rank, size, value, source, destination, ierr + integer, parameter :: tag=100 + + call MPI_INIT(ierr) + call MPI_COMM_RANK(MPI_COMM_WORLD, rank, ierr) + call MPI_COMM_SIZE(MPI_COMM_WORLD, size, ierr) + + source = mod(size+rank-1, size) + destination = mod(rank+1 , size) + + call MPI_SENDRECV(rank+10, 1, MPI_INTEGER, destination, tag, value, & + 1, MPI_INTEGER, source, tag, MPI_COMM_WORLD, & + MPI_STATUS_IGNORE, ierr) + + print *, rank, 'received', value, 'from', source + + call MPI_FINALIZE(ierr) +end program + #+end_src + ** Collective communications *** One-to-all - - Broadcast: send same data to all - - Scatter: distribute an array + - ~MPI_Bcast~ :: Broadcast the same data to all + - ~MPI_Scatter~ :: distribute an array *** All-to-one - - Reduction: Sum/product/... of data coming from all ranks - - Gather: collect a distributed array + - ~MPI_Reduce~ :: Sum/product/... of data coming from all ranks + - ~Gather~ :: collect a distributed array *** All-to-all - - Reduction and broadcast + - ~MPI_Barrier~ :: Global synchronization + - ~MPI_AllReduce~ :: Reduce and broadcast the result + - ~MPI_AllGather~ :: Gather and broadcast the result + - ~MPI_Alltoall~ :: Gather and scatter the result + +** Computation of \pi with MPI + + \[ + \pi = 4 \int_{0}^{1} \sqrt{1-x^2} dx + \sim 4 \sum_{i=1}^M \sqrt{1-x_i^2}\, \Delta x + \] + \[ + \; \text{with} \; + 0 \le x_i \le 1 \;\text{and}\; \Delta x = x_{i+1} - x_i + \] + + - Define a grid of $M$ points + - Split the grid on $N$ processes + - Each process computes part of the sum + - The partial sums are reduced on the master process + +** Computation of \pi with MPI (Python) + + #+begin_src python :tangle Codes/mpi_pi.py +#!/usr/bin/env python +from mpi4py import MPI +import sys +from math import sqrt + +def main(): + comm = MPI.COMM_WORLD + rank = comm.Get_rank() + size = comm.Get_size() + + M = int(sys.argv[1]) # Total Number of grid points + M_local = (M-1) // size + 1 # Number of grid points to compute locally + istart = rank * M_local # Beginning of interval + iend = min(istart + M_local, M) # End of interval + dx = 1./float(M) # Delta x + + sum = 0. + for i in range(istart, iend): + x = (i+0.5)*dx + sum += sqrt(1.-x*x) + #+end_src + +** Computation of \pi with MPI (Python) + + #+begin_src python :tangle Codes/mpi_pi.py + result = 4. * dx * sum + pi = comm.reduce(result, MPI.SUM) + print("%10f -> %10f : %10f"%(istart*dx, iend*dx, result)) + if rank == 0: + print("Result = ", pi) + +if __name__ == "__main__": main() + #+end_src + + #+LATEX: \begin{columns} + #+LATEX: \begin{column}{0.6\textwidth} + #+begin_src text +$ mpiexec -n 4 python mpi_pi.py 100000000 + 0.000000 -> 0.250000 : 0.989483 +Result = 3.1415926535902408 + 0.250000 -> 0.500000 : 0.923740 + 0.500000 -> 0.750000 : 0.775058 + 0.750000 -> 1.000000 : 0.453312 + #+end_src + #+LATEX: \end{column} + #+LATEX: \begin{column}{0.3\textwidth} + #+ATTR_LATEX: :width \textwidth + [[./pi_v1.png]] + #+LATEX: \end{column} + #+LATEX: \end{columns} + +** Alternate Computation of \pi with MPI (Python) + + #+begin_src python :tangle Codes/mpi_pi_v2.py +#!/usr/bin/env python +from mpi4py import MPI +import sys +from math import sqrt + +def main(): + comm = MPI.COMM_WORLD + rank = comm.Get_rank() + size = comm.Get_size() + + M = int(sys.argv[1]) # Total Number of grid points + dx = 1./float(M) # Delta x + + sum = 0. + for i in range(rank, M, size): + x = (i+0.5)*dx + sum += sqrt(1.-x*x) + #+end_src + +** Computation of \pi with MPI (Python) + + #+begin_src python :tangle Codes/mpi_pi_v2.py + result = 4. * dx * sum + pi = comm.reduce(result, MPI.SUM) + print(rank, result) + if rank == 0: + print("Result = ", pi) + +if __name__ == "__main__": main() + #+end_src + + #+LATEX: \begin{columns} + #+LATEX: \begin{column}{0.6\textwidth} + #+begin_src text +$ mpiexec -n 8 python mpi_pi_v2.py 100000000 +0 0.7853981783959749 +Result = 3.1415926535901777 +2 0.7853981583983196 +3 0.7853981483981102 +1 0.7853981683977732 + #+end_src + #+LATEX: \end{column} + #+LATEX: \begin{column}{0.3\textwidth} + #+ATTR_LATEX: :width \textwidth + [[./pi_v2.png]] + #+LATEX: \end{column} + #+LATEX: \end{columns} -** Deadlocks * OpenMP * Exercises @@ -1527,6 +1751,19 @@ digraph G { #+RESULTS: + #+BEGIN_SRC dot :output file :file deadlock.png +digraph G { + graph [layout=dot] + A -> B ; + B -> C ; + C -> D ; + D -> A ; +} + #+END_SRC + + #+RESULTS: + [[file:deadlock.png]] + * Exam questions :noexport: @@ -1600,7 +1837,7 @@ digraph G { (setq org-latex-listings 'minted) (setq org-latex-custom-lang-environments nil) (setq org-latex-minted-options - '(("frame" "lines") + '( ("fontsize" "\\scriptsize") ("linenos" ""))) (setq org-latex-to-pdf-process diff --git a/pi_v1.png b/pi_v1.png new file mode 100644 index 0000000000000000000000000000000000000000..e73b54400dc7c07545527dfc22b208b95dbbba0f GIT binary patch literal 21961 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 literal 0 HcmV?d00001 diff --git a/pi_v2.png b/pi_v2.png new file mode 100644 index 0000000000000000000000000000000000000000..932f56a0766ce9cbd84b51605a82be00674cefeb GIT binary patch literal 27233 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 literal 0 HcmV?d00001