並列性の正確性をテストする簡単なコードを書きました。 呼び出されるサブルーチン-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との並列コンピューティングには新しいです。答えのほかに、より完全なコンセプトの教授が含まれている並列のための素敵なチュートリアル文書は非常に役に立ちます。 多くのありがとうございます。
の最後に
PRIVATE(i,j)
を追加します。私は誤って覚えている可能性がありますが、とにかく 'PRIVATE(j)'で十分でしょう。 –十分なはずですが、一般的に明示的にすることをお勧めします。この手順では、gfortranまたはifortのいずれのエラーも発生しませんでした。 –