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