与OpenACC混淆

时间:2016-03-24 14:16:51

标签: fortran openacc

在我尝试理解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区域,其中包含所需的copyincopyout,你有什么条款。

这似乎是一个很好的代码。它以合理的结果运行,由一个当然应该知道他在做什么的人写的。但它违反了我所读到的关于OpenACC的很多东西。我需要找到更好的材料才能阅读吗?

0 个答案:

没有答案