首页 > 解决方案 > 使用 MPI_Gather 和 MPI_Scatter 进行数组求和

问题描述

我对 MPI 完全陌生,我必须解决一个问题:我有 2 个一维数组(A 和 B),我必须对它们的内容求和,并将结果存储在不同的数组 (C) 中。我用一个数组做了一个例子,我在其中总结了所有的内容,然后返回结果。

如何使用 Gather 和 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();
}

标签: cmpicluster-computing

解决方案


推荐阅读