OpenMP 并行化处理测试

OpenMP 并行化处理测试

#pragma omp parallel for 这条语句是用来指定后面的for循环语句变成并行执行的,将for循环里的语句变成并行执行后效率会不会提高呢?还是测试一 下吧,测试的时候,循环最好大一些,增加计算量,不然程序耗时太短,很难区分。
 1 #include <omp.h>  
 2 #include <stdio.h>  
 3 #include <sys/time.h>  
 4 void test() {  
 5     int a = 0;  
 6     for(int i = 0; i < 10000000; i++) {  
 7         a = i + 1;  
 8     }  
 9 }  
10 int main() {  
11     int nthrds = 4;  
12     omp_set_num_threads(nthrds);  
13     timeval tStart,cTime;  
14     long long tPassed = 0;  
15     gettimeofday(&tStart, 0);  
16     for (int i = 0; i < 100; i++) {  
17         test();  
18     }  
19     gettimeofday(&cTime, 0);  
20     cTime.tv_sec -= tStart.tv_sec;   
21     cTime.tv_usec -= tStart.tv_usec;  
22     tPassed = 1000000LL * cTime.tv_sec + cTime.tv_usec;   
23     tPassed /= 1000;  
24     printf("Time = %lld/n", tPassed);  
25     gettimeofday(&tStart, 0);  
26     #pragma omp parallel for  
27     for (int i = 0; i < 100; i++) {  
28         test();  
29     }  
30     gettimeofday(&cTime, 0);  
31     cTime.tv_sec -= tStart.tv_sec;  
32     cTime.tv_usec -= tStart.tv_usec;  
33     tPassed = 1000000LL * cTime.tv_sec + cTime.tv_usec;   
34     tPassed /= 1000;  
35     printf("Time = %lld/n", tPassed);  
36     return 1;  
37 }  

 result:

1 [root@c0108 zlt]# g++ omp.c -o omp -fopenmp  
2 [root@c0108 zlt]# ./omp  
3 Time = 2859  
4 Time = 718  
5 [root@c0108 zlt]#   

在四核的机器上,开了四个线程,加速比基本上是4,果然不错。 

此外,BS一下clock()函数,我向来觉得它一无是处。。。

  1. #include <omp.h>  
  2. #include <stdio.h>  
  3. #include <time.h>  
  4. void test() {  
  5.  int a = 0;  
  6.  for(int i = 0; i < 10000000; i++) {  
  7.   a = i + 1;  
  8.  }  
  9. }  
  10. int main() {  
  11.  int nthrds = 4;  
  12.  omp_set_num_threads(nthrds);  
  13.  long start = clock();  
  14.  for (int i = 0; i < 100; i++) {  
  15.   test();  
  16.  }  
  17.  long end = clock();  
  18.  printf("Time = %ld/n", end - start);  
  19.  start = clock();  
  20.  #pragma omp parallel for  
  21.  for (int i = 0; i < 100; i++) {  
  22.   test();  
  23.  }  
  24.  end = clock();  
  25.  printf("Time = %ld/n", end - start);  
  26.  return 1;  
  27. }  

结果:

1  
2 
3 [root@c0108 zlt]# g++ omp.c -o omp -fopenmp  
4 [root@c0108 zlt]# ./omp  
5 Time = 2860000  
6 Time = 2860000  
7 [root@c0108 zlt]#   
8  

 

clock有三个问题:
1)如果超过一个小时,将要导致溢出.
2)函数clock没有考虑CPU被子进程使用的情况.
3)也不能区分用户空间和内核空间.

原文地址:https://www.cnblogs.com/hitwhhw09/p/4665444.html