MPI Hands-On; Collective Communications I

  1. Broadcasting an integer value to all of the MPI processes, A program code10.c that reads an integer value from the terminal and distributes the value to all of the MPI processes.
        1 #include <stdio.h>
        2 #include "mpi.h"
        3 
        4 int main( int argc, char **argv )
        5 {
        6   int rank, value;
        7   MPI_Init( &argc, &argv );
        8 
        9   MPI_Comm_rank( MPI_COMM_WORLD, &rank );
       10   do {
       11     if (rank == 0) 
       12       scanf( "%d", &value );
       13 
       14     MPI_Bcast( &value, 1, MPI_INT, 0, MPI_COMM_WORLD );
       15         
       16     printf( "Process %d got %d\n", rank, value );
       17     fflush(stdout);
       18         
       19   } while (value >= 0);
       20 
       21   MPI_Finalize( );
       22   return 0;
       23 }
    
  2. Broadcasting the name of the master process, A program code11.c that first broadcasts the name of the master process then each nodes send hello messages to master node.
        1 #include <stdio.h>
        2 #include <string.h>
        3 #include <mpi.h>
        4 
        5 #define TRUE 1
        6 #define FALSE 0
        7 #define MASTER_RANK 0
        8 
        9 int main( int argc, char *argv[] )
       10 {
       11   int count, pool_size, my_rank, my_name_length, i_am_the_master = FALSE;
       12   char my_name[BUFSIZ/2], master_name[BUFSIZ/2], send_buffer[2*BUFSIZ],
       13     recv_buffer[2*BUFSIZ];
       14   MPI_Status status;
       15 
       16   MPI_Init(&argc, &argv);
       17   MPI_Comm_size(MPI_COMM_WORLD, &pool_size);
       18   MPI_Comm_rank(MPI_COMM_WORLD, &my_rank);
       19   MPI_Get_processor_name(my_name, &my_name_length);
       20 
       21   if (my_rank == MASTER_RANK) {
       22     i_am_the_master = TRUE;
       23     strcpy (master_name, my_name);
       24   }
       25 
       26   MPI_Bcast(master_name, BUFSIZ, MPI_CHAR, MASTER_RANK, MPI_COMM_WORLD);
       27 
       28   sprintf(send_buffer, "hello %s, greetings from %s, rank = %d",
       29 	  master_name, my_name, my_rank);
       30   MPI_Send (send_buffer, strlen(send_buffer) + 1, MPI_CHAR,
       31 	    MASTER_RANK, 0, MPI_COMM_WORLD);
       32 
       33   if (i_am_the_master) {
       34     for (count = 1; count <= pool_size; count++) {
       35       MPI_Recv (recv_buffer, BUFSIZ, MPI_CHAR, MPI_ANY_SOURCE, MPI_ANY_TAG,
       36 		MPI_COMM_WORLD, &status);
       37       printf ("%s\n", recv_buffer);
       38     }
       39   }
       40 
       41   MPI_Finalize();
       42 }
    
  3. Computation of PI number with collective communications. This example code12.c evaluates $\pi $ by numerically evaluating the integral

    $\displaystyle \int_0^1\frac{1}{1+x^2}dx=\frac{\pi}{4}
$

    This code computes PI (with a very simple method) but does not use MPI_Send and MPI_Recv. Instead, it uses collective operations to send data to and from all of the running processes.
        1 #include <stdio.h>
        2 #include "mpi.h"
        3 #include <math.h>
        4 
        5 int main( int argc, char *argv[] )
        6 {
        7   int done = 0, n, myid, numprocs, i, rc;
        8   double PI25DT = 3.141592653589793238462643;
        9   double mypi, pi, h, sum, x, a;
       10 
       11   MPI_Init(&argc,&argv);
       12   MPI_Comm_size(MPI_COMM_WORLD,&numprocs);
       13   MPI_Comm_rank(MPI_COMM_WORLD,&myid);
       14   while (!done)
       15   {
       16     if (myid == 0) {
       17         printf("Enter the number of intervals: (0 quits) ");
       18         scanf("%d",&n);
       19     }
       20     MPI_Bcast(&n, 1, MPI_INT, 0, MPI_COMM_WORLD);
       21     if (n == 0) break;
       22   
       23     h   = 1.0 / (double) n;
       24     sum = 0.0;
       25     for (i = myid + 1; i <= n; i += numprocs) {
       26         x = h * ((double)i - 0.5);
       27         sum += 4.0 / (1.0 + x*x);
       28     }
       29     mypi = h * sum;
       30     
       31     MPI_Reduce(&mypi, &pi, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD);
       32     
       33     if (myid == 0)
       34         printf("pi is approximately %.16f, Error is %.16f\n",
       35                pi, fabs(pi - PI25DT));
       36   }
       37   MPI_Finalize();
       38 }