在我试图理解 OpenACC 的过程中,我遇到了一个具有以下结构的代码:
program main
$!acc routine(routine1) vector
real :: a(100,100)
$!acc declare create(a(:,:))
$!acc parallel
$!acc loop seq
do i=1,100
call routine1(a(1,i))
enddo
$!acc end parallel
end program
subroutine routine1(a)
!$acc routine vector
real::a(100),b(100)
!$acc declare create(b(:))
$!acc loop vector
do i=1,100
! stuff with a(i)
enddo
$!acc loop vector
do i=100,1,-1
! more stuff with a(i) and b(i)
enddo
end subroutine
几个问题:
首先,vectorroutine1
包含vector
循环,但在循环中被调用seq
。在我看来,这将一个vector
循环放在一个seq
循环中,我认为这是不正确的。我一定是错的,因为代码运行。但我怎么错了?
其次,所有的调用都是在一个parallel
区域内完成的。但是routine1
有两个独立的循环,我认为在一个parallel
区域内,线程不会在循环结束时停止,而只是不断地进入下一个循环,这会导致各种问题。再次,代码运行并产生合理的结果,所以我一定是错的,但我错了?
第三,关于declare create
in routine1
,我认为该语句适用于在整个执行过程中存在的全局变量,而不是局部变量。data
我认为处理局部变量的方法是使用 required copyin
, copyout
, what have you, 子句设置一个区域。
这似乎是一个很好的代码。它的运行结果合理,并且是由当然应该知道自己在做什么的人编写的。但它违反了我所读到的关于 OpenACC 的很多内容。我需要找到更好的材料来阅读吗?