我写了一个简单的代码来测试并行性的正确性。 要调用的子程序是
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并行计算的新手。除了答案,并行的精美教程文档包括更完整的概念教学将非常有帮助。 非常感谢。
答案 0 :(得分:1)
你的openmp部分错过了"私人" j的条款。作为循环变量,我默认是私有的。
由于j不是私有的,因此多个线程会尝试同时使用use(设置其值或用于打印),这会导致结果不一致。
解决方案:在PRIVATE(i,j)
!$OMP PARALLEL DO