2017-11-16 14 views
0

並列性の正確性をテストする簡単なコードを書きました。 呼び出されるサブルーチン-fopenmpによって指定されたスレッドでコンパイルされたgfortranとの間違い

SUBROUTINE two_pt_fn() 
IMPLICIT NONE 
INTEGER :: i,j 
!$OMP PARALLEL DO 
DO i=1,10 
j=i*2 
WRITE(*,*)i,j 
END DO 
!$OMP END PARALLEL DO 
END SUBROUTINE 

メインプログラムは、単に上記のサブルーチンを呼び出し、 コードが

gfortran -fopenmp -o m.x sb_two_pt_fn.f90 main.f90 
export OMP_NUM_THREADS=10 

./m.x 

が得られる実行結果によってコンパイルされたソースであります

 7   20 
     8   16 
     9   18 
     1   18 
     2   4 
     10   6 
     4   6 
     5   10 
     6   12 
     3   12 

単純にループインデックスiに2を掛けていますが、 の結果はすべてのiで正しくないことがわかります。ほんのわずかなものが正しいです。

なぜですか?私はFortranとの並列コンピューティングには新しいです。答えのほかに、より完全なコンセプトの教授が含まれている並列のための素敵なチュートリアル文書は非常に役に立ちます。 多くのありがとうございます。

答えて

1

あなたのopenmpセクションはjの "private"句を逃します。ループ変数であるiは、デフォルトではプライベートです。

jはプライベートではないので、いくつかのスレッドは同時にuse(値を設定するか、印刷に使用する)を試みますが、結果が矛盾します。

解決策:私はそれだとループ変数を明示的にプライベートにしようとした場合、私は暗黙のうちにそうである苦情を取得するインスタンスを持っていたと思うライン!$OMP PARALLEL DO

+0

の最後にPRIVATE(i,j)を追加します。私は誤って覚えている可能性がありますが、とにかく 'PRIVATE(j)'で十分でしょう。 –

+0

十分なはずですが、一般的に明示的にすることをお勧めします。この手順では、gfortranまたはifortのいずれのエラーも発生しませんでした。 –

関連する問題