考虑一个网格,其进程中的二进制文件被分解。图像中的数字是流程的排名。
在每个时间步,一些点移位,因此需要将它们发送到新目的地。该点发送由具有替换点的所有进程完成。在图像中,仅显示左下角仓的点作为示例。
我不知道一个进程应该多长时间监听接收消息?问题是接收者甚至不知道消息是否会到达,因为没有任何点可能传递到其区域。
另请注意,点的来源和目的地可能与蓝点相同。
编辑:以下是表达问题的不完整代码。
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;}
}
}
答案 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;
}