Reduction
Table of contents
- Introduction
- Connection to Modules
- Files Required
- Finding the Minimum Element Part 1: Implementing a reduction using Send and Recv
- Finding the Minimum Element Part 2: Using Scatter and Reduce
Introduction
Performing a reduction using MPI_Reduce is useful in many contexts (e.g., finding the maximum value or adding the values together across several ranks).
The syntax is as follows:
int MPI_Reduce(const void *sendbuf,
void *recvbuf,
int count,
MPI_Datatype datatype,
MPI_Op op,
int root,
MPI_Comm comm)
The operators are as follows:
Name Meaning
--------- --------------------
MPI_MAX maximum
MPI_MIN minimum
MPI_SUM sum
MPI_PROD product
MPI_LAND logical and
MPI_BAND bit-wise and
MPI_LOR logical or
MPI_BOR bit-wise or
MPI_LXOR logical xor
MPI_BXOR bit-wise xor
MPI_MAXLOC max value and location
MPI_MINLOC min value and location
Connection to Modules
- This module may be useful for the distance matrix module.
Files Required
Finding the Minimum Element Part 1: Implementing a reduction using Send and Recv
In this exercise, rank 0 will generate an array of size \(N\). There are \(p\) process ranks. We assume \(N~\mathrm{mod}~p=0\), i.e., \(N/p\) divides evenly.
We will compute the minimum value in an array of size \(N\) using \(p\) ranks. Using MPI_Send you will send chunks of size \(N/p\) to each process rank from rank 0. Each rank will find the minimum element in its chunk of \(N/p\) elements and will send the minimum element to rank 0 using MPI_Send. At the end, rank 0 will compute the minimum of the values received by the ranks and output the result.
In this exercise, we will only use MPI_Send and MPI_Recv.
To get started, use the file reduction_starter.c.
Figure 1 shows an example where the data has already been sent to each rank, and each rank computes the local minimum value of its array of size \(N/p=3\). Each rank then sends its local minimum value to rank 0.

Figure 1: Example of sending the local minimum element at each rank to rank 0, where \(N=12\), and \(p=4\).
Finding the Minimum Element Part 2: Using Scatter and Reduce
Copy your code from Part 1. This time, implement the program using MPI_Scatter and MPI_Reduce without using MPI_Send or MPI_Recv.