在使用 OpenACC 加速的 Fortran 程序上,我需要在 GPU 上复制一个数组。复制的数组只会在 GPU 上使用,永远不会在主机上复制。我知道创建它的唯一方法是在主机上声明和分配它,然后acc data create
它:
program test
implicit none
integer, parameter :: n = 1000
real :: total
real, allocatable :: array(:)
real, allocatable :: array_d(:)
allocate(array(n))
allocate(array_d(n))
array(:) = 1e0
!$acc data copy(array) create(array_d) copyout(total)
!$acc kernels
array_d(:) = array(:)
!$acc end kernels
!$acc kernels
total = sum(array_d)
!$acc end kernels
!$acc end data
print *, sum(array)
print *, total
deallocate(array)
deallocate(array_d)
end program
这是一个插图代码,因为所讨论的程序要复杂得多。
这个解决方案的问题是我必须allocate
在主机上复制数组,即使我在这里不使用它。一些主机内存会被浪费,特别是对于大型阵列(即使我知道在主机内存用完之前我会用完设备内存)。在 CUDA Fortran 上,我知道我可以声明一个仅设备数组,但我不知道这是否可以通过 OpenACC 实现。
有没有更好的方法来执行此操作?