2

私がする必要があるのは、派生データ型を使用して 2 次元配列を 90 度 (3 プロセッサでは 3x3、4 では 4x4 など) 回転させることですMPIAlltoall配列でCの関数を使用することがわかりました:

[ 1][ 2][ 3][ 4]
[ 5][ 6][ 7][ 8]
[ 9][10][11][12]
[13][14][15][16]

次のようにデータを配布します。

1:[ 1][ 5][ 9][13]
2:[ 2][ 6][10][14]
3:[ 3][ 7][11][15]
4:[ 4][ 8][12][16]

このベクトルを正しい順序 (90 度の回転を反映する順序) で 1 つのプロセッサ (ルート) 上の配列として収集するには、次に何をすればよいですか (どのような手順を実行する必要がありますか)。

前もって感謝します。

4

2 に答える 2

2

そこで、最終的にAlltoallvGather関数を使用してそれを行う方法を見つけました。
Alltoallv逆の順序でプロセス間でデータを分散させてください。

0:[ 4][ 8][12][16]
1:[ 3][ 7][11][15]
2:[ 2][ 6][10][14]
3:[ 1][ 5][ 9][13]

次に、処理中のデータをバッファGatherに収集していました。rank 0

...
//size is a number of processors
MPI_Type_vector(size, 1,1, MPI_INT, &vec ); 
MPI_Type_commit( &vec );

if(rank==0){
int buffer[size*size];
//recv is a name of an array with data on every processor
MPI_Gather(recv,1,vec, buffer, size, MPI_INT, 0, MPI_COMM_WORLD );
}else{
MPI_Gather(recv,1,vec,NULL,0,MPI_INT,0,MPI_COMM_WORLD);
}
...

その結果、私は受け取りました:

[ 4][ 8][12][16]
[ 3][ 7][11][15]
[ 2][ 6][10][14]
[ 1][ 5][ 9][13]
于 2013-11-06T10:29:57.637 に答える
1

あなたが探している操作は呼び出されTranspose ます。長さ N の正方行列を N で転置する疑似コードを提供します。

int matrix[N][N];

for (n=0; n<N-1; ++n)
    for (m=n+1; m<N; ++m)
        swap matrix[n][m] with matrix[m][n]

これは、その場で操作を行うため、非常に効率的です。ただし、前述したように、これは正方行列用です。おそらくこれを使用して、長方形の行列に対してそれを行う方法を理解できます。

于 2013-10-18T16:43:34.313 に答える