#include "mpi.h" #include #include int main( int argc, char *argv[] ) { int my_rank; /* rank of process */ int p; /* number of processes */ int source; /* rank of sender */ int dest; /* rank of receiver */ int tag = 0; /* tag for messages */ char message[200]; /* storage for message */ MPI_Status status; /* return status for */ /* receive */ int world_size, universe_size, *universe_sizep, flag; MPI_Info hostinfo; MPI_Comm pcpslaves; MPI_Init( &argc, &argv ); /* Find out process rank */ MPI_Comm_rank(MPI_COMM_WORLD, &my_rank); /* Find out number of processes */ MPI_Comm_size(MPI_COMM_WORLD, &p); MPI_Attr_get(MPI_COMM_WORLD, MPI_UNIVERSE_SIZE, &universe_sizep, &flag); if (!flag) { printf("This MPI does not support UNIVERSE_SIZE. How many processes total?"); scanf("%d", &universe_size); } else universe_size = *universe_sizep; if (universe_size == 1) { error("No room to start workers"); } else { printf("Universe size is %d\n",universe_size);} /* makehostlist( argv[1], "targets" ); */ MPI_Info_create( &hostinfo ); MPI_Info_set( hostinfo, "file", "targets" ); MPI_Info_set( hostinfo, "soft", "0-4" ); /* MPI_Comm_spawn( "slave", MPI_ARGV_NULL, universe_size-1, hostinfo, 0, MPI_COMM_SELF, &pcpslaves, MPI_ERRCODES_IGNORE ); */ MPI_Comm_spawn( "slave", MPI_ARGV_NULL, universe_size-1, MPI_INFO_NULL, 0, MPI_COMM_SELF, &pcpslaves, MPI_ERRCODES_IGNORE ); MPI_Info_free( &hostinfo ); for (source = 0; source < universe_size-1; source++) { /* MPI_Recv(message, 200, MPI_CHAR, source, tag, MPI_COMM_WORLD, &status); */ MPI_Recv(message, 200, MPI_CHAR, source, tag, pcpslaves, &status); printf("%s\n", message); } MPI_Comm_free( &pcpslaves ); MPI_Finalize(); }