For loop 用于内环的openmp并行化

For loop 用于内环的openmp并行化,for-loop,parallel-processing,fortran,openmp,For Loop,Parallel Processing,Fortran,Openmp,我有一个Fortran代码。代码包含两个循环。我只想并行化内部循环。这是我的密码: !$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并行专用(i,j)在开始时?我是否应该省略它并在第二个循环之

我有一个Fortran代码。代码包含两个循环。我只想并行化内部循环。这是我的密码:

!$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并行专用(i,j)
在开始时?我是否应该省略它并在第二个循环之前声明PRIVATE(I)?无论如何,我有点困惑,请解释什么是正确的行为。

为什么
I
是私有的?不是所有线程都需要它吗?它在整个内循环期间不得改变(因为它是外循环的循环计数器)。如果声明为private,则在并行部分的开头未定义,除非使用了
firstprivate

Fortran中的OpenMP注意到,
j
是并行化循环的循环计数器,因此它是隐式私有的。因此,没有必要显式地声明它

接下来,您应该避免嵌套OpenMP节(即第二个
!$OMP并行

因为我喜欢直截了当,我会把它写成

!$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

由于我是OpenMP新手,我不知道如何避免嵌套OpenMP节。谢谢你的解释!也许你可以看看这个。。。