Last updated: 2022-11-08

When you need to decompose a rectangular domain of size \(R \times C\) among \(P\) MPI processes, you usually employ a block decomposition by rows (Block, *): the first process handles the first \(R / P\) lines; the second handles the next \(R / P\) lines, and so on. Indeed, in the C language matrices are stored in row-major order, and a (Block, *) decomposition has each partition as a contiguous sub-array so that data transfers are greatly simplified.

In this exercise, on the other hand, we consider a column-wise decomposition in order to use MPI derived datatypes.

Write a program where processes 0 and 1 keep a local matrix of size \(\textit{SIZE} \times (\textit{SIZE}+2)\) that include two columns of *ghost cells* (also called *halo*). In mpi-send-col.c we set *SIZE*=4, but the program must work with any value.

Process 0 and 1 initialize their local matrices as follows.

Process 0 must send the *rightmost* column to process 1, where it is inserted into the *leftmost* ghost area:

Similarly, process 1 must send the *leftmost* column to process 0, where it is placed into the *rightmost* ghost area.

You should define a suitable datatype to represent a matrix column, and use two `MPI_Sendrecv()`

operations to exchange the data.

To compile:

` mpicc -std=c99 -Wall -Wpedantic mpi-send-col.c -o mpi-send-col.c`

To execute:

` mpirun -n 2 ./mpi-send-col.c`