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

本文介绍了clock()函数的基本用法及特点,包括其所在头文件、返回值类型、计时单位等,并通过具体实例展示了如何使用该函数来评估算法运行效率。

有关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。

评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值