集体对角邻里交流

时间:2018-07-18 12:19:44

标签: mpi

我有3D的笛卡尔过程拓扑。但是,我用2D来描述我的问题以简化它。

对于最近的集体通信(左图),我使用 MPI_Neighbor_alltoallw(),它允许发送和接收不同的数据类型。但是,此功能不适用于对角线邻居(右图),我需要对角线邻居的另一个功能。

Left: nearest neighbors are green neighbors. Right: red grids are nearest diagonal neighbor. 左:最近的邻居是绿色邻居。右:红色网格是最近的对角线邻居。

我想实现邻居对角线交流的是:

int main_rank;           // rank of the gray process
int main_coords[2];      // coordinates of the gray process
MPI_Comm_rank (comm_cart, &main_rank);
MPI_Cart_coords (comm_cart, main_rank, 2, main_coords);

// finding the rank of the top-right neighbor
int top_right_rank;
int top_right_coords[2] = {main_coords[0]+1, main_coords[1]+1};
MPI_Cart_rank (comm_cart, top_right_coords, &top_right_rank);

// SEND DATA: MPI_Isend(...);    
// RECEIVE DATA: MPI_Irecv(...);
// MPI_Waitall(...);

// REPEAT FOR OTHER DIAGONAL NEIGHBORS

问题

  1. MPI标准中是否存在任何集体对角邻域通信?
  2. 什么是高效且不易出错的实现?
  3. 您有什么建议可以改善我的实施方式?

1 个答案:

答案 0 :(得分:2)

这是一个常见的问题,即如何在MPI中更新幻像细胞/晕轮...实际上,有一个优雅的解决方案。...不需要对角线通讯:-)。

那么如何避免那些痛苦的对角线:-)...

让我们举一个简单的例子,说明2个托洛斯(2x2)具有4个过程和1个大小的光环。

x x x  x x x
x 1 x  x 2 x
x x x  x x x

x x x  x x x
x 3 x  x 4 x    
x x x  x x x

首先让我们在垂直方向上工作: 在这里,我们仅将数据发送到幻像单元之外。

x 3 x  x 4 x
x 1 x  x 2 x
x 3 x  x 4 x

x 1 x  x 2 x
x 3 x  x 4 x
x 1 x  x 2 x

现在让我们计算出水平方向...但是这次我们还发送了幻影单元...

x 3 x    3   x 4 x
x 1 x -> 1 ->x 2 x
x 3 x    3   x 4 x

所以我们得到:

4 3 4  3 4 3
2 1 2  1 2 1
4 3 4  3 4 3

4 1 2  1 2 1
4 3 4  3 4 3
2 1 2  1 2 1

这是一种优雅(且最有效)的方式...对角线通信被2种通信(无论如何在此过程中都需要)代替。...