如何使用MPI_CART将进程映射到超立方体

时间:2010-03-05 06:32:11

标签: sorting mpi cartesian hypercube

我正在尝试使用MPI为2 ^ n个处理器实现bitonic排序。

我想使用n维hypercube这样做是为了方便。使用MPI_Cart_Create我可以创建自组织维度。这样做可以最大限度地提高我的工艺效率,并减少我必须吐出的LOC数量才能完成。

谷歌搜索和文学总是说同样的事情:

  

注意一个n维超立方体   是2维的n维圆环   每个坐标方向的过程。   因此,对超立方体的特殊支持   结构是没有必要的。

我还没有看到任何单个例子+ n维三环,每个坐标方向有2个进程对我来说似乎不过是个谜。有人要建议吗?

谢谢,

1 个答案:

答案 0 :(得分:5)

好吧,找到了

所以这将是一个4维超立方体..这种模式非常简单。在n维超立方体中,每个点都有N个邻居,它们在此代码中表示。请注意,应使用此代码而不是xoring位掩码,因为MPI可以重新排序进程以适合集群的物理布局。

int rank, size; //I am process RANK and we are a total of SIZE
MPI_Init(&argc, &argv); 

MPI_Comm_rank(MPI_COMM_WORLD, &rank);
MPI_Comm_size(MPI_COMM_WORLD, &size);

myFairShareOfNumber = totalNumber / size;

MPI_Comm nthCube;
int nDim=4;
int processPerDim [4]= {2,2,2,2};
int period [4]= {1,1,1,1};

MPI_Cart_create(MPI_COMM_WORLD, nDim, processPerDim, period, true, &nthCube);

int rankInDim;
MPI_Comm_rank(nthCube, &rankInDim);

int rank_source, rank_desta, rank_destb, rank_destc, rank_destd;
MPI_Cart_shift(nthCube, 0,1,&rank_source, &rank_desta);
MPI_Cart_shift(nthCube, 1,1,&rank_source, &rank_destb);
MPI_Cart_shift(nthCube, 2,1,&rank_source, &rank_destc);
MPI_Cart_shift(nthCube, 3,1,&rank_source, &rank_destd);
cerr << "I am known in the world as " << rankInDim << " my adjacents are -> " << rank_desta << "-" << rank_destb << "-" << rank_destc << "-" << rank_destd <<"\n";