在我尝试理解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
几个问题:
首先,向量routine1
包含vector
个循环,但在seq
循环内调用。在我看来,这会在vector
循环中放置seq
循环,我认为这是不正确的。我一定是错的,因为代码运行。但我怎么错了?
其次,所有调用都在parallel
区域内完成。但是routine1
有两个独立的循环,我认为在parallel
区域内线程不停在循环的末端,但只是保持桶到下一个循环,然后会引起各种各样的问题。再次,代码运行并产生合理的结果,所以我一定是错的,但我怎么错?
第三,关于declare create
中的routine1
,我认为该语句适用于整个执行存在的全局变量,而不是局部变量。我认为处理局部变量的方法是设置一个data
区域,其中包含所需的copyin
,copyout
,你有什么条款。
这似乎是一个很好的代码。它以合理的结果运行,由一个当然应该知道他在做什么的人写的。但它违反了我所读到的关于OpenACC的很多东西。我需要找到更好的材料才能阅读吗?