【问题标题】:Collective diagonal neighborhood communication集体对角邻里交流
【发布时间】:2019-04-25 09:17:25
【问题描述】:

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

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

左:最近的邻居是绿色邻居。右:红色网格是最近的对角线邻居。

实现对角邻居通信的想法是:

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. 您有什么建议可以让我的实现更好吗?

【问题讨论】:

  • 您可以创建一个图形拓扑,其中对角线连接是边并继续使用MPI_Neighbor_alltoallw。
  • @Zulan 感谢您的回复。这肯定是我所要求的有效解决方案。

标签: mpi


【解决方案1】:

这是一个常见的问题,即如何在 MPI 中更新幽灵单元/光晕......事实上,这个问题有一个优雅的解决方案......不需要对角线通信 :-)。

那么如何在没有那些痛苦的对角线的情况下做到这一点:-)...

让我们做一个 2-torus (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 通信取代(无论如何在此过程中都需要)......

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-03-15
    • 2014-10-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-25
    • 2014-03-07
    相关资源
    最近更新 更多