编写一个MPI程序,有效地计算数组元素的和。程序1:任务与MPI_Scatter和MPI_Reduce通信
- 程序可以假设进程数是2的幂。
- 程序应该在0到100的范围内增加2^15 = 65536个随机双精度。任务0必须生成数字,将它们存储在数组中并分发给任务。
- 每个任务执行分配给它的数字的串行和。然后是局部和使用树形结构并行和将它们相加。
- 并行和完成后,任务0应计算的串行和相同的数字(验证结果)。
- 任务0必须打印并行和,串行和所需的时间并行求和(包括数据分布)。
#include <stdio.h>
#include <mpi.h>
int main(int argc,char *argv[]){
MPI_Init(NULL,NULL); // Initialize the MPI environment
int rank;
int comm_size;
MPI_Comm_rank(MPI_COMM_WORLD,&rank);
MPI_Comm_size(MPI_COMM_WORLD,&comm_size);
int number1[2];
int number[4];
if(rank == 0){
number[0]=1;
number[1]=2;
number[2]=3;
number[3]=4;
//number[4]=5;
}
double local_start, local_finish, local_elapsed, elapsed;
MPI_Barrier(MPI_COMM_WORLD);
local_start = MPI_Wtime();
//All processes
MPI_Scatter(number, 2, MPI_INT, &number1, 2, MPI_INT, 0, MPI_COMM_WORLD);
//printf("I'm process %d , I received the array : ",rank);
int sub_sum = 0;
for(int i=0 ; i<2 ; i++){
// printf("%d ",number1[i]);
sub_sum = sub_sum + number1[i];
}
printf("n");
int sum = 0;
MPI_Reduce(&sub_sum, &sum, 1, MPI_INT, MPI_SUM,0,MPI_COMM_WORLD);
local_finish = MPI_Wtime();
local_elapsed = local_finish -local_start;
MPI_Reduce(&local_elapsed,&elapsed,1,MPI_DOUBLE,MPI_MAX,0,MPI_COMM_WORLD);
if(rank == 0)
{
printf("nthe sum of array is: %dn",sum);
printf("Elapsed time = %e secondsn",elapsed);
}
MPI_Finalize();
return 0;
}