CINES MPI. Johanne Charpentier & Gabriel Hautreux

Similar documents
lslogin3$ cd lslogin3$ tar -xvf ~train00/mpibasic_lab.tar cd mpibasic_lab/pi cd mpibasic_lab/decomp1d

Paul Burton April 2015 An Introduction to MPI Programming

CS 6230: High-Performance Computing and Parallelization Introduction to MPI

Scalasca performance properties The metrics tour

Introduction to MPI. Ricardo Fonseca.

CS 470 Spring Mike Lam, Professor. Distributed Programming & MPI

Recap of Parallelism & MPI

CSE. Parallel Algorithms on a cluster of PCs. Ian Bush. Daresbury Laboratory (With thanks to Lorna Smith and Mark Bull at EPCC)

Outline. Communication modes MPI Message Passing Interface Standard

CS 470 Spring Mike Lam, Professor. Distributed Programming & MPI

Topics. Lecture 7. Review. Other MPI collective functions. Collective Communication (cont d) MPI Programming (III)

Introduction to MPI. May 20, Daniel J. Bodony Department of Aerospace Engineering University of Illinois at Urbana-Champaign

MPI: The Message-Passing Interface. Most of this discussion is from [1] and [2].

Elementary Parallel Programming with Examples. Reinhold Bader (LRZ) Georg Hager (RRZE)

Outline. Communication modes MPI Message Passing Interface Standard. Khoa Coâng Ngheä Thoâng Tin Ñaïi Hoïc Baùch Khoa Tp.HCM

AMath 483/583 Lecture 21

The Message Passing Interface (MPI) TMA4280 Introduction to Supercomputing

MA471. Lecture 5. Collective MPI Communication

CS4961 Parallel Programming. Lecture 18: Introduction to Message Passing 11/3/10. Final Project Purpose: Mary Hall November 2, 2010.

Practical Introduction to Message-Passing Interface (MPI)

L14 Supercomputing - Part 2

Scalasca performance properties The metrics tour

CS 470 Spring Mike Lam, Professor. Distributed Programming & MPI

Programming with MPI Collectives

Introduction to parallel computing concepts and technics

Parallel Programming Using Basic MPI. Presented by Timothy H. Kaiser, Ph.D. San Diego Supercomputer Center

Claudio Chiaruttini Dipartimento di Matematica e Informatica Centro Interdipartimentale per le Scienze Computazionali (CISC) Università di Trieste

MPI Workshop - III. Research Staff Cartesian Topologies in MPI and Passing Structures in MPI Week 3 of 3

High Performance Computing

Practical Scientific Computing: Performanceoptimized

Distributed Memory Programming with MPI

CS 426. Building and Running a Parallel Application

Introduction to MPI. Jerome Vienne Texas Advanced Computing Center January 10 th,

Week 3: MPI. Day 02 :: Message passing, point-to-point and collective communications

MPI and OpenMP (Lecture 25, cs262a) Ion Stoica, UC Berkeley November 19, 2016

MPI. (message passing, MIMD)

MPI MESSAGE PASSING INTERFACE

Performance properties The metrics tour

The Message Passing Model

Distributed Memory Parallel Programming

Introduction to the Message Passing Interface (MPI)

Performance properties The metrics tour

Computer Architecture

A Message Passing Standard for MPP and Workstations. Communications of the ACM, July 1996 J.J. Dongarra, S.W. Otto, M. Snir, and D.W.

東京大学情報基盤中心准教授片桐孝洋 Takahiro Katagiri, Associate Professor, Information Technology Center, The University of Tokyo

Parallel Programming Using MPI

MPI Program Structure

Intel Parallel Studio XE Cluster Edition - Intel MPI - Intel Traceanalyzer & Collector

CS4961 Parallel Programming. Lecture 16: Introduction to Message Passing 11/3/11. Administrative. Mary Hall November 3, 2011.

Distributed Memory Programming with MPI

Introduction to MPI. Ritu Arora Texas Advanced Computing Center June 17,

Parallel Computing and the MPI environment

First day. Basics of parallel programming. RIKEN CCS HPC Summer School Hiroya Matsuba, RIKEN CCS

IPM Workshop on High Performance Computing (HPC08) IPM School of Physics Workshop on High Perfomance Computing/HPC08

Peter Pacheco. Chapter 3. Distributed Memory Programming with MPI. Copyright 2010, Elsevier Inc. All rights Reserved

Distributed Memory Programming with MPI. Copyright 2010, Elsevier Inc. All rights Reserved

Chapter 3. Distributed Memory Programming with MPI

Chip Multiprocessors COMP Lecture 9 - OpenMP & MPI

A Message Passing Standard for MPP and Workstations

MPI Mechanic. December Provided by ClusterWorld for Jeff Squyres cw.squyres.com.

Slides prepared by : Farzana Rahman 1

HPC Parallel Programing Multi-node Computation with MPI - I

MPI Application Development with MARMOT

The Message Passing Interface (MPI): Parallelism on Multiple (Possibly Heterogeneous) CPUs

Basic Communication Operations (Chapter 4)

Message Passing Interface

The Message Passing Interface (MPI): Parallelism on Multiple (Possibly Heterogeneous) CPUs

Supercomputing in Plain English

Intermediate MPI features

CEE 618 Scientific Parallel Computing (Lecture 5): Message-Passing Interface (MPI) advanced

Standard MPI - Message Passing Interface

MPI Collective communication

Introduction to MPI. Ekpe Okorafor. School of Parallel Programming & Parallel Architecture for HPC ICTP October, 2014

AMath 483/583 Lecture 18 May 6, 2011

Holland Computing Center Kickstart MPI Intro

Message passing. Week 3: MPI. Day 02 :: Message passing, point-to-point and collective communications. What is MPI?

Parallel Programming & Cluster Computing Distributed Multiprocessing

Code Parallelization

MPI 5. CSCI 4850/5850 High-Performance Computing Spring 2018

High-Performance Computing: MPI (ctd)

Message Passing with MPI

Overview of MPI 國家理論中心數學組 高效能計算 短期課程. 名古屋大学情報基盤中心教授片桐孝洋 Takahiro Katagiri, Professor, Information Technology Center, Nagoya University

Cornell Theory Center. Discussion: MPI Collective Communication I. Table of Contents. 1. Introduction

Intermediate MPI. M. D. Jones, Ph.D. Center for Computational Research University at Buffalo State University of New York

Programming Scalable Systems with MPI. Clemens Grelck, University of Amsterdam

An Introduction to MPI

Parallel programming MPI

Introduction to MPI. SuperComputing Applications and Innovation Department 1 / 143

Message Passing Interface

Introduction to MPI. SHARCNET MPI Lecture Series: Part I of II. Paul Preney, OCT, M.Sc., B.Ed., B.Sc.

CSE 613: Parallel Programming. Lecture 21 ( The Message Passing Interface )

Lecture 4 Introduction to MPI

Collective Communication in MPI and Advanced Features

Parallelization. Tianhe-1A, 2.45 Pentaflops/s, 224 Terabytes RAM. Nigel Mitchell

Supercomputing in Plain English

Tutorial 2: MPI. CS486 - Principles of Distributed Computing Papageorgiou Spyros

Performance properties The metrics tour

MPI MESSAGE PASSING INTERFACE

MPI Tutorial. Shao-Ching Huang. IDRE High Performance Computing Workshop

Linux Clusters Institute: Introduction to MPI. Presented by: David Swanson, Director, HCC Based upon slides by: Henry Neeman, University of Oklahoma

Transcription:

Training @ CINES MPI Johanne Charpentier & Gabriel Hautreux charpentier@cines.fr hautreux@cines.fr

Clusters Architecture OpenMP MPI Hybrid MPI+OpenMP

MPI Message Passing Interface 1. Introduction 2. MPI Environment 3. Point to point communications 4. Collective communications 5. Communicators 3

MPI Message Passing Interface 1. Introduction 2. MPI Environment 3. Point to point communications 4. Collective communications 5. Communicators 4

network

6

MPI Applications : Astrophysics Fluid Dynamic DNA Mechanical Structures Biochemistry Data Mining Cryptanalyze Brute force Reverse engineering etc

What is MPI? o An API : defined code to be used. o A list of headers (include), provided by your mpi runtime package. o A list of libraries (lib/lib64), provided by your mpi runtime package. o A Launcher (mpirun/mpiexec), provided by your mpi runtime package and whose purpose is to manage MPI processes during calculations (based on a hostfile). Note : as seen, mpif90/mpicc are only wrappers to your compiler with added mpi include and libs. 8 8

What is MPI? program hello_world use mpi implicit none integer :: rank, nb_mpi_processes, ierror, hostname_len character (len=mpi_max_processor_name) :: hostname API!To enhance code readability, we let MPI call or MPI native variables in capital letters in Fortran call MPI_INIT(ierror)! Init MPI (init MPI_COMM_WORLD communicator, set rank to each process, etc) call MPI_COMM_SIZE(MPI_COMM_WORLD, nb_mpi_processes, ierror)! Ask the number of MPI processes running :~$ mpif90 hello.f90 call MPI_COMM_RANK(MPI_COMM_WORLD, rank, ierror)! Ask the rank of the current process call MPI_GET_PROCESSOR_NAME(hostname,hostname_len,ierror)! Ask the name of the host the process is running on print*, 'Hello world! I am process',rank,'on',nb_mpi_processes,'processes. I am running on',hostname! Say hello call MPI_FINALIZE(ierror)! Close MPI end program hello_world Compilation, using provided wrapper (include/lib) Conductor and computations :~$ mpirun -np 2./a.out Hello world! I am process 1 on 2 processes. I am running on occigen50 Hello world! I am process 0 on 2 processes. I am running on occigen50 9

Vocabulary : A process with sons threads Private memories of threads Private memory 10

MPI is multiple processes working together by communicating through network Private memory Private memory Private memory Private memory Collective communications 11

General MPI Program Structure

Communicate How do you communicate using mails? You have a departing address (the rank) You specify a destination address (the rank) You use a letter/box adapted to the size of what you send (the size of data) You choose the support to use : Web, US Postal Service, UPS, La Poste, etc (the communicator) Same with MPI, with also The type of what you send (integer, real/float, etc) A communication number (tag) Error return for Fortran and Status.

Communicator Predefined communicator that includes all your MPI processes

Domain decomposition

MPI Message Passing Interface 1. Introduction 2. MPI environment 3. Point to point communications 4. Collective communications 5. Communicators

program hello_world use mpi implicit none integer :: rank, nb_mpi_processes, ierror, hostname_len character (len=mpi_max_processor_name) :: hostname!to enhance code readability, we let MPI call or MPI native variables in capital letters in Fortran call MPI_INIT(ierror)! Init MPI (init MPI_COMM_WORLD communicator, set rank to each process, etc) call MPI_COMM_SIZE(MPI_COMM_WORLD, nb_mpi_processes, ierror)! Ask the number of MPI processes running call MPI_COMM_RANK(MPI_COMM_WORLD, rank, ierror)! Ask the rank of the current process call MPI_GET_PROCESSOR_NAME(hostname,hostname_len,ierror)! Ask the name of the host the process is running on print*, 'Hello world! I am process',rank,'on',nb_mpi_processes,'processes. I am running on',hostname! Say hello :~$ mpimpi hello world call MPI_FINALIZE(ierror) f90! Close hello.f90 MPI :~$ mpirun -np 2./a.out end program hello_world Hello world! I am process 1 on 2 processes. I am running on service2 Hello world! I am process 0 on 2 processes. I am running on service2 17

MPI basic code Load headers or modules Fortran : use mpi C : #include <mpi.h> Initialize the MPI execution environment Fortran : call MPI_INIT(ierror) C : MPI_Init(NULL, NULL); 18

MPI basic code Get the rank of the current process Fortran : call MPI_COMM_RANK(MPI_COMM_WORLD, rank, ierror) C : MPI_Comm_rank(MPI_COMM_WORLD, &rank); Get the total number of processes currently working together Fortran : call MPI_COMM_SIZE(MPI_COMM_WORLD, nb_mpi_processes, ierror) C : MPI_Comm_size(MPI_COMM_WORLD, &nb_mpi_processes); 19

MPI basic code Get the name of the computer/node your process is running on Fortran : call MPI_GET_PROCESSOR_NAME(hostname,hostname_len,ierror) C : MPI_Get_hostname(hostname,&hostname_len); Finalize MPI context Fortran : call MPI_FINALIZE(ierror) C : MPI_Finalize();

Exercises 1.1, 1.2

MPI Message Passing Interface 1. Introduction 2. MPI Environment 3. Point to point communications 4. Collective communications 5. Communicators

Types of point-to-point operations Two different MPI tasks : one send a message, the other perform a matching receive Synchronous send Blocking send / blocking receive Non_blocking send/non-blocking receive Buffered send Combined send/receive Buffering 23

Blocking or non-blocking communications Blocking send/receive : easiest, but might waste time.. Non-blocking send/receive : might be able to overlap wait with other stuff need the use of MPI_WAIT and/or MPI_TEST Fairness 24

Sending data to another process Example, 1D blur : A(i-1) + A(i) + A(i+1) -> B(i) Sequential or OpenMP : A 0 1 2 3 4 5 6 7 8 9 B 0 1 2 3 4 5 6 7 8 9 MPI? Need to share work, and so to share memory A 0 1 2 3 4 5 6 7 8 9 B 0 1 2 3 4 5 6 7 8 9 25

Sending data to another process MPI? Need to share work, and so to share memory : A 0 1 2 3 4 5 6 7 8 9 B 0 1 2 3 4 5 6 7 8 9 Need to communicate to know neighbor's data : A 0 1 2 3 4 5 6 7 8 9 B 0 1 2 3 4 5 6 7 8 9

Sending data to another process : use ghosts cells A 0 1 2 3 4 5 6 7 8 9 B 0 1 2 3 4 5 6 7 8 9 A 0 1 2 3 4 5 6 7 8 9 B 0 1 2 3 4 5 6 7 8 9 A 0 1 2 3 4 5 4 5 6 7 8 9 B 0 1 2 3 4 5 6 7 8 9 27

Synchronous Send data Fortran : call MPI_SEND ( ball, 1, MPI_INTEGER, 1, tag, MPI_COMM_WORLD, ierror ) C : MPI_Send ( &ball, 1, MPI_INTEGER, 1, tag, MPI_COMM_WORLD ); Ball : data to be sent 1 : int, number of items of this data to be sent MPI_INTEGER : int, type of the data 1 : int, rank of destination MPI_COMM_WORLD : int, communicator to use ierror : int

Synchronous Receive data Fortran : call MPI_RECV ( ball, 1, MPI_INTEGER, 0, tag, MPI_COMM_WORLD, status, ierror ) C : MPI_Recv ( &ball, 1, MPI_INTEGER, 0, tag, MPI_COMM_WORLD, MPI_STATUS_IGNORE);

Synchronous Send or Receive data Synchronous Send/Receive data : Theses communications are synchronous. The process will wait here until data is sent or received. In order to make it work, you have to choose an order : a process send it s data while the receiver waits it. When its done, reverse : the first one waits for the data and the second one send it. This is laborious, we will see some bypass after.

program ping_pong :~$ mpirun -np 2./a.out use mpi implicit none Process 3 0 iter 1 ball value is : integer :: rank, nb_mpi_processes, ierror, Process tag=7777, statu(mpi_status_size), 0 iter 2 ball n, ball value is : integer :: niter = 6 call MPI_INIT( ierror ) 6 Process 0 iter 3 ball value is : call MPI_COMM_SIZE( MPI_COMM_WORLD, nb_mpi_processes 9, ierror ) call MPI_COMM_RANK( MPI_COMM_WORLD, rank Process, ierror ) 0 iter 4 ball value is : 12 if(nb_mpi_processes /= 2) stop 'This program Process is design to 0 be iter run with 2 processes 5 ball value only' is : 15 Process 0 iter 6 ball value is : 18 ball = 0 do n=1,niter if(rank==0) then Process 1 iter 1 ball value is : call MPI_SEND ( ball, 1, MPI_INTEGER 1, 1, tag, MPI_COMM_WORLD, ierror )! 0 send ball to 1, and wait for transfer Process to be finished 1 iter 2 ball value is : call MPI_RECV ( ball, 1, MPI_INTEGER 4, 1, tag, MPI_COMM_WORLD, MPI_STATUS_IGNORE, ierror ) Process 1 iter 3 ball value is :! 0 receive ball from 1, and wait 7 for transfer to be finished ball = ball + 2 end if if(rank==1) then 13 call MPI_RECV ( ball, 1, MPI_INTEGER Process, 0, tag, MPI_COMM_WORLD 1 iter, MPI_STATUS_IGNORE 6 ball value is :, ierror ) 16 ball = ball + 1 call MPI_SEND ( ball, 1, MPI_INTEGER, 0, tag, MPI_COMM_WORLD, ierror ) end if print*, 'Process',rank,'iter',n,'ball value is :',ball call MPI_BARRIER(MPI_COMM_WORLD,ierror)! A barrier. processes stop here, and can pass it only if ALL processes are here. Useful for debug, can impact performances end do call MPI_FINALIZE ( ierror )! Close MPI Process 1 iter 4 ball value is : 10 Process 1 iter 5 ball value is :

Synchronous Send or Receive data Synchronous Send/Receive data : Theses communications are synchronous. The process will wait here until data is sent or received. In order to make it work, you have to choose an order : a process send it s data while the receiver waits it. When its done, reverse : the first one waits for the data and the second one send it. This is laborious, we will see some bypass after. Use Sendrecv to do both at the same time!

Synchronous Send/Receive data Fortran : call MPI_SENDRECV ( val, 1, MPI_INTEGER, 1, tag, val0, 1, MPI_INTEGER, 1, tag, MPI_COMM_WORLD, status, ierror ) data to send data to receive C : MPI_Sendrecv ( &val, 1, MPI_INTEGER, 1, tag, &val0, 1, MPI_INTEGER, 1, tag, MPI_COMM_WORLD, MPI_STATUS_IGNORE ); 33

if(rank==0) then call MPI_SENDRECV ( val, 1, MPI_INTEGER, 1, tag, val0, 1, MPI_INTEGER, 1, tag, MPI_COMM_WORLD, statu, ierror ) val = val0 end if if(rank==1) then call MPI_SENDRECV ( val, 1, MPI_INTEGER, 0, tag, val0, 1, MPI_INTEGER, 0, tag, MPI_COMM_WORLD Synchronous, statu Send/Receive, ierror ) data val = val0 end if Fortran : call MPI_SENDRECV ( val, 1, MPI_INTEGER, 1, tag, val0, 1, MPI_INTEGER, 1, tag, MPI_COMM_WORLD, status, ierror ) data to send data to receive (context) C : MPI_Sendrecv ( &val, 1, MPI_INTEGER, 1, tag, &val0, 1, MPI_INTEGER, 1, tag, MPI_COMM_WORLD, MPI_STATUS_IGNORE ); 34

Exercises 1.3, 1.4

MPI Message Passing Interface 1. Introduction 2. MPI Environment 3. Point to point communications 4. Collective communications 5. Communicators 36

MPI collective communications Apply to all processes of the specified communicator Available : Synchronization Reductions (Max, Min, SUM, PROD, etc) Global broadcast or gather, and derivatives

MPI collective communications MPI_BARRIER MPI_REDUCE MPI_ALLREDUCE MPI_BCAST MPI_SCATTER MPI_GATHER MPI_ALLGATHER MPI_GATHERV MPI_ALLTOALL

Synchronization As for OpenMP, you can use barriers to ensure all processes stay synchronize before or after a specific action. MPI_BARRIER Fortran : call MPI_BARRIER(MPI_COMM_WORLD,ierror) C : MPI_Barrier(MPI_COMM_WORLD); 39

Reductions : REDUCE get result on only one process : REDUCE get result on all processes : ALLREDUCE Private memory Private memory Private memory Private memory b0 b0+b1+b2+b3 = a b 1 b 2 b 3 Reduce

Reductions : ALLREDUCE get result on only one process : REDUCE get result on all processes : ALLREDUCE Private memory Private memory Private memory Private memory b0 b 1 b 2 b 3 b0+b1+b2+b3 = a AllReduce

MPI_ALLREDUCE Fortran : CALL MPI_ALLREDUCE ( val, sum_val, 1, MPI_DOUBLE_PRECISION, MPI_SUM, MPI_COMM_WORLD, ierror) C : MPI_Allreduce(&val, &val, 1, MPI_DOUBLE, MPI_SUM, MPI_COMM_WORLD); 42

Broadcast : MPI_BCAST Private memory Private memory Private memory Private memory A0 b b b b MPI_BCAST b b b b A0 A0 A0 A0

MPI_BCAST Fortran : CALL MPI_BCAST ( val, 1, MPI_DOUBLE_PRECISION, 0, MPI_COMM_WORLD, ierror) C : MPI_Bcast(&val, &val, 1, MPI_DOUBLE, 0, MPI_COMM_WORLD); 44

Broadcast : MPI_SCATTER Private memory Private memory Private memory Private memory b b b b A0 A1 A2 A3 MPI_SCATTER b b b b A0 A1 A2 A3

MPI_SCATTER Fortran : CALL MPI_SCATTER (aval(1:8), 2, MPI_DOUBLE_PRECISION, bval(1:2), 2, MPI_DOUBLE_PRECISION, 3, MPI_COMM_WORLD, ierror) C : MPI_Scatter (&aval, 2, MPI_REAL, &bval, 2, MPI_REAL, 3, MPI_COMM_WORLD);

Broadcast : MPI_GATHER Private memory Private memory Private memory Private memory b b b b A0 A1 A2 A3 MPI_GATHER b b b b A0 A1 A2 A3

MPI_GATHER Fortran : CALL MPI_GATHER( val, 1, MPI_DOUBLE_PRECISION, cval(1:4), 1, MPI_DOUBLE_PRECISION, 3, MPI_COMM_WORLD, ierror) C : MPI_Gather (val, 1, MPI_DOUBLE_PRECISION, &cval, 1, MPI_DOUBLE_PRECISION, 3, MPI_COMM_WORLD); 48

Broadcast : MPI_ALLGATHER Private memory Private memory Private memory Private memory b b b b A0 A1 A2 A3 MPI_ALLGATHER b b b b A0 A1 A2 A3 A0 A1 A2 A3 A0 A1 A2 A3 A0 A1 A2 A3

MPI_ALLGATHER Fortran : CALL MPI_ALLGATHER( val, 1, MPI_DOUBLE_PRECISION, cval(1:4), 1, MPI_DOUBLE_PRECISION, MPI_COMM_WORLD, ierror) C : MPI_Allgather(val, 1, MPI_DOUBLE_PRECISION, &cval, 1, MPI_DOUBLE_PRECISION, MPI_COMM_WORLD); 50

Broadcast : MPI_GATHERV Private memory Private memory Private memory Private memory b b b b A0 A1 A2 A3 A4 A5 A6 MPI_GATHERV A0 A1 A2 A3 A4 A5 A6 b b b b

Broadcast : MPI_ALLTOALL Private memory Private memory Private memory Private memory b b b b A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 A10 A11 A12 A13 A14 A15 MPI_ALLTOALL b b b b A0 A4 A8 A12 A1 A5 A9 A13 A2 A6 A10 A14 A3 A7 A11 A15

Others available, not covered in this training : MPI_SCATTERV() MPI_GATHERV() MPI_ALLGATHERV() Etc. All information can be found here : http://www.mpich.org/static/docs/v3.0.x/www3/ 53

Exercises 1.5

MPI Message Passing Interface 1. Introduction 2. Acquire information 3. Point to point communications 4. Collective communications 5. Communicators 55

Communicators Cartesian communicator Specific communicator dedicated to Cartesian organization User tuned communicator Users can defined their own communicators for specific purposes 56

Cartesian communicator 6 7 8 3 4 5 0 1 2 20/03/2015 57

Cartesian communicator 0,2 1,2 2,2 0,1 1,1 2,1 0,0 1,0 2,0 20/03/2015 58

Cartesian communicator MPI_PROC _NULL MPI_PROC _NULL MPI_PROC _NULL MPI_PROC _NULL MPI_PROC _NULL MPI_PROC _NULL 6 7 8 MPI_PROC _NULL MPI_PROC _NULL 3 4 5 MPI_PROC _NULL MPI_PROC _NULL 0 1 2 MPI_PROC _NULL MPI_PROC _NULL MPI_PROC _NULL MPI_PROC _NULL MPI_PROC _NULL MPI_PROC _NULL 20/03/2015 59

Cartesian communicator Periodic 6 7 8 3 4 5 0 1 2 Periodic 20/03/2015 60

Cartesian communicator MPI_PROC _NULL 0 1 2 MPI_PROC _NULL MPI_PROC _NULL 6 7 8 MPI_PROC _NULL MPI_PROC _NULL 3 4 5 MPI_PROC _NULL MPI_PROC _NULL 0 1 2 MPI_PROC _NULL MPI_PROC _NULL 6 7 8 MPI_PROC _NULL 20/03/2015 61

Cartesian communicator When you communicate with MPI_PROC_NULL, communication does not occur, but does not stop computation. Useful to simplify source code. Why using Cartesian communicator when you can do it manually? Reorganize! This function tune your ranks numbers depending on their proximity in the super computer to maximize performances. 62

Cartesian communicator nb_process_axe(1) = 4 cart_boundaries(1) =.false.! Means not periodic,.true. Means periodic call MPI_CART_CREATE( MPI_COMM_WORLD, ndim, nb_process_axe(1:ndim), & & cart_boundaries(1:ndim),.true., MPI_COMM_CART, ierror ) call MPI_CART_COORDS( MPI_COMM_CART, rank, ndim, cart_position(1:ndim), ierror ) call MPI_CART_SHIFT (MPI_COMM_CART, 0, 1, cart_neigh(-1), cart_neigh(+1), ierror) 63

User User tuned communicator int, reference communicator int, new communicator Fortran : CALL MPI_COMM_SPLIT(MPI_COMM_WORLD, color, key, MY_COM, ierror) C : MPI_Comm_split(MPI_COMM_WORLD, color, key, &MY_COM); integer :: key, color, MY_COMMUNICATOR [ ] color=mpi_undefined if (rank == 0.OR. rank == 1) color = 1 if (rank == 2.OR. rank == 3) color = 2 key=rank CALL MPI_COMM_SPLIT(MPI_COMM_WORLD,color,key,MY_COMMUNICATOR,ierror) CALL MPI_ALLREDUCE ( rank, ranksum, 1, MPI_INTEGER, MPI_SUM, MY_COMMUNICATOR, ierror) I am proc 2 print *,"I am proc",rank,ranksum 5 I am proc 0 1 64

Exercises 1.6, 1.7

MPI The Complete Reference : Volume 1, The MPI Core, by Marc Snir, Steve Otto, Steven Huss-Lederman, David Walker and Jack Dongarra, 1998 https://computing.llnl.gov/tutorials/mpi/ http://www.idris.fr/data/cours/parallel/mpi/choix_doc.html http://www.mpich.org/static/docs/v3.0.x/www3/ (API) http://www.open-mpi.org/doc/v1.6/ (API) http://semelin.developpez.com/cours/parallelisme/ (FR) 66