2017-02-21 20 views
0

このコードを実行するたびに、パラレルセクションで実行された実行時間が変わっています。私は自分のコアに応じて一定数のスレッドを試しましたが、まだ努力は無駄です。プログラムはpiの値を計算することです。 gcc -fopenmpでコンパイルされます。OpenMP並列領域の実行時間が変動する

#include <stdio.h> 
#include <omp.h> 

static long num_steps = 100000; double step; 
//double omp_get_wtime(void); 

int main(){ 
     int i; 
     double x,pi,max_threads,start,time; 
     double sum=0.0; 
     step = 1.0/(double) num_steps; 
    //omp_set_num_threads(4);  
     omp_get_max_threads(); 
     start=omp_get_wtime(); 

    #pragma omp parallel 
    { 

    #pragma omp for reduction(+:sum) schedule(static) private(x) //reduction to get local copy 
      for (i=0;i<num_steps;i++){ 
      x=(i+0.5)*step; 
      sum += 4.0/(1.0+x*x); 
      } 
    //max_threads=omp_get_max_threads(); 
    } 
time=omp_get_wtime()-start; 
pi=step*sum; 
printf("pi=(%f)\t run_time(%f)\n",pi,time);//,max_threads); 
return 0; 
} 
+2

ようこそスタックオーバーフロー!あなたの質問のタイトルは非常に一般的であり、決して実際の問題を反映していません。しばらく時間をとり、ヘルプセクションの[良い質問をどうやってください?](http://stackoverflow.com/help/how-to-ask)を読んでください。 –

+0

実行時間を一定にするには、一般的な要件として、スレッドをピン止めして他のタスクとの競合を避ける必要があります。シンプルな和を減らしてシム最適化を妨げている場合、そのタスクはあまり意味がありません。 – tim18

答えて

0

コードが(私のシステム2-6 MSに)ほんの数ミリ秒を実行し、時間は、例えば、オーバーヘッド支配されていますスレッドの作成用シリアルバージョンは< 1 msです。このような短い実行時間は、システムの現在の状態に依存するので非常に可変であるのが普通である。いくつかの「ウォーミングアップが必要」があります。

この場合、意味のある安定した結果を得るには、num_stepsを増やすだけです。例えば。 num_steps = 1000000000では、私のシステムでは10回の実行はすべて4.332秒から4.399秒です。

一般に、パフォーマンス測定を行う場合は、-O3フラグを付けてコンパイルする必要があります。

関連する問題