我读过Fortran派生类型的手动深度复制是可能的,但是下面的简单测试程序在运行时失败了;程序与PGI v16.10完全编译 . 出了什么问题?
program Test
implicit none
type dt
integer :: n
real, dimension(:), allocatable :: xm
end type dt
type(dt) :: grid
integer :: i
grid%n = 10
allocate(grid%xm(grid%n))
!$acc enter data copyin(grid)
!$acc enter data pcreate(grid%xm)
!$acc kernels
do i = 1, grid%n
grid%xm(i) = i * i
enddo
!$acc end kernels
print*,grid%xm
end program Test
我得到的错误是:
call to cuStreamSynchronize returned error 700: Illegal address during kernel execution
call to cuMemFreeHost returned error 700: Illegal address during kernel execution
1 回答
您只需要在kernels指令中添加“present(grid)”子句 .
这是一个带有修复程序的程序示例,以及一些其他内容,例如更新数据,以便可以在主机上打印 .
请注意,PGI 17.7将在Fortran中包含beta支持真正的深层副本 . 与上面的手动深层复制相反 . 这是使用真正的深拷贝的一个例子: