【问题标题】:Parallelization of inner "do loop" inside a "do while loop" with openmp使用openmp在“do while循环”内并行化内部“do循环”
【发布时间】:2013-12-12 09:48:11
【问题描述】:

我有一个伪代码是这样的:

Do while loop
  if condition
    call subroutinex(In)
  else
    do i=2,max
      ln=i
      call subroutinex(ln)
    end do
  endif
  other serial work
end do

我已经成功地像这样并行化了内部循环

Do while loop
  if condition
    call subroutinex(In)
  else
!$OMP PARALLEL DEFAULT (SHARED) PRIVATE (pr.variables)
!$OMP DO
    do i=2,max
      ln=i
      call subroutinex(ln)
    end do
!$OMP END DO
!$OMP END PARALLEL
  endif
  other serial work
end do

这段代码对我来说很好,可以产生正确的结果,并且运行时间大约是优化的自动并行化 NO-OMP 版本的一半(对于 max=5)。我怀疑(虽然不太确定)在“Do while 循环”中生成并行区域可能会导致一些不必要的开销,我可以避免使用不同的方法(在外部循环之外生成并行区域并使用 !$OMP CRITICAL 或 !$OMP MASTER)。不过,我似乎无法理解正确的语法是怎样的。非常欢迎任何建议。

最好的问候, 使徒

【问题讨论】:

    标签: loops parallel-processing openmp


    【解决方案1】:

    我认为你的伪代码的这种修改应该可以工作

    !$OMP PARALLEL DEFAULT (SHARED) PRIVATE (pr.variables)
    Do while loop
      if condition
        !$OMP SINGLE
        call subroutinex(In)
        !$OMP END SINGLE
      else
    !$OMP DO
        do i=2,max
          ln=i
          call subroutinex(ln)
        end do
    !$OMP END DO
      endif
      !$OMP SINGLE
      other serial work
      !$OMP END SINGLE
    end do
    !$OMP END PARALLEL
    

    您需要仔细检查变量的可访问性。

    这可能不会显着提高速度。进入并行区域的开销通常不包括启动线程组的时间,而是激活在程序初始化时建立的组的时间。但是请务必报告并让我知道这 (a) 是否有效并且 (b) 是否提高了执行速度。

    【讨论】:

      【解决方案2】:

      您也可以探索 OpenMP 任务,例如

      !$OMP PARALLEL DEFAULT (SHARED) PRIVATE (pr.variables)
      !$OMP SINGLE
      Do while loop
        if condition
          call subroutinex(In)
        else
          do i=2,max
            ln=i
      !$OMP TASK firstprivate(ln)
            call subroutinex(ln)
      !$OMP END TASK
          end do
      !$OMP TASKWAIT
        endif
        other serial work
      end do
      !$OMP END SINGLE nowait
      !$OMP END PARALLEL
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-11-29
        • 2021-10-22
        • 1970-01-01
        • 2016-03-27
        • 1970-01-01
        相关资源
        最近更新 更多