2016-11-25 10 views
0

OpenMPで次のコードの実行を高速化しようとしています。このコードは、マンデルブロを計算してキャンバスに出力するためのものです。OpenMPでコード実行が遅くなる

コードはうまく機能しますが、OpenMPを使用して高速化したいと考えています。私はプライベート変数とシェア変数のあらゆる種類の組み合わせを試みましたが、これまでに何も動作していないようです。このコードは、OpenMPを使用しない場合(50,000回の反復 - 2秒の遅さ)よりも少し遅く実行されます。

私はUbuntu 16.04を使用し、GCCでコンパイルしています。コードが使用

void calculate_mandelbrot(GLubyte *canvas, GLubyte *color_buffer, uint32_t w, uint32_t h, mandelbrot_f x0, mandelbrot_f x1, mandelbrot_f y0, mandelbrot_f y1, uint32_t max_iter) { 
mandelbrot_f dx = (x1 - x0)/w; 
mandelbrot_f dy = (y1 - y0)/h; 
uint16_t esc_time; 
int i, j; 
mandelbrot_f x, y; 

//timer start 
clock_t begin = clock(); 

#pragma omp parallel for private(i,j,x,y, esc_time) shared(canvas, color_buffer) 
for(i = 0; i < w; ++i) { 
    x = x0 + i * dx; 
    for(j = 0; j < h; ++j) { 
     y = y1 - j * dy; 
     esc_time = escape_time(x, y, max_iter); 

     canvas[ GET_R(i, j, w) ] = color_buffer[esc_time * 3]; 
     canvas[ GET_G(i, j, w) ] = color_buffer[esc_time * 3 + 1]; 
     canvas[ GET_B(i, j, w) ] = color_buffer[esc_time * 3 + 2]; 

     } 
} 

//time calculation 
clock_t end = clock(); 
double time_spent = (double)(end - begin)/CLOCKS_PER_SEC; 
printf("%f\n",time_spent); 
} 

escape_time機能:

inline uint16_t escape_time(mandelbrot_f x0, mandelbrot_f y0, uint32_t max_iter) { 
mandelbrot_f x = 0.0; 
mandelbrot_f y = 0.0; 
mandelbrot_f xtemp; 
uint16_t iteration = 0; 
while((x*x + y*y < 4) && (iteration < max_iter)) { 
    xtemp = x*x - y*y + x0; 
    y = 2*x*y + y0; 
    x = xtemp; 
    iteration++; 
} 
return iteration; 

}

コードは、このリポジトリからhttps://github.com/hortont424/mandelbrot

+5

[OpenMPの時間とクロック()は、2つの異なる結果を計算します](http://stackoverflow.com/questions/10673732/openmp-time-and-clock-calculates-two-different-results) –

答えて

1

最初に、コメントでほのめかしたように、代わりclock()omp_get_wtime()を使用(これは、すべてのスレッドに累積されたクロックティックの数を示します)、時間を測定します。私が正しくリコール場合は第二に、このアルゴリズムは、負荷分散の問題を持っているので、動的スケジューリングを使用してみてください:それは私の問題は、CPU時間を計測する時計()関数を使用することによって引き起こされたことが示唆されたとして

//timer start 
double begin = omp_get_wtime(); 

#pragma omg parallel for private(j,x,y, esc_time) schedule(dynamic, 1) 
for(i = 0; i < w; ++i) { 
    x = x0 + i * dx; 
    for(j = 0; j < h; ++j) { 
     y = y1 - j * dy; 
     esc_time = escape_time(x, y, max_iter); 

     canvas[ GET_R(i, j, w) ] = color_buffer[esc_time * 3]; 
     canvas[ GET_G(i, j, w) ] = color_buffer[esc_time * 3 + 1]; 
     canvas[ GET_B(i, j, w) ] = color_buffer[esc_time * 3 + 2]; 

     } 
} 

//time calculation 
double end = omp_get_wtime(); 
double time_spent = (double)(end - begin)/CLOCKS_PER_SEC; 
printf("%f\n",time_spent); 
+0

この質問の問題?その3回連続して人々は何も言わずに私を投票している。 – dreamcrash

+0

重複した旗を掲げた他の人、またはそれを見て、重複した質問に対する回答を得るために他のユーザーに代理人を貰うことができないと思っていた人からのものかもしれません。それはリンクされたQよりもはるかに包括的で具体的な素敵な答えです。ここには+1があります。 –

+0

サポートに感謝する可能性が最も高い – dreamcrash

0

を。 代わりにomp_get_wtime()を使用して私の問題を解決しました。

+0

ダイナミックでテストして、パフォーマンスが向上するかどうか教えてください。おかげさまで、感謝しています。 – dreamcrash

+0

私は、これは学校の割り当てだったので、私もこのオプションをテストしました。違いはありませんでした。 – martin49

関連する問題