c - 使用 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();
}
解决方案
推荐阅读
- elasticsearch - elasticsearch中的span_containing和span_within查询有什么区别?
- angularjs - Angular $destroy 正在堆叠
- r - 将 tableGrob 中的 colhead 向左对齐,而不剪切 colnames
- angular - 如果用户刷新/重新加载,请保留表单数据
- android-studio - 在指定位置找不到 Flutter SDK - 在 Android Studio 中
- angular - 当我有更多数据时,选择数据非常慢
- python - 如何编写测试代码以确保 __repr__ 的“返回”值?
- zk - 无法获取网格 zk java 中的行
- android - java.lang.ClassNotFoundException: org.gradle.wrapper.GradleWrapperMain
- r - 如果满足其中一项要求,请更改列的值。不使用循环或 IF 语句