我目前正在加速 Fortran 代码,其中我在 subroutine 中有一个主要的加速循环sub
。在循环中,我想subsub
在设备上调用子程序acc routine
。子例程有一个intent(out)
参数val
,它在循环中是私有的。与subsub
循环本身一样,我想使用该vector
子句:
module calc
implicit none
public :: sub
private
contains
subroutine sub()
integer :: i
integer :: array(10)
integer :: val
!$acc kernels loop independent private(val)
do i = 1, 10
call subsub(val)
array(i) = val
enddo
print "(10(i0, x))", array
endsubroutine
subroutine subsub(val)
!$acc routine vector
integer, intent(out) :: val
integer :: i
val = 0
!$acc loop independent reduction(+:val)
do i = 1, 10
val = val + 1
enddo
endsubroutine
endmodule
program test
use calc, only: sub
implicit none
call sub()
endprogram
使用 PGI 编译器版本 20.9-0 编译并运行程序时,我在 variable 中得到乱码值array
。当我简单地使用acc routine
forsubsub
时,我得到了正确的行为(在 的所有值中为 10 array
)。我并行化这个子例程的方法有什么问题?