For loop 用于内环的openmp并行化
我有一个Fortran代码。代码包含两个循环。我只想并行化内部循环。这是我的密码: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)在开始时?我是否应该省略它并在第二个循环之
!$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节。谢谢你的解释!也许你可以看看这个。。。