我有一些像这样的序列码:
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
请注意,以这种方式,我正在进行四次线程化。作为非专家,我不确定这是否会导致额外的开销时间。是否有可能将所有内容放在一个并行环境中并且会改善开销时间吗?
谢谢!
答案 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并行结构末尾的隐式障碍相关的运行时开销,但前提是它保留了代码的正确性。