MPI程序使用MPI_Scatter和MPI_Reduce



编写一个MPI程序,有效地计算数组元素的和。程序1:任务与MPI_Scatter和MPI_Reduce通信

  1. 程序可以假设进程数是2的幂。
  2. 程序应该在0到100的范围内增加2^15 = 65536个随机双精度。任务0必须生成数字,将它们存储在数组中并分发给任务。
  3. 每个任务执行分配给它的数字的串行和。然后是局部和使用树形结构并行和将它们相加。
  4. 并行和完成后,任务0应计算的串行和相同的数字(验证结果)。
  5. 任务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;

}

最新更新