簡體   English   中英

mpi MPI_Send()適用於小型數據集,但不適用於大型數據集

[英]mpi MPI_Send() works for small data set but not large data set

我最近才了解到,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_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_Recv 教程。

UPD :另外,我認為您不應該在每個處理器上初始化數據。 您可以在編號為0的處理器上初始化數據,並將此數據發送到所有其他處理器:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM