我有以下程序结构:
type(mytype) :: x(10)
!$OMP PARALLEL DEFAULT(SHARED)
!$OMP MASTER
do i = 1, 10
call sub1(x(i)) ! some stuff that cannot be parallelized
call sub2(x(i)) ! some stuff that can be parallelized once sub1 has completed
!$OMP END MASTER
!$OMP END PARALLEL
[.....]
subroutine sub2(x)
type(mytype), intent(inout) :: x
integer :: j, k
integer, allocatable :: v(:)
allocate( v(10000) )
v(:) = ... ! filling up v
do j = 1, 1000
!$OMP TASK DEFAULT(NONE) SHARED(x) PRIVATE(k) FIRSTPRIVATE(j,v)
!...working on x
!$OMP END TASK
end do
end subroutine
但它的表现并不如预期:
sub2()
。是因为初始化任务需要花费大量时间(特别是为每个任务复制 firstprivate
数组)吗?任务中使用的所有虚拟参数都声明为
sub2()
任务中使用的所有局部变量都声明为
SHARED
PRIVATE
,因此应具有与任务本身相同的生命周期
根据我所做的评论和一些附加测试,事实证明,在所有任务完成之前,不得退出已生成某些任务的例程。一个解决方案是在例程末尾放置一个
taskwait
的所有迭代。我最终得到了一个解决方案,其中将对
sub1()
的调用包含在任务中:这样,主线程可以继续执行,而无需等待
sub2()
退出:
sub2()