next up previous
Next: Compiling and running Up: Lesson 1 -- Previous: Lesson 1 --

The listing of first.c

 

#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include "mpi.h"

int main ( int argc, char **argv )
{
    int pool_size, my_rank, host_rank, destination, source, node_name_length,
        *host_rank_ptr, found_flag, int_buffer[BUFSIZ];
    char char_buffer[BUFSIZ], my_node_name[BUFSIZ], console_name[BUFSIZ],
         host_name[BUFSIZ]; 
    MPI_Status status;
    boolean_t i_am_the_master = B_FALSE; 

    MPI_Init ( &argc, &argv );
    MPI_Comm_size ( MPI_COMM_WORLD, &pool_size ); 
    MPI_Comm_rank ( MPI_COMM_WORLD, &my_rank );
    MPI_Get_processor_name ( my_node_name, &node_name_length );
    MPI_Attr_get ( MPI_COMM_WORLD, MPI_HOST, (void**) &host_rank_ptr,
                   &found_flag );
    if ( (int) host_rank_ptr != MPI_PROC_NULL ) host_rank = *host_rank_ptr; 
    else {
       MPI_Attr_get ( MPI_COMM_WORLD, MPI_IO, (void **) &host_rank_ptr,
                      &found_flag );
       if ( (int) host_rank_ptr != MPI_ANY_SOURCE ) host_rank = *host_rank_ptr;
       else {
          strcpy ( console_name, argv[1] );
          if ( 0 == strcmp ( my_node_name, console_name ) ) {
             host_rank = my_rank;
             i_am_the_master = B_TRUE;
          }
       }
    }
    if (i_am_the_master) {
       int_buffer[0] = host_rank;
       for (destination = 0; destination < pool_size; destination++)
          if (destination != my_rank) 
             MPI_Send(int_buffer, 1, MPI_INT, destination, 1001, 
                      MPI_COMM_WORLD);
    }
    else {
       MPI_Recv(int_buffer, 1, MPI_INT, MPI_ANY_SOURCE, 1001, 
                MPI_COMM_WORLD, &status);
       host_rank = int_buffer[0];
    }
    if (i_am_the_master) strcpy (char_buffer, my_node_name);
    MPI_Bcast(char_buffer, BUFSIZ, MPI_CHAR, host_rank, 
              MPI_COMM_WORLD);
    strcpy (host_name, char_buffer);
    if (! i_am_the_master) {
       sprintf (char_buffer, "Greetings to the master (%s, %d) from (%s, %d)",
                host_name, host_rank, my_node_name, my_rank);
       MPI_Send (char_buffer, strlen(char_buffer) + 1, MPI_CHAR, host_rank, 
                 2002, MPI_COMM_WORLD);
    }
    else {
       for (source = 0; source < pool_size; source++) {
          if (source != my_rank) {
             MPI_Recv(char_buffer, BUFSIZ, MPI_CHAR, source, 2002,
                      MPI_COMM_WORLD, &status);
             printf ("%s\n", char_buffer);
          }
       }
    }
    MPI_Finalize ();
}



Zdzislaw Meglicki
Tue Feb 28 15:07:51 EST 1995