📄 mpi.c.bak
字号:
#include "mpi.h"
#include <stdio.h>
#include <math.h>
#include <time.h>
#include <stdlib.h>
double PI25DT = 3.141592653589793238462643; /* 先给出已知的较为准确的p值*/
#define SEED 1 /*消息标识,种子*/
#define MYPI 2 /*消息标识,PI的估值*/
double f(double);
double f(double x)
/* 定义函数f(x) */
{
return (4.0 / (1.0 + x*x));
}
int main(int argc,char *argv[])
{
int done = 0, myid, numprocs, i;
int total_num = 1000;
int success_num = 0;
double sum = 0;
double value1 ;
double value2 ;
double my_pi = 0.0;
double pi = 0.0;
int* pseed;
int seed;
double startwtime = 0.0, endwtime;
int namelen;
char processor_name[MPI_MAX_PROCESSOR_NAME];
MPI_Status status;
MPI_Init(&argc,&argv);
MPI_Comm_size(MPI_COMM_WORLD,&numprocs);
MPI_Comm_rank(MPI_COMM_WORLD,&myid);
MPI_Get_processor_name(processor_name,&namelen);
fprintf(stdout,"Process %d of %d on %s\n", myid, numprocs, processor_name);
pseed=(int*)calloc(numprocs,sizeof(int)); //种子数组
if (myid == 0) //主进程0
{
srand(time(NULL)); //种下随机数发生器的种子
for(i=0;i<numprocs;i++){
*(pseed+i)=rand(); //为各进程产生种子
}
for(i=0;i<numprocs-1;i++){ //为各进程分发种子
MPI_Send(pseed+i+1,1,MPI_INT,i+1,SEED,MPI_COMM_WORLD);
}
startwtime=MPI_Wtime(); //记录起始时间
srand(*(pseed));
for(i=0;i<total_num;i++){
value1 = (double) rand()/RAND_MAX ;
value2 = (double) rand()/RAND_MAX ;
if( (value1 * value1 + value2 * value2) < 1 )
success_num++ ;
}
my_pi = 4*(double)success_num/(double)total_num ; //估计Pi
printf("In process %d,pi is approximately %.16f \n \n",myid,my_pi);
i = 0;
while(i<numprocs-1){
MPI_Recv(&my_pi,1,MPI_DOUBLE,MPI_ANY_SOURCE,MYPI,MPI_COMM_WORLD,&status);
// printf("\n%f",my_pi);
sum+=my_pi;
i++;
}
pi=sum/(double)(numprocs-1);
endwtime=MPI_Wtime(); //记录结束时间
printf("pi is approximately %.16f, Error is %.16f\n", pi, fabs(pi - PI25DT));
printf("The time consumed is:%f\n",endwtime-startwtime);
}
else //其它从进程
{
MPI_Recv(&seed,1,MPI_INT,0,SEED,MPI_COMM_WORLD,&status);
srand(seed);
for(i=0;i<total_num;i++){
value1 = (double) rand()/RAND_MAX ;
value2 = (double) rand()/RAND_MAX ;
if( (value1 * value1 + value2 * value2) < 1 )
success_num++ ;
}
my_pi = 4*(double)success_num/(double)total_num ; //估计Pi
printf("In process %d,pi is approximately %.16f \n \n",myid,my_pi);
MPI_Send(&my_pi,1,MPI_DOUBLE,0,MYPI,MPI_COMM_WORLD);
}
MPI_Finalize();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -