【问题标题】:openmp parallelize for inner loopopenmp并行化内部循环
【发布时间】:2014-09-22 18:37:36
【问题描述】:

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

【问题讨论】:

    标签: for-loop parallel-processing fortran openmp


    【解决方案1】:

    为什么i 是私有的?不是所有线程都需要吗?它在整个内部循环期间不得更改(因为它是外部循环的循环计数器)。如果它被声明为私有,除非使用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
    

    【讨论】:

    • 因为我是 OpenMP 新手,所以我不知道如何避免嵌套 OpenMP 部分。感谢您的精彩解释!
    • 也许你可以看看这个tutorial...
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-04-11
    • 1970-01-01
    • 1970-01-01
    • 2013-12-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多