我有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
答案 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种通信(无论如何在此过程中都需要)代替。...