进程如何知道何时停止收听?

时间:2017-01-27 13:45:37

标签: c++ mpi boost-mpl

考虑一个网格,其进程中的二进制文件被分解。图像中的数字是流程的排名。

在每个时间步,一些点移位,因此需要将它们发送到新目的地。该点发送由具有替换点的所有进程完成。在图像中,仅显示左下角仓的点作为示例。

我不知道一个进程应该多长时间监听接收消息?问题是接收者甚至不知道消息是否会到达,因为没有任何点可能传递到其区域。

另请注意,点的来源和目的地可能与蓝点相同。

enter image description here

编辑:以下是表达问题的不完整代码。

void transfer_points()
{
    world.isend(dest, ...);
    while (true)
    {
        mpi::status msg = world.iprobe(any_source, any_tag);
        if (msg.count() != 0)
        {
            world.irecv(any_source, ...);
        }

        // but how long keep probing?
        if (???) {break;}            
    }
}

1 个答案:

答案 0 :(得分:1)

您是否熟悉通过MPI_Win_ *操作的单面MPI或RMA(远程内存访问)?我理解你的问题的方式,它应该可以用它整齐地解决:

  • 发送一些积分的等级只是将它放入另一个等级的记忆(窗口)。
  • 接收者直接进入障碍,现在拥有数据

以下是使用RMA发送环的示例(使用c ++语法!)。在你的情况下,它只需要一些小修改,我。即只在必要时调用MPI_Put,并且有关写入缓冲区的偏移量的数学运算。

#include <iostream>
#include "mpi.h"

int main(int argc, char* argv[]) {

  MPI::Init(argc,argv);    
  int rank = MPI::COMM_WORLD.Get_rank();
  int comm_size = MPI::COMM_WORLD.Get_size();    
  int neighbor_left = rank - 1;
  int neighbor_right = rank + 1; 

  //Left and right most are neighbors.
  if(neighbor_right >= comm_size) { neighbor_right = 0;}
  if(neighbor_left < 0) {neighbor_left = comm_size - 1;}

  int postbox[2];
  MPI::Win window = MPI::Win::Create(postbox,2,sizeof(int),MPI_INFO_NULL,MPI::COMM_WORLD);

  window.Fence(0);     
  // Put my rank in the second entry of my left neighbor (I'm his right neighbor)
  window.Put(&rank,1,MPI_INT,neighbor_left,1,1,MPI_INT);
  window.Fence(0);    
  // Put my rank in the first entry of my right neighbor (I'm his left neighbor)
  window.Put(&rank,1,MPI_INT,neighbor_right,0,1,MPI_INT);
  window.Fence(0);

  std::cout << "I'm rank = " << rank << " my Neighbors (l-r) are " << postbox[0] << " " << postbox[1] << std::endl;

  MPI::Finalize();  
  return 0;
}