我对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();
}