【问题标题】:Fortran OpenMP: creating threads only onceFortran OpenMP:只创建一次线程
【发布时间】:2015-05-31 20:05:22
【问题描述】:

我在 Fortran 中工作。我的目的是用 OPENMP 并行处理这种程序:

do t=1, t_fin  (sequential)
   a sequence of do loops (not sequential)
end do

循环是顺序的(时间的)。我试图在每个顺序循环迭代开始时创建线程,但这会使代码比它可能的慢。因此,我的问题是是否可以在开始循环之前只创建一次线程。实际上:

!$OMP PARALLEL

!$OMP SECTIONS
!$OMP CRITICAL
do t=1, t_fin
    sequence of OMP do
end do
!$OMP END CRITICAL
!$OMP END PARALLEL

我已经尝试过这种方式,但它就像只有一个线程一样工作。我想这取决于有一个包含omp do 的外部临界区这一事实。但是,我想用多个线程执行内部omp do。有没有办法获得这个?

【问题讨论】:

  • 我不确定你的问题到底是什么。为什么不使用单个 omp parallel do 指令并行化循环?你为什么使用sections?你为什么要critical 部分?您知道临界区一次只允许一个线程,对吧?你的代码没有意义......

标签: fortran openmp fortran90


【解决方案1】:

如果我正确理解您的问题,您希望避免在外循环的每次迭代中创建线程。这可以通过在循环外使用OMP PARALLEL 指令来实现,并将其他语句留在循环内。然后我看到两个并行化方案。

您可以并行化内部循环:

!$OMP PARALLEL
do t=1, t_fin  (sequential)
   !$OMP DO
   first loop
   !$OMP END DO

   !$OMP DO
   second loop
   !$OMP END DO

   !...
end do
!$OMP END PARALLEL

或者,使用部分并行运行循环(如果它们彼此独立):

!$OMP PARALLEL
do t=1, t_fin  (sequential)
   !$OMP SECTIONS

   !$OMP SECTION 
   first loop
   !$OMP END SECTION

   !$OMP SECTION
   second loop
   !$OMP END SECTION

   !...
   !$OMP END SECTIONS
end do
!$OMP END PARALLEL

在这两个版本中,线程都是在循环之外创建的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-25
    • 1970-01-01
    • 2013-04-22
    • 1970-01-01
    相关资源
    最近更新 更多