1

在我试图理解 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 createin routine1,我认为该语句适用于在整个执行过程中存在的全局变量,而不是局部变量。data我认为处理局部变量的方法是使用 required copyin, copyout, what have you, 子句设置一个区域。

这似乎是一个很好的代码。它的运行结果合理,并且是由当然应该知道自己在做什么的人编写的。但它违反了我所读到的关于 OpenACC 的很多内容。我需要找到更好的材料来阅读吗?

4

0 回答 0