【发布时间】:2017-08-08 19:28:03
【问题描述】:
我阅读了 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
【问题讨论】:
-
根据文档(PGI openacc 指南,v2015 和 v2017):派生类型的数组,其中派生类型包含可分配的成员,未经测试,不应被视为此版本支持。 stackoverflow.com/questions/45233207/…
-
原来注释掉pcreate(grid%xm)的创建可以让程序正常运行。这是否意味着现在支持深度复制?
-
“尚未经过测试,不应被视为支持”...用于数组的位。您只有一个变量,所以我不知道,请尝试在手册中搜索。