gpt4 book ai didi

c++ - 无法通过 MPI_send 发送整个 vector

转载 作者:行者123 更新时间:2023-11-30 02:33:13 25 4
gpt4 key购买 nike

我一直在努力学习 MPI。当我尝试运行以下代码时,我得到了错误的输出。

if (world_rank == 0){

vector<vector<double> > n(4,vector<double>(4));

srand(time(NULL));

for(int i=0; i<4 ;i++){
for(int j=0;j<4;j++){
n[i][j] = (double)rand()/RAND_MAX;
cout << n[i][j] << " ";
}
cout << endl;
}
MPI_Send((void*)&n[0][0],16*sizeof(double),MPI_BYTE,1,0,MPI_COMM_WORLD);
}else{
MPI_Status status;

vector<vector<double> > n(4,vector<double>(4));

MPI_Probe(0,0,MPI_COMM_WORLD,&status);

int size;

MPI_Get_count(&status,MPI_BYTE,&size);

cout << endl << size << endl;

MPI_Recv((void*)&n[0][0],16*sizeof(n[0][0]),MPI_BYTE,0,0,MPI_COMM_WORLD,MPI_STATUS_IGNORE);

cout.flush();
cout << endl;

for(int i=0; i<4 ;i++){
for(int j=0;j<4;j++){
cout << n[i][j] << " ";
}
cout << endl;
}
}

我得到除最后 3 个之外的所有 double 值。像这样。

0.824468 0.752417 0.757125 0.470763 
0.251683 0.703306 0.157991 0.764423
0.815327 0.0402807 0.897109 0.313816
0.997203 0.796665 0.0522305 0.797733

128

0.824468 0.752417 0.757125 0.470763
0.251683 0.703306 0.157991 0.764423
0.815327 0.0402807 0.897109 0.313816
0.997203 0 0 0

谁能告诉我为什么会这样?我将相同的代码运行了大约一百次,仍然得到相同的输出(当然具有不同的值),但最后三个始终为 0。

但是当我将大小从 16 更改为 19 时,我得到了所有值。

我还有一个疑问。有时输出(来自节点 0 和 1 的值)会重叠。任何人都可以告诉我如何阻止它或至少解释为什么会发生这种情况。我的意思是即使 send 和 recv 是阻塞函数。如何在节点 0 之前打印节点 1 的输出

最佳答案

您对二维数据的定义n作为vector<vector<double> >使其在内存中不连续。因此,您不能简单地使用 MPI 传输它(有一些方法可以做到这一点,但您最好只让内存连续)。

为了让你的内存连续,你可以声明你的 n像这样(未测试):

vector<double> ndata(4*4); //contiguous storage of the actual data
vector<double*> n(4); //vector of pointers to access the actual data
for (int i=1; i<4; i++) //initialisation of the pointers to the data
n[i] = &ndata[4*i];

当然,在 C++ 中为多维数组定义连续存储有更好的方法,但这只是解决您眼前问题的快速方法。参见示例 this answer以获得更好的结构。

顺便说一句,你的MPI_Send()MPI_Recv()调用应使用 4*4 MPI_DOUBLE而不是 4*4*sizeof(double) MPI_BYTE .

关于c++ - 无法通过 MPI_send 发送整个 vector ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35731037/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com