我在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
。有没有办法获得这个?
答案 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
在两个版本中,线程都是在循环外创建的。