Fortran OpenMP:只创建一次线程

时间:2015-05-31 11:25:11

标签: fortran openmp fortran90

我在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。有没有办法获得这个?

1 个答案:

答案 0 :(得分:2)

如果我正确理解了您的问题,您希望避免在外部循环的每次迭代中创建线程。这可以通过在循环外部使用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

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