openmp并行化内循环

时间:2014-09-22 18:37:36

标签: for-loop parallel-processing fortran openmp

我有一个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)吗?无论如何,我有点困惑,请解释什么是正确的行为。

1 个答案:

答案 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