OpenMPによる並列化処理について質問させてください。
今開発をしているプログラムに、OpenMPによる並列化処理を組み込みたいと考えております。
まずはOpenMPによる並列処理がどのようなものなのか試してみようと、適当なコードをかいて実行してみたのですが、実行時間が縮まるどころかむしろ大きく伸びてしまいました。理由が何なのか自分では見当が付きません。
実行時間が縮まらない原因としてどのような要因が考えられるか、皆様の意見をお聞かせください。
実行環境
OS:Linux version 4.4.52-2vl6
コンパイラ:gcc version 4.9.3
CPU:Intel(R) Core(TM) i7-2600 CPU @ 3.40GHz
C
1#include<stdio.h> 2#include<time.h> 3 4double X[100][100],T[100000]; 5 6int main(void){ 7 8 int i,j,k,t; 9 double tp,tnp,rate; 10 clock_t start,stop; 11 12 t = 100; 13 //並列化しなかった場合 14 for(k=0;k<t;k++){ 15 start = clock(); 16 //適当な処理 17 for(j=0;j<100;j++){ 18 for(i=0;i<100;i++){ 19 X[i][j] = (i+j)-i*j; 20 } 21 } 22 //適当な処理 23 stop = clock(); 24 T[k]= stop-start; 25 } 26 //t回の平均をとる 27 for(k=0;k<t;k++){ 28 tnp += T[k]; 29 } 30 tnp /= t; 31 //t回の平均をとる 32 //並列化しなかった場合 33 34 //並列化した場合 35 for(k=0;k<t;k++){ 36 start = clock(); 37 //適当な処理 38 #pragma omp parallel 39 { 40 #pragma omp for 41 for(j=0;j<100;j++){ 42 for(i=0;i<100;i++){ 43 X[i][j] = (i+j)-i*j; 44 } 45 } 46 } 47 //適当な処理 48 stop = clock(); 49 T[k]= stop-start; 50 } 51 //t回の平均をとる 52 for(k=0;k<t;k++){ 53 tp += T[k]; 54 } 55 tp /= t; 56 //t回の平均をとる 57 //並列化した場合 58 59 rate = tp/tnp; 60 printf("not paralleled time = %f\n",tnp); 61 printf("paralleled time = %f\n",tp); 62 printf("rate = %f\n",rate); 63 64 return 0; 65}
コンパイル時のオプションを、-fopenmp とした場合、出力は以下のようでした。
not paralleled time = 70.170000
paralleled time = 690.490000
rate = 9.840245
また、コンパイル時にオプションをつけなかった場合、出力は以下のようでした。
not paralleled time = 80.800000
paralleled time = 39.160000
rate = 0.484653
(コンパイル時のオプションを、-fopenmp となかった場合、並列化処理の効果が出ているように思えるのですが、参考にしたサイトには「オプションを-fopenmp としなかった場合OpenMPによる並列化処理は行われない」とあり、そこでも悩んでいます。)

回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/10/22 11:27