MPI_Scan is similar to MPI_Reduce, but instead of gathering the reduced result at a single root process, it performs a parallel prefix reduction, providing each process with a partial result of the reduction operation up to that point in the sequence of processes.
In this example, each process will generate a random number, and we'll use MPI_Scan to compute the cumulative sum of these numbers across all processes. Each process will receive the sum of random numbers from the first process up to itself.
#include <mpi.h> #include <stdio.h> #include <stdlib.h> #include <time.h> int main(int argc, char** argv) { // Initialize the MPI environment MPI_Init(&argc, &argv); // Get the rank of the process and the total number of processes int world_rank, world_size; MPI_Comm_rank(MPI_COMM_WORLD, &world_rank); MPI_Comm_size(MPI_COMM_WORLD, &world_size); // Seed the random number generator to get different results each time srand(time(NULL) + world_rank); // Generate a random number at each process int rand_num = rand() % 100; printf("Process %d generated number %d\n", world_rank, rand_num); // Use MPI_Scan to compute the cumulative sum of all random numbers int cum_sum; MPI_Scan(&rand_num, &cum_sum, 1, MPI_INT, MPI_SUM, MPI_COMM_WORLD); // Each process prints its partial sum printf("Process %d has cumulative sum %d\n", world_rank, cum_sum); // Finalize the MPI environment MPI_Finalize(); }
Initialization: The MPI environment is initialized.
Random Number Generation: Each process generates a random number.
Scan Operation: MPI_Scan is used to compute the cumulative sum of the random numbers. Each process receives the sum of random numbers from the start up to its rank.
Output: Each process prints its rank and its cumulative sum.
Finalization: The MPI environment is finalized.
This program demonstrates the use of MPI_Scan for computing cumulative sums across processes in an MPI environment.