6.5.5笛卡尔轮换定位 |
![]() ![]() |
如果进程拓扑是笛卡尔结构,MPI_SENDRECV操作用于在坐标方向上执行数据轮换。作为输入,MPI_SENDRECV将源进程的标识数作为接受,目标进程的标识数作为发送。如果一个笛卡尔进程组调用函数MPI_CART_SHIFT,那么此函数将上面的标识符提供给调用进程,然后将其传送给MPI_SENDRECV。用户说明坐标方向和步长(正数或负数)。此函数是居域的。
MPI_CART_SHIFT(comm, direction, disp, rank_source, rank_dest)
IN comm 带有笛卡尔结构的通信子(句柄)
IN direction 轮换的坐标维(整数)
IN disp 偏移(>0:向上轮换,<0:向下偏移)(整数)
OUT rank_source 源进程的标识数(整数)
OUT rank_dest 目标进程的标识数(整数)
int MPI_Cart_shift(MPI_Comm comm, int direction, int disp, int *rank_source, int *rank_dest)
MPI_CART_SHIFT(COMM, DIRECTION, DISP, RANK_SOURCE, RANK_DEST, IERROR)
INTEGER COMM, DIRECTION, DISP, RANK_SOURCE, RANK_DEST, IERROR
依赖于被说明的坐标方向上的笛卡尔组的周期性,MPI_CART_SHIFT提供用于循环或末尾轮换的标识符。对于末尾轮换情况,值MPI_PROC_NULL可以在rank_source或rank_dest中返回,这说明用于轮换的源或目的超出范围。
例6.4通信子comm存在一个与其相连的二维、周期性的笛卡尔拓扑。一个二维REAL型的矩阵存储在变量A中,每一进程一个元素。人们希望通过i步轮换第i列(垂直的,例如,沿着列)来扭斜这个矩阵。
…
C find process rank
CALL MPI_COMM_RANK(comm, rank, ierr)
C find cartesian coordinates
CALL MPI_CART_COORDS(comm, rank, maxdims, coords, ierr)
C compute shift source and destination
CALL MPI_CART_SHIFT(comm, 1, coords(2), source, dest, ierr)
C skew array
CALL MPI_SENDRECV_REPLACE(A, 1, MPI_REAL, dest, 1, source, 0, comm,
+ status, ierr)
Copyright: NPACT | ![]() ![]() |