福特兰& openmp:将多个do-s和section-s放在同一个并行环境中

时间:2014-08-29 22:09:21

标签: fortran openmp

我有一些像这样的序列码:

do i=1,N  
    ...  
end do

do j=1,M  
    ...  
end do

...(1)

...(2)

上面显示了三个串行代码块,其中包含两个do-s和两个独立块。我想把它改编成并行代码。我知道的一种方式是:

!$omp parallel do   
do i ...  
!$omp end parallel  

!$omp parallel do  
do j ...  
!$omp end parallel  

!$omp parallel  
!$omp section ...(1)  
!$omp section ...(2)
!$omp end parallel

请注意,以这种方式,我正在进行四次线程化。作为非专家,我不确定这是否会导致额外的开销时间。是否有可能将所有内容放在一个并行环境中并且会改善开销时间吗?

谢谢!

1 个答案:

答案 0 :(得分:1)

您可以并且可能应该通过在单个并行区域内放置所有并行结构(在本例中为两个do循环和一对部分)来分摊创建和销毁OpenMP并行区域的运行时开销。以下代码按预期编译和执行。

program main
implicit none
integer i
!$omp parallel
!$omp do   
do i = 1, 1000
    print*,'loop 1 ',i
enddo
!$omp do   
do i = 1, 1000
    print*,'loop 2 ',i
enddo
!$omp sections
!$omp section
print*,'section 1'
!$omp section
print*,'section 2'
!$omp end sections
!$omp end parallel
return
end program main

请注意,在此程序中,OpenMP线程池是在

行中构建的
!omp parallel

直到

才被破坏
!omp end parallel

您可以添加" nowait"减少与OpenMP并行结构末尾的隐式障碍相关的运行时开销,但前提是它保留了代码的正确性。