Thank you! Your advice helps me a lot.
Now I met with another error. Here is my code:
module ma
integer :: N=10
type array
real(8), allocatable, dimension(:) :: r
end type
interface assignment(=)
module procedure array_equal_array
end interface
interface operator(+)
module procedure array_add_array
end interface
contains
!--------------------------------------------
subroutine array_equal_array(a,b)
!--------------------------------------------
implicit none
type(array), intent(inout) :: a
type(array), intent(in) :: b
integer :: i
do i = 1, N
a%r(i)=b%r(i)
enddo
return
end subroutine
!--------------------------------------------
function array_add_array(a,b) result(c)
!--------------------------------------------
implicit none
type(array), intent(in) :: a, b
type(array), allocatable :: c
integer :: i
allocate(c)
allocate(c%r(N))
!$acc enter data create(a,b,c)
!$acc enter data create(c%r(N))
!$acc enter data copyin(a%r(N),b%r(N))
!$acc kernels loop present(a,b,c)
do i = 1,N
c%r(i)=a%r(i)+b%r(i)
enddo
!$acc end kernels
!$acc exit data copyout(c%r(N))
!$acc exit data delete(a%r(N),b%r(N))
!$acc exit data delete(a,b,c)
write(*,*) c%r(1:N)
end function
end module
use ma
type(array):: a,b,d
allocate(a%r(N),b%r(N),d%r(N))
a%r = 1; b%r = 2
d=array_add_array(a,b)
write(*,*) d%r
end
pgfortran -acc -ta=tesla:cc60 -Minfo test1.f90
array_equal_array:
29, Memory copy idiom, loop replaced by call to __c_mcopy8
array_add_array:
53, Generating enter data create(a,b,c)
54, Generating enter data create(c%r(:n))
55, Generating enter data copyin(a%r(:n),b%r(:n))
57, Generating present(a,b,c)
58, Loop carried dependence of c%r$p prevents parallelization
Complex loop carried dependence of a%r$p,b%r$p prevents parallelization
Loop carried backward dependence of c%r$p prevents vectorization
Accelerator kernel generated
58, !$acc loop seq
58, Accelerator scalar kernel generated
63, Generating exit data copyout(c%r(:n))
64, Generating exit data delete(a%r(:n),b%r(:n))
65, Generating exit data delete(a,b,c)
Then an error occurs:
./a.out
call to cuStreamSynchronize returned error 700: Illegal address during kernel execution
call to cuMemFreeHost returned error 700: Illegal address during kernel execution
Do you know how to solve this problem?