OpenMP 编程实例(蒙特卡罗算法)
有關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。
總結
以上是生活随笔為你收集整理的OpenMP 编程实例(蒙特卡罗算法)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 网易视频云分享:流媒体技术介绍(上篇)
- 下一篇: OpenMP: OpenMP编程指南