MPI_Cart_shift函数详解

来源:互联网 发布:fc2视频域名更改 编辑:程序博客网 时间:2024/06/06 01:37

int MPI_Cart_shift(MPI_Comm comm, int direction, int disp, int *rank_source,int *rank_dest)

在具有笛卡尔拓扑结构的通信器中,给定一个数据平移的维度和步长,返回数据平移的源进程号和目的进程号。

参数:

comm:具有笛卡尔拓扑结构的通信器

direction:数据平移的维度号

disp:数据平移的方向和步长,大于0表示正方向,小于0表示负方向

rank_source:源进程号

rank_dest:目的进程号


例子

给定6个进程,创建一个二维的3*2的笛卡尔拓扑结构通信器,行维是周期环面结构,列维是非周期环面结构。进程排列示意图如下:


括号中的数字表示进程号,-1表示没有相应的进程,0,0这样的坐标表示进程在二维笛卡尔拓扑中的坐标号。

由于行维是周期环面的,列维是非周期环面的,所以0号进程的上方和4号进程相邻,而左方没有进程相邻。


给定如下程序:

#include <iostream>#include "mpi.h"using namespace std;int main(int argc, char *argv[]){    MPI_Init(&argc, &argv);    int numProcessors, rank, my2drank, mycoords[2];    MPI_Comm_size(MPI_COMM_WORLD, &numProcessors);    MPI_Comm_rank(MPI_COMM_WORLD, &rank);    if(rank==0){        cout<<"rank\trow\tcol\tsource1\tdest1\tsource2\tdest2\tsource3\tdest3\tsource4\tdest4"<<endl;    }       int dims[2]={3,2};    int periods[2]={1,0};    MPI_Comm comm_2d;    MPI_Cart_create(MPI_COMM_WORLD,2,dims,periods,1,&comm_2d);    MPI_Comm_rank(comm_2d, &my2drank);    MPI_Cart_coords(comm_2d, my2drank, 2, mycoords);    int source1, dest1, source2, dest2, source3, dest3, source4, dest4;    int direct=0, displ=1;    MPI_Cart_shift(comm_2d, direct, displ, &source1, &dest1);    direct=0;    displ=-2;    MPI_Cart_shift(comm_2d, direct, displ, &source2, &dest2);    direct=1;    displ=1;    MPI_Cart_shift(comm_2d, direct, displ, &source3, &dest3);    direct=1;    displ=-1;    MPI_Cart_shift(comm_2d, direct, displ, &source4, &dest4);    cout<<my2drank<<"\t"<<mycoords[0]<<"\t"<<mycoords[1]<<"\t"<<source1<<"\t"<<dest1<<"\t"<<source2<<"\t"<<dest2<<"\t"<<source3<<"\t"<<dest3<<"\t"<<source4<<"\t"<<dest4<<endl;    MPI_Finalize();    return 0;}

程序输出为:



参考

http://www.mpich.org/static/docs/latest/www3/MPI_Cart_shift.html

http://scv.bu.edu/~kadin/Tutorials/Alliance/MPI/virtual_topology/cart_shift_example.html

0 0
原创粉丝点击