MPI_Gather和MPI_Scatter的数组求和

时间:2019-03-29 03:53:02

标签: c mpi cluster-computing

我对MPI完全陌生,我必须解决一个问题:我有2个1D数组(A和B),必须对它们的内容求和,并将结果存储在另一个数组(C)中。我仅使用一个数组完成了一个示例,在该数组中,我将所有内容加总,然后返回结果。

我该如何通过Gather and Scatter进行调整?

 #include<stdio.h>
 #include<stdlib.h>
 #include<string.h>
 #include"mpi.h"
 #define N 10

 int* CreaArreglo(tam){
    int* arr;
   arr = (int*)malloc(tam*sizeof(int));
   return arr;  
 }

 int* GeneraArreglo(int tam){
    int* arr;
    arr = (int*)malloc(tam*sizeof(int));
    int i;
    srand(time(0));

    for(i = 0; i < tam ; i++)
    {
       arr[i]=rand()%40;
    }
    return arr;
 }

 int main(int argc,char*argv[])
 {
    MPI_Status status;
    int idProc , numProc;

    MPI_Init(&argc,&argv);
    MPI_Comm_rank(MPI_COMM_WORLD,&idProc);
    MPI_Comm_size(MPI_COMM_WORLD,&numProc);

    int nDatos = N/(numProc-1);
    int nDatosU = nDatos + (N%(numProc-1));

    if(idProc == 0){
        int* A;

                A = GeneraArreglo(N);

        int i;

        for(i=1;i <= numProc-2;i++){
            MPI_Send(A+((i-1)*nDatos),nDatos,MPI_INT,i,0,MPI_COMM_WORLD);

        }

        MPI_Send(A+((i-1)*nDatos),nDatosU,MPI_INT,i,0,MPI_COMM_WORLD);

        int suma = 0;
        int sumap = 0;

        i = 1;
        do{
            MPI_Recv(&sumap,1,MPI_INT,i,0,MPI_COMM_WORLD,&status);
            suma += sumap;  
            i++;
        }while(i<(numProc));
        printf("suma total = %d \n",suma);
    }
    else{
        if(idProc == numProc-1){
            nDatos = nDatosU;
        }

        int suma = 0;
        int i=0 ;       
        int* A = CreaArreglo(nDatos);

        MPI_Recv(A,nDatos,MPI_INT,0,0,MPI_COMM_WORLD,&status);

            i=0;
        do{
            printf("%d +",A[i]);
            suma += A[i];
            i++;
        }while(i<(nDatos));

        MPI_Send(&suma,1,MPI_INT,0,0,MPI_COMM_WORLD);
    }

    MPI_Finalize();
}

0 个答案:

没有答案