[英]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_Send
和MPI_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.