MPI多个发送和接收在循环中

MPI multiple send and receive in loop

本文关键字:循环 MPI      更新时间:2023-10-16

我的代码有一个大问题,可能是概念上的。我只需要在两个不同的函数中做功。一个函数只有一个实例和它的主线程,而第二个函数在许多其他节点上有许多实例。

我的一个函数(函数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函数以及如何使用?

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

你真的在这里使用线程还是你把线程编程和消息传递混为一谈了?习惯的MPI更像是

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

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