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)ユーザ空間とカーネル空間を区別することもできない.
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 }
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]#
#include
int a = 0;
a = i + 1;
}
int nthrds = 4;
long start = clock();
test();
long end = clock();
start = clock();
for (int i = 0; i < 100; i++) {
}
printf("Time = %ld/n", end - start);
}
結果:
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)ユーザ空間とカーネル空間を区別することもできない.