您的位置:首页 > 编程语言

OpenMP 编程实例(蒙特卡罗算法)

2016-09-18 14:34 507 查看
有关clock()函数
1,clock()函数在头文件#include<time.h>中

2,clock()函数的返回值类型为clock_t。clock_t其实是long,即长整形。

clock_t是用来保存时间的数据类型,typedef long clock_t。

3,clock()函数的功能:从程序被调用,创建程序进程到clock()函数调用之间的cpu时间计时单位

4,常量CLOCKS_PER_SEC,他表示一秒钟有多少个时钟计时单位。
  #define CLOCK_PER_SEC ((clock_t)1000)

5. 注意: (1) clock()函数范围的时间单位是ms(毫秒)。

       (2) 现在的机器运算速度很快,当用clock()函数记录算法的效率时,不一定有效,可能得到的结果为0。可以尝试多次调用,这个“多”就自己去尝试吧
 //利用蒙特卡罗算法计算半径为 1 单元的球体体积:
//(1)串行执行程序为:
 
#include<iostream>
#include<stdlib.h>
#include<time.h>
 
using namespace std;
 
int main()
{
   long int max=10000000;
   long int i,count=0;
   double x,y,z,bulk,start_time,end_time;
 
   start_time=clock();
   time_t t;
 
   srand((unsigned) time(&t));//函数产生一个以当前时间开始的随机种子
 
   for(i=0;i<max;i++)
   {
      x=rand();
//生成0~RAND_MAX之间的一个随机数,其中RAND_MAX 是stdlib.h 中定义的一个整数,它与系统有关。
/*  RAND_MAX是VC中stdlib.h中宏定义的一个字符常量:  
    #define RAND_MAX 0x7FFF   其值最小为32767,最大为2147483647   
    通常在产生随机小数时可以使用RAND_MAX。*/
      x=x/32767;
 
      y=rand();
      y=y/32767;
 
      z=rand();
      z=z/32767;
 
      if((x*x+y*y+z*z)<=1)
         count++;
   }
 
   bulk=8*(double(count)/max);
   end_time=clock();
   cout<<"球体的体积为"<<bulk<<endl;
   cout<<"运算时间为"<<(end_time-start_time)<<endl;
 
   return 0;
}
//在四核服务器上执行结果为:球体体积为 4.18862,运算时间为 1703ms。
 
//(2)并行执行程序:利用 for 语句和归并语句对程序进行并行化。
 
 
#include<stdlib.h>
#include<time.h>
#include <stdio.h>
 
int main()
{
 
   long long max=10000000;
 
   long long i,count=0;
 
   double x,y,z,bulk,start_time,end_time;
 
   start_time=clock();
   time_t t;
 
   srand((unsigned) time(&t));//函数产生一个以当前时间开始的随机种子
 
   #pragma omp parallel for private(x,y,z) reduction(+:count)
 
   for(i=0;i<max;i++)
   {
      x=rand();
      x=x/32767;
 
      y=rand();
      y=y/32767;
 
      z=rand();
      z=z/32767;
 
      if((x*x+y*y+z*z)<=1)
         count++;
   }
   bulk=8*((double)(count)/max);
   end_time=clock();
 
   printf("球体的体积为%0.8f\n",bulk);
   printf("运算时间为%0.8f s\n",(end_time-start_time)/1000);
 
   return 0;
}
//在四核服务器上执行结果为:球体体积为 4.18861,运算时间为 406ms。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: