我有一个Fortran代码。代码包含两个循环。我想并行化 ONLY 内部循环。这是我的代码:
!$OMP PARALLEL PRIVATE(i,j)
do i=1, N
!$OMP PARALLEL DO
do j=1, M
! do some calculations
end do
!$OMP END PARALLEL DO
end do
!$OMP END PARALLEL
并行化是否正确?我不确定,是否需要将!$OMP PARALLEL PRIVATE(i,j)
置于开头?我应该省略它并在第二个循环之前声明PRIVATE(i)
吗?无论如何,我有点困惑,请解释什么是正确的行为。
答案 0 :(得分:1)
为什么i
是私密的?是不是所有线程都需要?它不能在整个内循环期间改变(因为它是外循环的循环计数器)。如果它被声明为private,则在并行部分的开头未定义,除非使用firstprivate
。
Fortran中的OpenMP注意到j
是并行化循环的循环计数器,因此它是隐式私有的。所以没有必要明确声明它。
接下来就是你应该避免使用嵌套的OpenMP部分(即第二个!$OMP PARALLEL
)
因为我喜欢明确,我会把它写成
!$OMP PARALLEL PRIVATE(j) SHARED(i)
do i=1, N
!$OMP DO
do j=1, M
! do some calculations
end do
!$OMP END DO
end do
!$OMP END PARALLEL