代码之家  ›  专栏  ›  技术社区  ›  matdumsa

如何使用MPI\u CART将进程映射到超立方体

  •  2
  • matdumsa  · 技术社区  · 16 年前

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

    hypercube 这样做是为了方便。使用MPI\u Cart\u Create,我可以创建自组织维度。这样做将最大限度地提高我的工作效率,同时也减少了我必须吐出来才能完成的LOC的数量。。

    google和litteration总是告诉我们同样的事情:

    是一个有2个 按坐标方向处理。 因此,对超立方体的特殊支持 结构是不必要的。

    谢谢,

    1 回复  |  直到 16 年前
        1
  •  6
  •   matdumsa    16 年前

    嗯,找到了

    所以这就是一个四维超立方体。。这种模式很直接。在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";
    
    推荐文章