Parallel processing 什么是「;资料来源;及;目的地“;MPI\u车\u班次中的参数?
有人写道,MPI_Cart_shift的输出参数是源进程和目标进程的秩。但是,在(下面的代码)中,作为源进程返回的内容稍后在MPI_Isend中用于发送消息。任何人都可以弄清楚,“来源”和“目的地”到底是什么意思Parallel processing 什么是「;资料来源;及;目的地“;MPI\u车\u班次中的参数?,parallel-processing,mpi,Parallel Processing,Mpi,有人写道,MPI_Cart_shift的输出参数是源进程和目标进程的秩。但是,在(下面的代码)中,作为源进程返回的内容稍后在MPI_Isend中用于发送消息。任何人都可以弄清楚,“来源”和“目的地”到底是什么意思 #包括“mpi.h” #包括 #定义尺寸16 #向上定义0 #下定义1 #定义左2 #定义权利3 int main(argc、argv) int-argc; char*argv[];{ int numtask,秩,源,目标,突发,i,标记=1, inbuf[4]={MPI_PROC_N
#包括“mpi.h”
#包括
#定义尺寸16
#向上定义0
#下定义1
#定义左2
#定义权利3
int main(argc、argv)
int-argc;
char*argv[];{
int numtask,秩,源,目标,突发,i,标记=1,
inbuf[4]={MPI_PROC_NULL,MPI_PROC_NULL,MPI_PROC_NULL,MPI_PROC_NULL,},
nbrs[4],dims[2]={4,4},
句点[2]={0,0},重新排序=0,坐标[2];
MPI_请求要求[8];
MPI_状态统计数据[8];
MPI_通信卡通信;
MPI_Init(&argc,&argv);
MPI通信大小(MPI通信世界和numtasks);
如果(numtasks==大小){
MPI_购物车创建(MPI_COMM_WORLD、2、dims、期间、重新订购和购物车通讯);
MPI通信等级(cartcomm和rank);
MPI_Cart_coords(cartcomm,排名2,coords);
MPI车轮班(车通信、0、1和NBR[上升]、NBR[下降]);
MPI车轮班(车通信、1、1和NBR[左]、NBR[右]);
printf(“秩=%d坐标=%d%d个邻居(u、d、l、r)=%d%d%d\n”,
排名、坐标[0]、坐标[1]、NBR[UP]、NBR[DOWN]、NBR[LEFT],
丁腈橡胶[右];
F=等级;
for(i=0;i:返回给定移位方向和移位量的移位源和目标列组
int MPI_Cart_shift(MPI_Comm comm, int direction, int displ, int *source, int *dest)
你交给函数的是comm
,方向
和位移
。其中方向
指定位移的尺寸。位移
位置是距离
例子
设想这样的2D购物车拓扑(名称不是列组,而是进程名称,仅供解释):
正如您可能已经了解的,您正在用MPI编写代码,因此我们现在可以选择一个进程来显示正在发生的事情。让我们选择C3
MPI\u Cart\u shift
的总体思想是,我们获得拓扑中指定进程的排名
首先,我们必须决定我们要走的方向,让我们选择0
,这是列维度。
然后我们必须指定到另一个进程的距离,假设这是2
所以这个电话是这样的:
MPI_Cart_shift(cartcomm, 0, 2, &source, &dest);
现在,放入源
和dest
变量的列组分别是A3
和E3
过程的列组
如何解释结果
我(C3
)希望以2的距离将数据发送到同一列中的进程。因此这是dest
列
如果您从A3
的角度执行相同操作:processA3
将dest
字段的级别设置为C3
这就是source
所说的:如果调用相同的MPI\u Cart\u shift
,那么发送给我这些数据的进程的级别是多少
如果指定位置没有进程,则变量包含MPI\u PROC\u NULL
。
因此,每个进程的调用结果如下所示(每个进程的source | dest使用-
表示MPI_PROC_NULL
):
附加信息位
如果使用任何维度集创建购物车periods=1
,则购物车的第一个和最后一个节点之间存在虚拟边缘。在本例中,periods[0]=1将在A1
和E1
之间建立连接,A2
和E2
之间建立连接,依此类推。如果您随后调用MPI\u Cart\u shift
,则计数必须围绕各个角落进行,以便您的输出为:
A1 A2 A3 A4 A5
D1|C1 D2|C2 D3|C3 D4|C4 D5|C5
B1 B2 B3 B4 B5
E1|D1 E2|D2 E3|D3 E4|D4 E5|D5
C1 C2 C3 C4 C5
A1|E1 A2|E2 A3|E3 A4|E4 A5|E5
D1 D2 D3 D4 D5
B1|A1 B2|A2 B3|A3 B4|A4 B5|A5
E1 E2 E3 E4 E5
C1|B1 C2|B2 C3|B3 C4|B4 C5|B5
MPI\u Cart\u shift
是一种方便的功能。它的主要用途是用于数据转移,即每个列组向特定方向发送数据(即发送到目的地
)并从相反方向接收数据(即从源
)的操作(正向操作)。当源
用作目的地,而目的地
用作源时,数据会以相反的方向流动(向后操作)。这种操作的一个例子是,通常需要沿每个维度进行两次移位-一次向前,一次向后
MPI\u Cart\u shift
是一个方便的函数,因为它的操作相当于以下一组MPI调用:
//1.确定当前进程的排名
整数秩;
MPI通信等级(cartcomm和rank);
//2.将秩转换为拓扑坐标
国际合作组织;
MPI_Cart_coords(cartcomm、rank、NDIM、coords);
//3.沿给定方向保存当前坐标
int saved_coord=coords[direction];
//4.计算“+”移位位置并转换为秩
坐标[方向]=保存的坐标+显示;
//如有必要,调整周期边界
如果(周期[方向])
坐标[方向]]=dims[方向];
//5.转为军衔
MPI车级(车通信、协调和目的地);
//6.计算“-”移位位置并转换为秩
坐标[方向]=保存的坐标-显示;
//调整周期边界
如果(周期[方向])
坐标[方向]]=dims[方向];
//7.转为军衔
MPI_Cart_排名(cartcomm、coords和source);
还可以使用算术计算rankcoordinate变换,而无需调用MPI\u Cart\u rank
或MPI\u Cart\u coords
,但当拓扑的维数发生变化时,公式会发生变化,这将是非常不灵活的
非常重要的事情。MPI\u Cart\u shift
(或上述等效代码)计算的列组与cartcomm
通信器相关。这些列组与原始通信器中的列组匹配(在MPI\u Cart\u创建中使用的列组)
)仅当reorder=0
时,当允许重新排序时,列组可能不同,因此不应在
MPI_Cart_shift(cartcomm, 0, 2, &source, &dest);
MPI_Cart_shift(cartcomm, 0, 2, &source, &dest);
A1 A2 A3 A4 A5
-|C1 -|C2 -|C3 -|C4 -|C5
B1 B2 B3 B4 B5
-|D1 -|D2 -|D3 -|D4 -|D5
C1 C2 C3 C4 C5
A1|E1 A2|E2 A3|E3 A4|E4 A5|E5
D1 D2 D3 D4 D5
B1|- B2|- B3|- B4|- B5|-
E1 E2 E3 E4 E5
C1|- C2|- C3|- C4|- C5|-
A1 A2 A3 A4 A5
D1|C1 D2|C2 D3|C3 D4|C4 D5|C5
B1 B2 B3 B4 B5
E1|D1 E2|D2 E3|D3 E4|D4 E5|D5
C1 C2 C3 C4 C5
A1|E1 A2|E2 A3|E3 A4|E4 A5|E5
D1 D2 D3 D4 D5
B1|A1 B2|A2 B3|A3 B4|A4 B5|A5
E1 E2 E3 E4 E5
C1|B1 C2|B2 C3|B3 C4|B4 C5|B5