【问题标题】:MPI send/recv of a vector向量的 MPI 发送/接收
【发布时间】:2018-07-21 04:55:39
【问题描述】:

大家好,我正在为一个涉及使用 MPI 库的大学项目工作,不幸的是我无法分享整个代码,但我希望有人能够无论如何都给我一些指点。 我需要将一个数组从 proc X 发送到 proc 0,但是正如我在 google 上所读到的,发送一个动态创建的数组的唯一方法是找出大小,将大小发送到 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 上发生的事情(我不能共享相同的缓冲区,因为每次在 Proc1 中本地创建向量 tosend):

 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;

我认为通信工作正常,因为我能够读取接收到的向量的大小,这与我发送的向量相同,但是每当我尝试访问数组 results_and_rank 的元素时我的代码就会崩溃,从而在最后一次崩溃打印。 顺便说一句,我需要为我的项目使用阻塞通信。
我错过了什么吗?感谢您的时间和帮助。

【问题讨论】:

    标签: c++ arrays vector parallel-processing mpi


    【解决方案1】:

    您想将 数据 发送/接收到向量,因此您需要向量内的数据,而不是向量本身。

    在这里您将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); 
    

    【讨论】:

      猜你喜欢
      • 2018-03-12
      • 2018-12-04
      • 2017-03-04
      • 2013-04-15
      • 1970-01-01
      • 2012-08-24
      • 2013-12-20
      • 2018-08-30
      • 2016-06-15
      相关资源
      最近更新 更多