Parallel processing 什么是「;资料来源;及;目的地“;MPI\u车\u班次中的参数?

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_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_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
的角度执行相同操作:process
A3
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