当前位置: 代码迷 >> 综合 >> OpenMP 编程实例(蒙特卡罗算法)
  详细解决方案

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

热度:41   发布时间:2023-12-12 08:14:00.0

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