3

2^nプロセッサ用のMPIを使用してバイトニックソートを実装しようとしています。

便宜上、n次元の超立方体を使用したいと思います。MPI_Cart_Createを使用して、自己組織化ディメンションを作成できます。そうすることで、プロセスの効率が最大化され、それを実行するために吐き出さなければならないLOCの数も減ります。

グーグルと文学は常に同じことを伝えます:

n次元の超立方体は、座標方向ごとに2つのプロセスを持つn次元のトーラスであることに注意してください。したがって、ハイパーキューブ構造の特別なサポートは必要ありません。

単一の例を見たことがありません+座標方向ごとに2つのプロセスを持つn次元トーラスは、私には謎に過ぎないようです。誰かが提案する必要がありますか?

ありがとう、

4

1 に答える 1

6

さて、それを見つけました

つまり、4次元超立方体の場合です。パターンは非常に単純です。n次元の超立方体では、各点にN個の隣接点があり、このコードで表されます。MPIはクラスターの物理レイアウトに合わせてプロセスを並べ替えることができるため、xoringビットマスクの代わりにこのコードを使用する必要があることに注意してください。

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";
于 2010-03-09T03:58:29.140 に答える