我找到了this program,我的问题是......是否可以在这个程序中改变沟通和社区?
我需要在处理器之间将2D数组划分为4个块(在每个块上只有一个进程可以工作)。另外我必须使用格子模型模板(9分),而不是在康威生命游戏中(5分模板)
我不确定,MPI中的2d笛卡尔虚拟拓扑是否为交换数据提供了超过4个方向的使用。也许我应该使用图表?而且我不知道如何在瓷砖/光环/鬼魂之间的对角线方向上找不到任何关于交换数据的信息。有人可以解释一下吗?我真的需要帮助:(
答案 0 :(得分:3)
MPI中的虚拟拓扑只是将抽象坐标映射到排名的机制,反之亦然。这两个进程不是笛卡尔拓扑中的邻居,并不能阻止它们进行通信。
你没有找到关于对角晕交换的任何信息的原因是因为它没有必要明确地做,因为它发生作为常规晕交换的副作用当本地晕圈细胞也包括在交换中
以下说明了如何实现典型的2D光环交换。密切关注用大写字母表示的元素如何移动。源列/行标记为双v
/ <
,目标列标记为v
/ <
。
初始配置
...... ...... ......
.aaaa. .bbbb. .cccc.
.aaaa. .bbbb. .cccc.
.aaaA. .BbbB. .Cccc.
...... ...... ......
...... ...... ......
.dddD. .EeeE. .Ffff.
.dddd. .eeee. .ffff.
.dddd. .eeee. .ffff.
...... ...... ......
沿第一维向正方向进行Halo交换:
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.
...... ...... ......
沿第二维向正方向进行Halo交换:
...... ...... ......
.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
调用可以轻松实现每个步骤。因此,在2D情况下,每个方向需要两个MPI_Sendrecv
,总共四个调用。使用MPI_Cart_shift
可以轻松获得要发送/接收的等级。必须使用的另一个MPI功能是矢量数据类型(MPI_Type_vector
),它允许访问C / C ++数组的列。使用三维或更高维拓扑,MPI_Type_create_subarray
函数非常方便。
答案 1 :(得分:0)
您可以通过以下两个同步步骤进行通信:
分别向上和向下发送上下行边界节点。
向左右邻居发送边界节点的扩展左右列(即处理器拥有的边界节点以及刚收到的每个边界列的顶部和底部节点)
将此通信与处理器内部节点上所需的计算重叠将是有益的。