How to Send/Receive in MPI using all processors

前端 未结 2 689
予麋鹿
予麋鹿 2021-02-06 00:34

This program written using C Lagrange and MPI. I am new to MPI and want to use all processors to do some calculations, including process 0. To learn this concept, I have written

2条回答
  •  耶瑟儿~
    2021-02-06 00:55

    Actually, processes 1-3 are indeed sending the result back to processor 0. However, processor 0 is stuck in the first iteration of this loop:

    for(i=0; i<4; i++)
    {      
        MPI_Recv(&number, 1, MPI_INT, i, 99, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
        printf("Process 0 received number %d from i:%d\n", number, i);
    }
    

    In the first MPI_Recv call, processor 0 will block waiting to receive a message from itself with tag 99, a message that 0 did not send yet.

    Generally, it is a bad idea for a processor to send/receive messages to itself, especially using blocking calls. 0 already have the value in memory. It does not need to send it to itself.

    However, a workaround is to start the receive loop from i=1

    for(i=1; i<4; i++)
    {           
        MPI_Recv(&number, 1, MPI_INT, i, 99, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
        printf("Process 0 received number %d from i:%d\n", number, i);
    }
    

    Running the code now will give you:

    Process 1 received number -2 from process 0
    Process 2 received number -2 from process 0
    Process 3 received number -2 from process 0
    Process 0 received number 2 from i:1
    Process 0 received number 3 from i:2
    Process 0 received number 4 from i:3
    Process 0 received number -2 from process 0
    

    Note that using MPI_Bcast and MPI_Gather as mentioned by Gilles is a much more efficient and standard way for data distribution/collection.

提交回复
热议问题