我需要做的是使用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度旋转的顺序)将这些向量作为一个阵列收集在一个处理器(根)上?
提前致谢。
答案 0 :(得分:2)
所以我终于想出了如何使用Alltoallv和Gather函数来完成它。
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]
答案 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]
这非常有效,因为它可以就地进行操作。但是正如我所说,这是一个方阵。你可以用它来弄清楚如何为矩形矩阵做这件事。