MPI求完数个数
// MPI1.cpp : 定义控制台应用程序的入口点。
//MPI求完数个数
#include "stdafx.h"
#include "mpi.h"
#include <stdio.h>
#include <math.h>
int isPerfect(int n)
{
int lyy_sum=0;
for(int i = 1; i <=n/2; i++)
if(n%i == 0)
lyy_sum+= i;//统计所有真因子的和。
if(lyy_sum == n)
return 1;//如果与原值相等,则该数为完数。
return 0;//不是完数。
}
void main(int argc, char * argv[])
{
int n=0,myid,numprocs,i,pi,sum,mypi;
double startwtime,endwtime;
MPI_Init(&argc,&argv);
MPI_Comm_size(MPI_COMM_WORLD,&numprocs);
MPI_Comm_rank(MPI_COMM_WORLD,&myid);
if(myid==0)
{
printf("输入一个数字:");
fflush(stdout);
scanf_s("%d",&n);
startwtime=MPI_Wtime();
}
MPI_Bcast(&n,1,MPI_INT,0,MPI_COMM_WORLD); //将n值广播出去
sum=0;
for(i=myid+1;i<=n;i+=numprocs)
sum+=isPerfect(i);
mypi=sum;
MPI_Reduce(&mypi,&pi,1,MPI_INT,MPI_SUM,0,MPI_COMM_WORLD); //规约
if(myid==0)
{
printf("结果=%d\n",pi);
endwtime=MPI_Wtime();
printf("并行时间=%f\n",endwtime-startwtime);
}
//串行程序
sum=0;
double startwtime2=MPI_Wtime();
if(myid==0)
{
for(i=1;i<=n;i++)
sum+=isPerfect(i);
double endwtime2=MPI_Wtime();
printf("结果=%d\n",sum);
printf("串行时间=%f\n",endwtime2-startwtime2);
}
MPI_Finalize();
}
小数据运行结果:
大数据运行结果:
实验加速比:
加速比计算:8.074396/4.040743=1.998