Parallel Programming
Libraries and Implementations
Parallel Programming Libraries and Implementations Reusing this - - PowerPoint PPT Presentation
Parallel Programming Libraries and Implementations Reusing this material This work is licensed under a Creative Commons Attribution- NonCommercial-ShareAlike 4.0 International License. http://creativecommons.org/licenses/by-nc-sa/4.0/deed.en_US
Libraries and Implementations
This work is licensed under a Creative Commons Attribution- NonCommercial-ShareAlike 4.0 International License. http://creativecommons.org/licenses/by-nc-sa/4.0/deed.en_US
This means you are free to copy and redistribute the material and adapt and build on the material under the following terms: You must give appropriate credit, provide a link to the license and indicate if changes were made. If you adapt or build on the material you must distribute your work under the same license as the original. Note that this presentation contains images owned by others. Please seek their permission before reusing these images.
Distributed memory parallelism using message passing
passing messages
about what MPI actually does
representatives from ~40 different organisations (the MPI Forum)
source developers create libraries that actually implement versions of the standard
should support the MPI standard (version 2 or 3)
implementation details but all the features specified in the standard should work.
machines)
using the message passing model
in parallel
simultaneously (e.g. mpiexec, aprun)
communicating with other instances
decomposition and implement it
communication – not necessarily at the same time
communication pattern
#include ¡<mpi.h> ¡ ¡ int ¡main(int ¡argc, ¡char* ¡argv[]) ¡ { ¡ ¡ ¡ ¡int ¡size,rank; ¡ ¡ ¡ ¡ ¡MPI_Init(&argc, ¡&argv); ¡ ¡ ¡ ¡MPI_Comm_size(MPI_COMM_WORLD, ¡&size); ¡ ¡ ¡ ¡MPI_Comm_rank(MPI_COMM_WORLD, ¡&rank); ¡ ¡ ¡ ¡ ¡printf("Hello ¡world ¡-‑ ¡I'm ¡rank ¡%d ¡of ¡%d\n", ¡rank, ¡size); ¡ ¡ ¡MPI_Finalize(); ¡ ¡ ¡return ¡0; ¡ } ¡
Shared-memory parallelism using directives
memory space
certain compilers thanks to keywords (sentinels)
threads divide work done in the region
the compiler produces a parallel executable
parallelise the work in a loop
the loop between the threads #pragma ¡omp ¡parallel ¡shared(a,b,c,chunk) ¡private(i) ¡ { ¡ ¡ ¡ ¡#pragma ¡omp ¡for ¡schedule(dynamic,chunk) ¡nowait ¡ ¡ ¡ ¡for ¡(i=0; ¡i ¡< ¡N; ¡i++) ¡{ ¡ ¡ ¡ ¡ ¡ ¡c[i] ¡= ¡a[i] ¡+ ¡b[i]; ¡ ¡ ¡ ¡} ¡ } ¡
asum ¡= ¡0.0 ¡ #pragma ¡omp ¡parallel ¡\ ¡ shared(a,N) ¡private(i) ¡\ ¡ reduction(+:asum) ¡ { ¡ ¡ ¡ ¡#pragma ¡omp ¡for ¡ ¡ ¡ ¡for ¡(i=0; ¡i ¡< ¡N; ¡i++) ¡ ¡ ¡ ¡{ ¡ ¡ ¡ ¡ ¡ ¡asum ¡+= ¡a[i]; ¡ ¡ ¡ ¡} ¡ } ¡ printf(“asum ¡= ¡%f\n”, ¡asum); ¡
loop: i = istart,istop myasum += a[i] end loop asum asum=0
Programming GPGPU Accelerators
programming NVIDIA GPU accelerators
all systems with NVIDIA GPU accelerators
parallelism is implicit in the kernel design and launch
communicate directly between multiple GPU accelerators (GPUdirect)
// ¡CUDA ¡kernel. ¡Each ¡thread ¡takes ¡care ¡of ¡one ¡element ¡of ¡c ¡ __global__ ¡void ¡vecAdd(double ¡*a, ¡double ¡*b, ¡double ¡*c, ¡int ¡n) ¡ { ¡ ¡ ¡ ¡ ¡// ¡Get ¡our ¡global ¡thread ¡ID ¡ ¡ ¡ ¡ ¡int ¡id ¡= ¡blockIdx.x*blockDim.x+threadIdx.x; ¡ ¡ ¡ ¡ ¡ ¡ ¡// ¡Make ¡sure ¡we ¡do ¡not ¡go ¡out ¡of ¡bounds ¡ ¡ ¡ ¡ ¡if ¡(id ¡< ¡n) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡c[id] ¡= ¡a[id] ¡+ ¡b[id]; ¡ } ¡ ¡ // ¡Called ¡with ¡ vecAdd<<<gridSize, ¡blockSize>>(d_a, ¡d_b, ¡d_c, ¡n); ¡
accelerators
Niche and future implementations
especially MPI + X (where X is usually OpenMP)
available