当前位置: 代码迷 >> 综合 >> OpenMP: OpenMP多核编程配置与测试
  详细解决方案

OpenMP: OpenMP多核编程配置与测试

热度:5   发布时间:2024-01-11 07:18:27.0

 现在的集成开发环境很好的支持了市面上的多数多核CPU,比如在intel双核CPU的系统上安装好vs2008后,

第一,在项目属性-c++-语言中选择支持openmp

第二,在环境变量中加入OMP_NUM_THREADS变量赋值2

       可以了,打开vs2008,新建一个console程序。

 

       敲入下面的例子,相信我们都能看懂的:

[cpp]  view plain copy
  1. /************************************************************************/  
  2. /* 利用Monte Carlo算法求圆周率pi                                                                     */  
  3. /************************************************************************/  
  4. #include <iostream>  
  5. #include <stdio.h>  
  6. #include <cmath>  
  7. #include <ctime>  
  8. #include <omp.h>  
  9. #include <time.h>  
  10.   
  11. using namespace std;  
  12.   
  13. #define pear 5000000    //扔的“黄豆”数目  
  14. int isInCir(double x,double y)  
  15. {  
  16.     if ((x * x + y * y) <= 1)  
  17.     {  
  18.         return 1;       //在1/4园内的话,返1  
  19.     }  
  20.     return 0;  
  21. }  
  22.   
  23. int main()  
  24. {  
  25.     float kaishi;  
  26.     float jieshu;  
  27.     int i;  
  28.     int num = 0;//在园内的豆豆数目  
  29.      double x, y;  
  30.     double mianji;  
  31.     srand((unsigned)time(NULL));  
  32.   
  33.     kaishi = clock();  
  34.     // singer  
  35.     int singerNum = 0;  
  36.     for (i = 0; i < pear; i++)  
  37.     {  
  38.         x = rand() % RAND_MAX / float(RAND_MAX);  
  39.         y = rand() % RAND_MAX / float(RAND_MAX);  
  40.   
  41.         if (isInCir(x, y) == 1)  
  42.         {  
  43.             singerNum++;  
  44.         }  
  45.     }  
  46.     jieshu = clock();  
  47.     cout << "单核处理时间为:" << jieshu - kaishi << endl;  
  48.   
  49.     //双核2线程  
  50.     kaishi = clock();  
  51.     omp_set_num_threads(2);  
  52. #pragma omp parallel for reduction(+ : num)  
  53.     for (i = 0; i < pear; i++)  
  54.     {  
  55.         x = rand() % RAND_MAX / float(RAND_MAX);  
  56.         y = rand() % RAND_MAX / float(RAND_MAX);  
  57.   
  58.         if (isInCir(x, y) == 1)  
  59.         {  
  60.             num++;  
  61.         }  
  62.     }  
  63.     jieshu = clock();  
  64.     cout << "双核两个线程处理时间为:" << jieshu-kaishi<<endl;  
  65.   
  66.     //双核3-200线程  
  67.     int moreNum = 0;  
  68.     for(int j = 3; j < 200;j = j + 20){  
  69.         moreNum = 0;  
  70.     kaishi = clock();  
  71.     omp_set_num_threads(j);  
  72. #pragma omp parallel for reduction(+ : moreNum)  
  73.     for (i = 0; i < pear; i++)  
  74.     {  
  75.         x = rand() % RAND_MAX / float(RAND_MAX);  
  76.         y = rand() % RAND_MAX / float(RAND_MAX);  
  77.   
  78.         if (isInCir(x, y) == 1)  
  79.         {  
  80.             moreNum++;  
  81.         }  
  82.     }  
  83.     jieshu = clock();  
  84.     cout << "双核" << j << "个线程处理时间为:" << jieshu - kaishi << endl;  
  85.     }  
  86.     cout << "豆豆落在园内的个数:" << num << endl;  
  87.     cout << "最大随机数:" << RAND_MAX << endl;  
  88.     mianji = (num * 1.0) / pear;  
  89.     //printf("Monte Carlo算法模拟出的半径为一的1/4圆的面积为%f\n", mianji);  
  90.     cout << "Monte Carlo算法模拟出的半径为一的1/4圆的面积为" << mianji << endl;  
  91.     cout << "计算出的pi值为:" << 4 * mianji << endl;  
  92.     return 0;  
  93. }