Basics of MPI Programming

We will start with the basic routines used to initialize MPI, obtain information about the process, and write simple examples.

Initialize MPI

MPI must be initialized before we can invoke any other routines. This does not have to be the first executable statement in the program, but it must be performed before any other MPI routines can be called. The initialization carries out the necessary system setup and establishes the default communicator.

In the current MPI standard, all C/C++ routines return an integer, the error code. The Fortran bindings are mostly subroutines and include this return value as the last parameter.

C/C++

MPI_Init(&argc, &argv);
//more correct but rarely used
//int ierr=MPI_Init(&argc, &argv);

Fortran

integer ierr
!code
call MPI_Init(ierr)

Python

This tutorial applies only to the mpi4py package, which is the most popular MPI implementation for Python at this time. This package consists of multiple subpackages, of which the most important is MPI. Within the MPI subpackage are several classes. Most of the basic functionality of MPI is implemented as methods in the Communicator class.

mpi4py calls Init internally when a Communicator object is instantiated. It is available but not required.

from mpi4py import MPI
#optional
#MPI.Init()
#More usually we just set up the default communicator
comm=MPI.COMM_WORLD

Determine The Number of Processes

C/C++ programmers should notice that parameters to the MPI routines must be called by reference, i.e. a pointer must be passed. Fortran automatically calls by reference so no special treatment of parameters is required.

The first argument is the communicator; the number of processes in that communicator group is returned as an integer in the second argument.

C

int nprocs;
MPI_Comm_size(MPI_COMM_WORLD, &nprocs);

Fortran

integer ::  ierr, nprocs
!other statements
call MPI_Comm_size(MPI_COMM_WORLD, nprocs, ierr)

Python

nprocs=comm.Get_size()

Determine Process Rank

The rank is always relative to the communicator. We are only considering the default MPI_COMM_WORLD in these examples. Process rank is an integer in the range 0, 1, …, (nprocs-1) returned through the second argument.

C

int rank;
MPI_Comm_rank(MPI_COMM_WORLD, &rank);

Fortran

integer :: rank
!other statements
call MPI_Comm_rank(MPI_COMM_WORLD,rank,ierr)

Python

rank=comm.Get_rank()

Shut Down MPI

C

MPI_Finalize();

Fortran

call MPI_Finalize(ierr)

Python

MPI.Finalize()

For mpi4py, Finalize must be invoked only if Init was explicitly called.

Finalize must be the last routine after all other MPI library calls. It allows the system to free up MPI resources. It does not have to be the last executable statement, but no more MPI routines may be invoked after it.

Previous
Next