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)
//(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,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。
相关文章推荐
- OpenMP编程实例(向量点积、矩阵乘法和快排)
- Visual C++中的ODBC编程实例
- DirectX5.0最新游戏编程指南 DirectDraw教程篇 二、第一个DirectDraw实例
- JMX编程实例:取得当前Weblogic Server的JDBCConnectionPool
- 续实例解析SOCKET编程模型之异步通信篇-服务器
- 在C# 编程中通过类名动态创建实例
- 续实例解析SOCKET编程模型之异步通信篇-客户端
- 实例解说.Net构架下的加密编程
- Visual C++中的ODBC编程实例
- 实例解析SOCKET编程模型-客户端
- DirectDraw6的初级编程应用 —— 配合实例讲解,让你迅速入门
- JSP安全编程实例浅析(一)
- Bash 实例,第 1 部分:Bourne again shell (bash) 基本编程
- JSP安全编程实例浅析
- XML编程实例(二)
- Delphi编程技巧实例
- Linux音频编程实例
- The MySQL C API 编程实例
- The MySQL C API 编程实例