Parallel processing 与-fopenmp使用指定线程编译的gfortran的并行错误

Parallel processing 与-fopenmp使用指定线程编译的gfortran的并行错误,parallel-processing,fortran,openmp,Parallel Processing,Fortran,Openmp,我编写了一个简单的代码来测试并行性的正确性。 要调用的子例程是 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 expo

我编写了一个简单的代码来测试并行性的正确性。 要调用的子例程是

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 
给予

它只是将循环索引i乘以2,但是 并非每个i的结果都是正确的。其中只有少数是正确的

为什么??我不熟悉用fortran进行并行计算。除了答案之外,包含更完整概念教学的优秀并行教程文档将非常有用。
非常感谢。

您的openmp部分遗漏了j。i、 作为循环变量,默认情况下是私有的

由于j不是私有的,几个线程将尝试同时使用use(设置其值或将其用于打印),这将导致不一致的结果


解决方案:在行的末尾添加
PRIVATE(i,j)
$OMP PARALLEL DO

我想我曾经遇到过这样的情况,如果试图显式地将循环变量设为私有,因为它是隐式的,那么我会收到抱怨。我可能记错了,但不管怎么说,
PRIVATE(j)
应该足够了。应该足够了,但我更喜欢在一般情况下把它说清楚。在这个过程中,无论是gfortran还是ifort,我都没有任何错误。
       7          20
       8          16
       9          18
       1          18
       2           4
      10           6
       4           6
       5          10
       6          12
       3          12