【问题标题】:Rotating a two-dimensional array by 90 degrees in MPI在 MPI 中将二维数组旋转 90 度
【发布时间】:2013-10-27 13:24:42
【问题描述】:

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

提前致谢。

【问题讨论】:

    标签: arrays matrix parallel-processing rotation mpi


    【解决方案1】:

    所以我终于弄清楚了应该如何使用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]
    

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        猜你喜欢
        • 2011-06-01
        • 1970-01-01
        • 2015-07-17
        • 1970-01-01
        • 2019-03-06
        • 2022-01-07
        • 2017-10-07
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多