【问题标题】:mpi MPI_Send() works for small data set but not large data setmpi MPI_Send() 适用于小数据集但不适用于大数据集
【发布时间】:2016-01-31 13:24:03
【问题描述】:

我最近才知道 MPI_Send 一次不能发送太长的数据,所以我决定将数据分成几部分,然后在 for 循环中发送。下面是一个测试用例。这里的问题是,如果我使用少量数据并将其分成几部分,程序就会运行;但是,当数据很长时,无论我把它分成多少块,程序都不会运行。当我运行它时,我只是听到我的电脑发出很大的噪音。所以我想知道是什么原因以及如何让 MPI_Send 将大型数据集发送到其他处理器。谢谢!

    #include<iostream>
    #include<mpi.h>
    #include<vector>
    using namespace std;

   //This set of N and N+Parts won't work 
    #define N 1024*1024*5
    #define N_PARTS 1000


   //This works 
    #define N 1024*5
    #define N_PARTS 10

    #define MASTER 0


    int main(int argc, char** argv)
    {
            int np, pid;
            vector<int> arr;
            for(int i=0; i<N; ++i) arr.push_back(i);

            int LENGTH = N/N_PARTS;
            int N_RES = N%N_PARTS;
    //      cout << LENGTH << endl;
    //      cout << N_RES << endl;          
            MPI_Init(&argc, &argv);
            MPI_Comm_size(MPI_COMM_WORLD, &np);
            MPI_Comm_rank(MPI_COMM_WORLD, &pid);

            for(int i=0; i< N_PARTS-1; ++i){
                    MPI_Send(&arr[0]+i*LENGTH,LENGTH,MPI_INT,MASTER,0,MPI_COMM_WORLD);
            }
            MPI_Send(&arr[0]+LENGTH*(N_PARTS-1),N_RES,MPI_INT,MASTER,0,MPI_COMM_WORLD);
            MPI_Finalize();
    }

【问题讨论】:

  • 这是什么意思? “我刚刚听说我的电脑发出很大的噪音”
  • 对 MPI_Recv 的调用在哪里?
  • 我没有写 MPI_Recv()。只发不收不好吗?
  • 当然不行。
  • 我的意思是程序会卡在那里并且永远不会结束。但是计算机发出很大的噪音,这意味着里面有很多执行。

标签: c++ mpi


【解决方案1】:

MPI_Send - MPI_Recv 是点对点交互。如果您从一个处理器发送数据,那么您应该在另一个处理器上接收数据。因此,您的代码必须如下所示:

if (pid == MASTER) {
    for (int i = 1; i < np; i++) {
        MPI_Send(&arr[0] + i*LENGTH, LENGTH, MPI_INT, i, 0, MPI_COMM_WORLD);
    }
} else {
    arr.resize(LENGTH);
    MPI_Recv(&arr[0], LENGTH, MPI_INT, MASTER, 0, MPI_COMM_WORLD, &status);
}

您也可以阅读有关MPI_SendMPI_Recvthis 教程。

UPD: 另外我认为你不应该在每个处理器上初始化你的数据。您可以在编号为 0 的处理器上初始化数据并将此数据发送到所有其他处理器:

if (pid == MASTER) {
    for (int i = 0; i<N; ++i) arr.push_back(i);
}

【讨论】:

    猜你喜欢
    • 2016-10-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-01
    • 2014-12-03
    • 2018-11-02
    • 1970-01-01
    • 2018-11-06
    相关资源
    最近更新 更多