MPI_SendRecv 执行时死锁

时间:2021-02-10 20:35:19

标签: mpi

我正在尝试使用 MPI_Sendrecv 以环形方式将信息从一个处理器发送到另一个处理器,但我遇到了死锁。我的代码有什么问题?基本上我需要使用 MPI_SendRecv 来解决这种问题。

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

int main (int argc, char *argv[])
{
    int offset = 9;
    int size, rank, value, next, prev, sendval, recval, namelen;
    double t0, t;
    char processor_name[MPI_MAX_PROCESSOR_NAME];
    MPI_Status status;

    MPI_Init(&argc, &argv);
    MPI_Comm_size(MPI_COMM_WORLD, &size);
    MPI_Comm_rank(MPI_COMM_WORLD, &rank);
    MPI_Get_processor_name(processor_name, &namelen);

    value = 5;

    if (size > 1)
    {
        next = (rank + 1)% size;
        prev = (size+rank - 1)% size;

        sendval = value + rank;

        if (rank == offset)
        {
            MPI_Sendrecv(&sendval, 1, MPI_INT, next, 1, &recval, 1, MPI_INT, prev, 10, MPI_COMM_WORLD, &status);
        }
        else
        {
     
            MPI_Recv(&recval, 1, MPI_INT, prev, 10, MPI_COMM_WORLD, &status);
            MPI_Send(&sendval, 1, MPI_INT, next, 10, MPI_COMM_WORLD);
   
        }
    }

    MPI_Finalize();
    return 0;
}

1 个答案:

答案 0 :(得分:0)

您的消息标签不匹配:

MPI_Sendrecv(&sendval, 1, MPI_INT, next, 1, &recval, 1, MPI_INT, prev, 10, MPI_COMM_WORLD, &status);
//                                       ^
...     
MPI_Recv(&recval, 1, MPI_INT, prev, 10, MPI_COMM_WORLD, &status);
//                                  ^^

发送-接收操作的发送部分中的标签也应该是10