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
MPI_Cart_shift函数用于在具有笛卡尔拓扑的MPI通信器中,根据指定维度和步长确定数据迁移的源和目标进程。参数包括通信器、维度方向、平移步长及源、目标进程号。例如,一个3x2的笛卡尔拓扑结构中,行是周期性的,列则不是,0号进程的上方邻居是4号进程,左侧无邻居。该函数的应用有助于理解并行计算中的进程间通信。
2528

被折叠的 条评论
为什么被折叠?



