【发布时间】:2021-04-08 11:52:13
【问题描述】:
我正在尝试制作一个迷你 C 程序来理解 MPI,我想让用户输入程序将接收多少个数字,这些数字,然后 scatter 在进程中同样输入它们。然后每个进程将计算它的局部平均值,然后使用gather 根进程将计算整个平均值。这些数字存储在一个固定大小的数组中。我遇到的问题是根进程没有计算平均值,我不知道为什么。正如我在其他示例中看到的那样,我分散并收集了数字,但我无法让它发挥作用。这就是我所拥有的。
#include <stdio.h>
#include "mpi.h"
int main(int argc, char** argv){
int my_rank;
int p;
int n;
int i;
int size;
int loc_num;
int loc_sum;
int fin=0;
int avg;
int loc_avg;
int root=0;
int data[100];
int data_loc[100];
int data_aver[100];
int final_res[100];
MPI_Init(&argc, &argv);
MPI_Comm_rank(MPI_COMM_WORLD, &my_rank);
MPI_Comm_size(MPI_COMM_WORLD, &p);
if (my_rank == 0){
printf("Input how many numbers: ");
scanf("%d", &n);
printf("Input the elements of the array: ");
for(i=0; i<n; i++){
scanf("%d", &data[i]);
}
}
MPI_Bcast(&n, 1, MPI_INT, root, MPI_COMM_WORLD);
loc_num = n/p;
MPI_Scatter(&data, loc_num, MPI_INT, data_loc, loc_num, MPI_INT, root, MPI_COMM_WORLD);
for(i=0; i< loc_num; i++){
loc_sum += data_loc[i];
loc_avg = loc_sum / loc_num;
}
if(my_rank==0){
MPI_Gather(&loc_avg, loc_num, MPI_INT, final_res, loc_num, MPI_INT, root, MPI_COMM_WORLD);
for(i=0; i<n; i++){
fin += final_res[i];
}
avg=fin/n;
printf("Final average: %d \n", avg);
}
MPI_Finalize();
return 0;
}
【问题讨论】:
标签: arrays c parallel-processing mpi openmpi