MPI 中的虚拟拓扑只是一种将抽象坐标映射到等级的机制,反之亦然。两个进程在笛卡尔拓扑中不是邻居并不妨碍它们进行通信。
您没有找到关于对角光环交换的任何信息的原因是,完全没有必要明确地这样做,因为当本地光环单元也包含在交换中时,它会作为常规光环交换的副作用发生.
以下说明了如何实现典型的 2D 光环交换。密切注意用大写字母表示的元素如何移动。源列/行标有双 v/<,目标列/行标有单 v/<。
初始配置
...... ...... ......
.aaaa. .bbbb. .cccc.
.aaaa. .bbbb. .cccc.
.aaaA. .BbbB. .Cccc.
...... ...... ......
...... ...... ......
.dddD. .EeeE. .Ffff.
.dddd. .eeee. .ffff.
.dddd. .eeee. .ffff.
...... ...... ......
沿第一维正方向的光环交换:
v v
v v v v
...... ...... ......
.aaaa. abbbb. bcccc.
.aaaa. ---> abbbb. ---> bcccc.
.aaaA. ABbbB. BCccc.
...... ...... ......
...... ...... ......
.dddD. DEeeE. EFfff.
.dddd. ---> deeee. ---> effff.
.dddd. deeee. effff.
...... ...... ......
沿第一维负方向的光环交换:
v v
v v v v
...... ...... ......
.aaaab abbbbc bcccc.
.aaaab <--- abbbbc <--- bcccc.
.aaaAB ABbbBC BCccc.
...... ...... ......
...... ...... ......
.dddDE DEeeEF EFfff.
.dddde <--- deeeef <--- effff.
.dddde deeeef effff.
...... ...... ......
沿第二维正方向的光环交换:
...... ...... ......
.aaaab abbbbc bcccc.
.aaaab abbbbc bcccc.
.aaaAB ABbbBC BCccc. <<
...... ...... ......
| | |
v v v
.aaaAB ABbbBC BCccc. <
.dddDE DEeeEF EFfff.
.dddde deeeef effff.
.dddde deeeef effff.
...... ...... ......
沿第二维负方向的光环交换:
...... ...... ......
.aaaab abbbbc bcccc.
.aaaab abbbbc bcccc.
.aaaAB ABbbBC BCccc.
.dddDE DEeeEF EFfff. <
^ ^ ^
| | |
.aaaAB ABbbBC BCccc.
.dddDE DEeeEF EFfff. <<
.dddde deeeef effff.
.dddde deeeef effff.
...... ...... ......
重要的是,对于在第一个维度之后沿所有维度进行的光环交换,整个平板(包括局部光环单元)都会被交换。为简单起见,通常在第一次交换中也包括晕细胞。
每个步骤都可以使用单个MPI_Sendrecv 调用轻松实现。因此,在二维情况下,每个方向需要两个MPI_Sendrecv,总共需要四个调用。使用MPI_Cart_shift 可以轻松获得发送/接收的排名。另一个必须使用的 MPI 特性是向量数据类型 (MPI_Type_vector),它允许访问 C/C++ 数组的列。对于三维或更高维拓扑,MPI_Type_create_subarray 函数会派上用场。