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