⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mpi.c.bak

📁 并行编程中Monte Carlo方法求π值的程序说明(具体采用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 + -