#include #include #include #include #include #include #define MASTER 0 int main(int argc, char* argv[]) { int rank, i; float data[100]; char cdata[64]; char myport[MPI_MAX_PORT_NAME]; char myservice[64]; MPI_Comm intercomm; MPI_Status status; int intercomm_size; MPI_Init(&argc, &argv); MPI_Comm_rank(MPI_COMM_WORLD, &rank); printf("Processor %d (%d, Sender) initialized\n", rank, getpid()); if( argc < 2 ) { fprintf(stderr, "Require server name\n"); MPI_Finalize(); exit(-1); } for( i = 0; i < 100; i++ ) data[i] = i; sprintf(myservice, "%s-%d", argv[1], rank); printf("Processor %d looking for service %s\n", rank, myservice); MPI_Lookup_name(myservice, MPI_INFO_NULL, myport); printf("Processor %d found port %s looking for service %s\n", rank, myport, myservice); while( 1 ) { printf("Processor %d connecting to '%s'\n", rank, myport); if( MPI_Comm_connect(myport, MPI_INFO_NULL, 0, MPI_COMM_WORLD, &intercomm) == MPI_SUCCESS ) break; sleep(1); } printf("Processor %d connected\n", rank); MPI_Comm_remote_size(intercomm, &intercomm_size); printf("Processor %d remote comm size is %d\n", rank, intercomm_size); printf("Processor %d sending data through intercomm to rank 0...\n", rank); MPI_Send(data, 100, MPI_FLOAT, 0, rank, intercomm); printf("Processor %d data sent!\n", rank); MPI_Recv(cdata, 12, MPI_CHAR, MPI_ANY_SOURCE, MPI_ANY_TAG, intercomm, &status); printf("Processor %d received string data '%s' from rank %d, tag %d\n", rank, cdata, status.MPI_SOURCE, status.MPI_TAG); sleep(5); printf("Processor %d disconnecting communicator\n", rank); MPI_Comm_disconnect(&intercomm); printf("Processor %d finalizing\n", rank); MPI_Finalize(); printf("Processor %d Goodbye!\n", rank); }