为什么这样一个MPI通信的例子可以运行?

问题描述 投票:0回答:0

这是我的 MPI 程序。在这个程序的第 29 和 30 行,我分别发送了两条标记为 98 和 99 的消息,但是在第 33 和 34 行,我希望另一个程序先接收标记为 99 的消息,然后是标记为 98 的程序. 在我的理解中,因为

MPI_Send()
MPI_Recv()
是阻塞函数,所以这四行程序会陷入互相等待的情况,但是在实际运行中不会出现这种情况。在调试过程中,
MPI_Send()
功能也没有被阻止。这是为什么?

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

#define N 1

int main(int argc, char **argv) {

#ifdef DEBUG
int i = 0;
while (0 == i) {
sleep(1);
}
#endif

    int myrank, dest;
    int my_int[N], get_int[N];
    
    MPI_Status status;
    
    MPI_Init(&argc, &argv);
    MPI_Comm_rank(MPI_COMM_WORLD, &myrank);
    my_int[0] = myrank;
    get_int[0] = myrank + 1;
    dest = (myrank == 0) ? 1 : 0;
    
    if (myrank == 0) {
        MPI_Send(my_int, N, MPI_INT, dest, 98, MPI_COMM_WORLD);
        MPI_Send(get_int, N, MPI_INT, dest, 99, MPI_COMM_WORLD);
    } else {
        printf("myrank: %d my_int = %d get_int = %d.\n", myrank, my_int[0],
               get_int[0]);
        MPI_Recv(get_int, N, MPI_INT, 0, 99, MPI_COMM_WORLD, &status);
        MPI_Recv(my_int, N, MPI_INT, 0, 98, MPI_COMM_WORLD, &status);
        printf("myrank: %d my_int = %d get_int = %d.\n", myrank, my_int[0],
               get_int[0]);
    }
    
    MPI_Finalize();
    return 0;

}
mpirun -n 2 ./debug.out
myrank: 1 my_int = 1 get_int = 2.
myrank: 1 my_int = 0 get_int = 1.

我认为这个程序打开了两个进程会进入死锁状态,但他们没有。

mpi mpich
© www.soinside.com 2019 - 2024. All rights reserved.