利用发送MPI_SEND和MPI_RECV没有完成大的std ::矢量(Sending large

2019-10-18 15:01发布

我试图发送使用MPI一个std :: vector的。 此工作正常时,矢量小,但是当载体是大是行不通的(超过〜15K的矢量双打)。 当试图发送一个向量与20K双打,该方案只是在100%的CPU坐在那里。

下面是一个小例子,

#include <vector>
#include <mpi.h>

using namespace std;

vector<double> send_and_receive(vector<double> &local_data, int n, int numprocs, int my_rank) {
    MPI_Send(&local_data[0], n, MPI_DOUBLE, 0, 0, MPI_COMM_WORLD);

    if (my_rank == 0) {
        vector<double> global_data(numprocs*n);
        vector<double> temp(n);
        for (int rank = 0; rank < numprocs; rank++) {
            MPI_Recv(&temp[0], n, MPI_DOUBLE, rank, 0, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
            for (int i = 0; i < n; i++) {
                global_data[rank*n + i] = temp[i];
            }
        }
        return global_data;
    }
    return vector<double>();
}

int main(int args, char *argv[]) {
    int my_rank, numprocs;
    // MPI initialization
    MPI_Init (&args, &argv);
    MPI_Comm_rank (MPI_COMM_WORLD, &my_rank);
    MPI_Comm_size (MPI_COMM_WORLD, &numprocs);

    int n = 15000;
    vector<double> local_data(n);

    for (int i = 0; i < n; i++) {
        local_data[i] = n*my_rank + i;
    }

    vector<double> global_data = send_and_receive(local_data, n, numprocs, my_rank);

    MPI_Finalize();

    return 0;
}

我编译使用

mpic++ main.cpp

并运行使用

mpirun -n 2 a.out

当我运行n = 15000程序成功完成,但与n = 17000n = 20000它永远不会完成,和两个CPU的100%,直到坐我强制关闭程序。

有谁知道是什么问题?

Answer 1:

MPI_Send是一个有趣的电话。 如果有足够的内部缓冲区存储输入,它可能会返回-它使的唯一保证是输入缓冲是不会被MPI进一步需要。 然而,如果没有足够的内部的缓冲器空间,该调用将阻塞,直到相反MPI_Recv呼叫开始接收数据。 看到这是怎么回事? 这两个过程后MPI_Send阻断由于缓冲器空间不足。 当调试问题这样的,它有助于取代MPI_SendMPI_Ssend

你可能的解决方案是:

  • 使用缓冲后发送, MPI_Bsend
  • 使用MPI_Sendrecv
  • 替代发送/ recv的一对,使每个发送具有匹配的recv(例如奇PROC发送,即使RECVS,然后反之亦然)。
  • 使用非阻塞发送, MPI_Isend

见http://www.netlib.org/utk/papers/mpi-book/node39.html



文章来源: Sending large std::vector using MPI_Send and MPI_Recv doesn't complete
标签: mpi stdvector