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()函數,我向來以爲它一無可取。。。spa

  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)也不能區分用戶空間和內核空間.code

相關文章
相關標籤/搜索