Why does this MPI program no longer produce information with more than 2 processors?

advertisements

This MPI program is written in C. When I enter 2 as the number of processors, the output is as follows:

P:0 Got data from processor 1
P:0 Got 100 elements
P:0 value[5]=5.000000

But when I enter 3 or more processors, the program outputs

P:0 Got data from processor 1
P:0 Got 100 elements
P:0 value[5]=5.000000

And then it stalls, and nothing else gets printed. I have to exit the program with [ctrl]+[c]. I do not know why the program stalls. I'd appreciate some hints or good direction.

Here is the code:

#include <stdio.h>
#include <stdlib.h>
#include <mpi.h>

/* Run with two processes */
int main(int argc, char *argv[]) {

        int rank, i, count;
        float data[100],value[200];

        MPI_Status status;
        MPI_Init(&argc,&argv);
        MPI_Comm_rank(MPI_COMM_WORLD,&rank);

        if(rank==1) {

                for(i=0;i<100;++i) data[i]=i;
                MPI_Send(data,100,MPI_FLOAT,0,55,MPI_COMM_WORLD);

        } else {

                MPI_Recv(value,200,MPI_FLOAT,MPI_ANY_SOURCE,55,MPI_COMM_WORLD,&status);
                printf("P:%d Got data from processor %d \n",rank, status.MPI_SOURCE);
                MPI_Get_count(&status,MPI_FLOAT,&count);
                printf("P:%d Got %d elements \n",rank,count);
                printf("P:%d value[5]=%f \n",rank,value[5]);

        }
        MPI_Finalize();
}


Because you are sending the data only to the process with rank == 0 with the process with rank == 1. That is why it works fine with 2 processes (0 and 1). With more processes, the processes with rank 2,3,4,5.... will enter the else block and wait for non-sent data. That is why they halt the execution (waiting for data that will be never sent). You should make the process with rank 1 send the data to all other processes, with a single for loop encapsulating the send operation and give the for loop iterator as the destination rank in the MPI_Send call.