2016-11-30 4 views
0

を行うネストされた:OpenMPの一部にParallelising私はサブルーチンで次の操作を実行しようとしたとき、私は任意のスピードアップを取得しないループのFortran

!$ call omp_set_num_threads(threadno) 
call system_clock(x1) 

!$OMP PARALLEL do private(i), reduction(+:total)  
    do i = 1,m 
     total = 0.d0 
     call result(a,l,b,qm,q,en) !here l is input for subroutine and en is output 
     qm(:,i) = q 
     qtv(i) = qt 
     mean = sum(q)/size(q) 
     do i2 = 1,k 
      total = total + ((mean-q(i2))**2)/(a+b) 
     end do 
     qvv(i1) = total 
    end do 
    call system_clock(x2) 
    print *, x2-x1 
!$OMP END PARALLEL do 
+0

@HighPerformanceMarkがロードされます。mは、サブルーチンの入力として設定されます。私は時間にcpu_timeを使用し、スレッドは入力として設定されています。 –

+0

スレッドが20個あり、壁時計の時間が20倍短縮されている場合、CPU_TIMEはどのくらいでしょうか? 1/20または同じCPU時間? – Holmz

+0

@Holmz 1/20の時間? –

答えて

0

コメント:

  1. totalがリセットされるべきでありませんループの中で、!$OMP節の前。
  2. i2およびmeanはプライベートである必要があります。
  3. qがループの繰り返しの間で変更されない場合は、sum(q)/size(q)を外側に配置する必要があります。

プライベート設定がないと、メモリアクセスの競合が発生する可能性があります。

あなたが表示するコードは、実際にコンパイルしたものに近いが実際にはそうではないと思う。より良いヘルプを提供するためにコンパイルされたコードを持つことは有益でしょう。

乾杯、

ピエール

EDIT:OpenMPのコードのタイミングのために、あなたは(https://gcc.gnu.org/onlinedocs/libgomp/omp_005fget_005fwtime.htmlを参照)walltime https://en.wikipedia.org/wiki/Wall-clock_timeを与えることomp_get_wtimeを使用する必要があります。 openmpルーチンのモジュールには、use omp_lib

+0

こんにちはピエール、助けてくれてありがとう。私は自分のコードを修正し、それが役立つことを願っています。私がサブルーチンの結果を呼び出すとき、lopの反復の間でqが変化します。それ自体はランダム化要素を持っています。 –

+0

i1をまだプライベートにする必要はありますか?ループの後でOMP節の後にトートルをリセットできないのはなぜですか? –

+0

を反復するたびに合計を初期化したいのですが、 '!$ OMP DO'節の直後のループ変数のみがデフォルトでプライベートです。 'i2'がどのようにゲームに入っているのか分かりませんが、ループの前に定義されていてループ内で変更されていない限り、それはプライベートでなければなりません。 'en'と' q'がルーチンによって出力されるので、それらもプライベートでなければなりません。 –

関連する問題