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

标签 sorting mpi cartesian hypercube

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

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

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

Note that an n -dimensional hypercube is an n -dimensional torus with 2 processes per coordinate direction. Thus, special support for hypercube structures is not necessary.

我还没有看到任何单个示例 + 每个坐标方向有 2 个进程的 n 维环面对我来说似乎只是个谜。有人需要建议吗?

谢谢,

最佳答案

嗯,找到了

所以这将是一个 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";

关于sorting - 如何使用 MPI_CART 将进程映射到超立方体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2384969/

相关文章:

arrays - O(log n)算法在排序数组中找到最佳插入位置

python - 尽管 MPICC 安装正确且有效,但安装 mpi4py 时出现 MPICC 错误

c - 2 个静态进程的问题,它使用打开的 mpi 创建 2 个动态进程

php - 如何在 R^2 中进行旋转?

sorting - 在 SAS 中重新排序列的最有效方法

javascript - 对年份数组进行排序(包括 BCE)

python - 如何在 Python 中对图形进行聚类?

fortran - MPI_CART_CREATE 没有特定的子例程

javascript - 在 HTML5 Canvas 中创建粒子以遵循圆形路径

python-2.7 - 如何将2D椭圆拟合到给定点