如何在MPI_Gather中使用多宗派数组

时间:2016-11-01 18:50:10

标签: c parallel-processing mpi

我在C中编写了以下简单程序,以了解如何使用MPI_Gather发送2D数组。如代码的第24行和第49行所示,MPI_Gather使用不正确。
以下是我应该得到的结果:

Final array result:
array[0][0]:2, array[0][1]:2, array[0][2]:2,
array[1][0]:2, array[1][1]:2, array[1][2]:2,
array[2][0]:3, array[2][1]:3, array[2][2]:3,
array[3][0]:3, array[3][1]:3, array[3][2]:3,
array[4][0]:4, array[4][1]:4, array[4][2]:4,
array[5][0]:4, array[5][1]:4, array[5][2]:4,
array[6][0]:5, array[6][1]:5, array[6][2]:5,
array[7][0]:5, array[7][1]:5, array[7][2]:5,

由于我错误地使用MPI_Gather,因此当我运行此程序时,某些数组元素不会显示正确的结果。我正在使用4个处理器来运行此程序。请告诉我如何将MPI_Gather与2D数组一起使用,如果可能的话还有一个例子 编译 :$ mpicc test.c -o test
要运行 :$ mpirun -np 4 test

#include <mpi.h>
#include <stdio.h>

int main(int argc, char** argv) {
    MPI_Init(&argc, &argv);
    int world_rank;
    MPI_Comm_rank(MPI_COMM_WORLD, &world_rank);
    int world_size;
    MPI_Comm_size(MPI_COMM_WORLD, &world_size); 
    int i, j, total;
    int localdata[2][2];
    int final_arr[8][3];

    if (world_rank == 0) 
    {
        printf("\n* At Process %d \n", world_rank);
        for(i=0;i<2;i++)
        {
            for(j=0;j<3;j++)
            {
                localdata[i][j]=world_rank+2;
            }
        }           /*Error: wants to send the full 2 by 3 localdata array to root*/
        MPI_Gather(localdata, 6, MPI_INT, final_arr, 6, MPI_INT,0, MPI_COMM_WORLD);


        if (world_rank == 0) 
        {
            printf("\n\nFinal array result:\n");
            for(i=0;i<8;i++)
            {
                for(j=0;j<3;j++)
                {
                    printf("array[%d][%d]:%d, ",i,j,final_arr[i][j]);
                }
                printf("\n");
            }           
        }       
    } 
    else
    {       
        for(i=0;i<2;i++)
        {
            for(j=0;j<3;j++)
            {
                localdata[i][j]=world_rank+2;
            }
        }           /*Error: wants to send the full 2 by 3 localdata array to root*/
        MPI_Gather(localdata, 6, MPI_INT, final_arr, 6, MPI_INT,0, MPI_COMM_WORLD);     
    }   

    MPI_Finalize();
    return 0;
}

0 个答案:

没有答案