OpenMP並列化処理テスト

7594 ワード

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つのスレッドが開いていて、加速比はほぼ4なので、やっぱりいいですね. 
また、BSはclock()関数を見ると、私はこれまで何の役にも立たないと思っていました.の
#include   
  • #include   

  • #include   
  • void test() {  

  •  int a = 0;  
  •  for(int i = 0; i < 10000000; i++) {  

  •   a = i + 1;  
  •  }  

  • }  
  • int main() {  

  •  int nthrds = 4;  
  •  omp_set_num_threads(nthrds);  

  •  long start = clock();  
  •  for (int i = 0; i < 100; i++) {  

  •   test();  
  •  }  

  •  long end = clock();  
  •  printf("Time = %ld/n", end - start);  

  •  start = clock();  
  •  #pragma omp parallel for  

  •  for (int i = 0; i < 100; i++) {  
  •   test();  

  •  }  
  •  end = clock();  

  •  printf("Time = %ld/n", end - start);  
  •  return 1;  

  • }  
    結果:
    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には3つの問題がある:1)1時間を超えるとオーバーフローを招く.2)関数clockがCPUの布団プロセスで使用することを考慮していない場合.3)ユーザ空間とカーネル空間を区別することもできない.