MPI发送/recv的向量

MPI send/recv of a vector

本文关键字:向量 recv 发送 MPI      更新时间:2023-10-16

大家好,我正在为大学涉及使用MPI库的一个项目,不幸的是,我无法分享整个代码,但我希望有人能给我一些指针。我需要将一个从proc x发送到proc 0的数组,但是当我在Google上阅读时,发送dinamycced创建的数组的唯一方法是找出大小,将大小发送到Proc 0,然后发送阵列(我无法预先确定它的大小(,所以这就是我在Proc X:

上所做的。
vector<int> tosend = aglib.ExtractEvaluationFunctions();
int tosend_size = tosend.size();
MPI_Send(&tosend_size, 1, MPI_INT, 0, 666, MPI_COMM_WORLD);
MPI_Send(&tosend, tosend_size, MPI_INT, 0, 777, MPI_COMM_WORLD);

这是Proc 0上发生的情况(我无法共享与向量Tosend在Proc1中本地创建的相同缓冲区(:

 vector<int> results_and_rank;
 int results_rank_size;
 MPI_Recv(&results_rank_size, 1, MPI_INT, MPI_ANY_SOURCE, 666, MPI_COMM_WORLD, &status);
 MPI_Recv(&results_and_rank, results_rank_size, MPI_INT, MPI_ANY_SOURCE, 777, MPI_COMM_WORLD, &status); 
 cout << "size of results_and_rank is :"<< results_and_rank.size()endl;
 cout<< "last element of array is :"<< results_and_rank.back()<<endl;

我认为通信效果很好,因为我能够读取与我发送的矢量相同的接收向量的大小,但是每当我尝试访问array rastem_and_rank的一个元素时,我的代码就会崩溃打印。顺便说一句,我需要将阻止通信用于我的项目。
我想念什么吗?谢谢您的时间和帮助。

您要将 data 接收到向量,因此您需要向量内部的数据,而不是向量本身。

在这里,您将std::vector本身的地址传递给MPI_Recv(),该地址将损坏std::vector

MPI_Recv(&results_and_rank, results_rank_size, MPI_INT, MPI_ANY_SOURCE, 777, MPI_COMM_WORLD, &status);

正确的方式:

发件人:

MPI_Send(&tosend[0], tosend_size, MPI_INT, 0, 777, MPI_COMM_WORLD);

接收器:

results_and_rank.resize(results_rank_size);
MPI_Recv(&results_and_rank[0], results_rank_size, MPI_INT, MPI_ANY_SOURCE, 777, MPI_COMM_WORLD, &status);