与-fopenmp和指定线程编译的gfortran错误并行

时间:2017-11-16 11:14:46

标签: 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
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但是 每个我的结果都不正确。只有少数是正确的。

为什么?我是fortran并行计算的新手。除了答案,并行的精美教程文档包括更完整的概念教学将非常有帮助。 非常感谢。

1 个答案:

答案 0 :(得分:1)

你的openmp部分错过了"私人" j的条款。作为循环变量,我默认是私有的。

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

解决方案:在PRIVATE(i,j)

行的末尾添加!$OMP PARALLEL DO