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); } } }