在 MPI 中将二维数组旋转 90 度



我需要做的是使用派生MPI数据类型将 2-D 数组旋转 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 度旋转的顺序)在一个处理器(根)上将此向量作为数组收集?

提前谢谢。

所以我终于弄清楚了应该如何使用Alltoallv和Gather函数来完成它。
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]

您要查找的操作称为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]

这是非常有效的,因为它可以就地进行操作。但是,正如我所说,这是针对方阵的。您可能可以使用它来弄清楚如何为矩形矩阵执行此操作。

最新更新