MPI_Recv在接收大型阵列时挂起

时间:2017-02-06 17:30:21

标签: mpi deadlock

我用一段非常简单的MPI代码注意到一些奇怪的行为:

#include <mpi.h>

int main(int argc, char* argv[])
{
    // Initialize the MPI environment
    MPI_Init(NULL, NULL);

    int world_rank;
    MPI_Comm_rank(MPI_COMM_WORLD, &world_rank);
    int world_size;
    MPI_Comm_size(MPI_COMM_WORLD, &world_size);

    // We are assuming at least 2 processes for this task
    if (world_size != 2)
    {
        std::cout << "World size must be equal to 1" << std::endl;
        MPI_Abort(MPI_COMM_WORLD, 1);
    }

    int numberCounter = 10000;
    double number[numberCounter];

    if (world_rank == 0)
    {
        std::cout << world_rank << std::endl;
        MPI_Send(number, numberCounter, MPI_DOUBLE, 1, 0, MPI_COMM_WORLD);
    }
    else if (world_rank == 1)
    {
        std::cout << world_rank << std::endl;
        MPI_Recv(number, numberCounter, MPI_DOUBLE, 0, 0, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
    }

    MPI_Finalize();
}

如果numberCounter很小(~1000),上述工作正常。但是当值较大(> 10000)时,代码挂起并且永远不会到达结尾。使用MPI_Iprobe会标记排名1已收到消息,但MPI_Recv始终挂起。

可能导致这种情况的原因是什么?其他人可以重现这种行为吗?

1 个答案:

答案 0 :(得分:0)

我立即看到2个问题:

1)您正在使用相当大的静态数组。

int numberCounter = 10000;
int number[numberCounter];

根据您的机器,这可能会导致堆栈溢出。 Segmentation fault on large array sizes

如果是这种情况,请使用动态数组。在C中,使用mallocfree。在C++中,我不是100%肯定newdelete可以很好地使用MPI功能,但它应该可行。在C ++上,您还可以考虑使用Boost MPI库,它与STL容器(如std :: vector)一起使用。 http://www.boost.org/doc/libs/1_62_0/doc/html/mpi.html

2)您的发送和接收缓冲区numberint数组,而MPI函数被指示使用MPI_DOUBLE类型。

MPI类型应与数组类型匹配,因此请使用(doubleMPI_DOUBLE)或(intMPI_INT)。