Сумма массива с помощью MPI_Gather и MPI_Scatter - PullRequest
1 голос
/ 29 марта 2019

Я полностью новичок в 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();
}
...