【问题标题】:MPI multiple send and receive in loopMPI多重发送和接收循环
【发布时间】:2015-08-16 21:52:39
【问题描述】:

我的代码有一个大问题,也许是概念上的问题。我所需要的只是在两个不同的功能中完成工作。一个函数只有一个实例及其主线程,而第二个函数在许多其他节点上有许多实例。

我的一个函数(函数 A)正在向所有节点发送 3 部分数据,而另一个函数 B 应该在每个节点上接收它。接下来,函数 A 应该等待结果。当它们准备就绪时,每个节点中的函数 B 应将一部分数据发送给函数 A,然后一切重新开始。

它应该像这个示例代码一样工作:

void prepareData() { //function A
  for(int i = 1 ; i < threads;i++) {
    MPI_Send(...); //first part of data
    MPI_Send(...); //second part of data
    MPI_Send(...); //third part of dat
  }
  //Here this function (A) should wait because second function (B) is computing data
  for(int i=1;i<threads;i++) {
    MPI_Recv(...); //receiving data from function B
  }
}

void computeData() { //function B
  while(isDone) {
    MPI_Recv(...); //first part of data
    MPI_Recv(...); //second part of data
    MPI_Recv(...); //third part of data
  //Here all this data are computed and then sending to main function
    MPI_Send(...); //sending data to function A
 }
}

有谁知道如何做到这一点以及我应该使用哪个 MPI 函数以及如何使用?

【问题讨论】:

  • 你尝试的时候发生了什么?为什么它不起作用?

标签: c++ mpi


【解决方案1】:

那么,当您尝试您描述的方法时会发生什么?

您真的在这里使用线程还是将线程编程与消息传递混为一谈?惯用的 MPI 会更像

for(int i = 1 ; i < nprocs;i++) {
...
}

SEND 可能会阻塞,因此您应该使用 ISEND 并测试/等待完成。

【讨论】:

  • 经过多次尝试后,我决定使用 MPI_Bcast 并将其与 MPI_Barrier“连接”。现在沟通很好。因此,对于任何有沟通问题的人来说,一个小提示是“使用 MPI_Barrier”。
  • 我很高兴“使用 MPI_Barrier”为您带来了不错的结果,但这通常表明您的代码中发生了其他事情。 MPI_BARRIER 进入 MPI 进度引擎,但它也做了很多。我建议您围绕那个神奇的 MPI_Barrier 发表一个重要评论,以便有一天当您(或在您离开后接手的可怜人!)想知道为什么您的代码无法扩展时,您可以(也许)找到开始调查的地方.
  • 我用 MPI 解决了我的问题。我在数据转换时出错,这是我所有问题的原因,现在一切正常。
猜你喜欢
  • 1970-01-01
  • 2013-12-20
  • 2013-04-15
  • 2018-03-12
  • 2016-06-15
  • 2012-03-13
  • 2014-03-16
  • 2011-07-04
  • 2016-10-03
相关资源
最近更新 更多