MPI 在您使用 MPI_STATUS 接收消息时找出发件人

MPI figuring out the sender when you recieve message using MPI_STATUS

所以我正在尝试用 MPI 玩烫手山芋,但我在使用 MPI_STATUS 时遇到了问题。这是我的代码

MPI_Status status;
if(rank == 0) {
        printf("Sending %d from %d to %d\n", variable, rank, sender);
        sleep(3);
        MPI_Send(&variable, 1, MPI_INT, sender, 0, MPI_COMM_WORLD);
    }
    do{
        srand(time(NULL));
        MPI_Recv(&variable, 1, MPI_INT, MPI_ANY_SOURCE, 0, MPI_COMM_WORLD, &status);
        sender = status.MPI_SOURCE;
        printf("sender is %s\n", status.MPI_SOURCE);
        printf("Recieved %d from %d at %d\n", variable, sender, rank);
        sleep(3);

        do{
            receiver = rand() % world_size;
            printf("reveiver is %d\n", receiver);
        } while (receiver != sender);// confirms its not sending it back to the original sender and assuming world_size is greater than 2  

        printf("Sending %d from %d to %d\n", variable, rank, sender);
        sleep(3);
        MPI_Send(&variable, 1, MPI_INT, receiver, 0, MPI_COMM_WORLD);



    }while (1 == 1);

但是当我 运行 它时,我得到的是下面。我不确定出了什么问题。

mpirun -np 4 a.out
Sending 10 from 0 to 3
sender is (null)
Recieved 10 from 0 at 3
reveiver is 1
reveiver is 2
reveiver is 2
reveiver is 3
reveiver is 0
Sending 10 from 3 to 0
[cs2:15514] *** Process received signal ***
[cs2:15514] Signal: Segmentation fault (11)
[cs2:15514] Signal code: Address not mapped (1)
[cs2:15514] Failing at address: 0x3

根据MPI_Status structure - Message Passing Interface | Microsoft Docs

结构 MPI_StatusMPI_SOURCE 成员的类型是 int

另一方面,您使用 %s 打印行中的值

        printf("sender is %s\n", status.MPI_SOURCE);

这会调用未定义的行为%s 需要类型为 char* 的数据。

您应该使用 %d 而不是打印值。