在MPI中将二维阵列旋转90度

时间:2013-10-18 16:04:56

标签: arrays matrix parallel-processing rotation mpi

我需要做的是使用MPI中的派生数据类型将2维数组旋转90度(3个处理器上3x3,4个4x4等)。我发现在数组C中使用Alltoall函数:

[ 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度旋转的顺序)将这些向量作为一个阵列收集在一个处理器(根)上?

提前致谢。

2 个答案:

答案 0 :(得分:2)

所以我终于想出了如何使用AlltoallvGather函数来完成它。
Alltoallv让我以相反的顺序在进程之间分发数据:

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

然后我使用Gatherrank 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]

答案 1 :(得分:1)

您正在寻找的操作称为Transpose 我将给你伪代码来转置长度为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]

这非常有效,因为它可以就地进行操作。但是正如我所说,这是一个方阵。你可以用它来弄清楚如何为矩形矩阵做这件事。