I have a question which has frustrated me for nearly one month and I still cannot figure it out. The snippet of the code is attached here:
!============================= set_ghost_bc_kmax =============================80
!
!
!
!=============================================================================80
subroutine set_ghost_bc_kmax( soln, grid, n_mmtm, bound )
use set_precision, only : dp
use grid_derived_type, only : grid_block, boundary_t
use soln_derived_type, only : soln_block
use set_inputs, only : bc_order
type(grid_block), intent(in) :: grid
type(soln_block), intent(inout) :: soln
integer, intent(in) :: n_mmtm
type(boundary_t), intent(in) :: bound
integer :: i, j, k, klow, khigh, bclow, bchigh, korder, length
!$acc declare create(khigh, klow, korder)
!real(dp), dimension(n_ghost_cells(3)-1 + max(2, bc_order)+1) &
! :: rho, p, temp
!real(dp), dimension(n_mmtm, n_ghost_cells(3)-1 + max(2, bc_order)+1) &
! :: vel
!real(dp), dimension(n_ghost_cells(1)-1 + max(2, bc_order)) &
! :: vol
real(dp) :: molweight
integer :: sign_s = 1
continue
bclow = 1 - (n_ghost_cells(3)-1)
bchigh = max( 2, bc_order )
length = bchigh - bclow + 2
klow = grid%k_cells-bchigh+1
khigh = grid%k_cells-bclow+1
korder = -1
k = grid%kmax
molweight = sum(soln%molecular_weight)
!$acc data present(soln, soln%rho, soln%vel, soln%p, soln%temp, &
!$acc soln%molecular_weight, grid%grid_vars%volume, &
!$acc grid%grid_vars%zeta_n, grid, grid%grid_vars) &
!$acc copyin(bound, bclow, bchigh, n_mmtm)
!$acc data
!$acc kernels
!$acc loop independent
#if OMP_LOOP
!$OMP PARALLEL DO PRIVATE(i)
#endif
do j = bound%indx_min(2),bound%indx_max(2)
!!$acc loop independent vector private(rho, vel, p, temp, molweight, vol)
!$acc loop independent vector
do i = bound%indx_min(1),bound%indx_max(1)
!rho(1:length) = soln%rho(i,j,high+1:low:order)
!vel(1:n_mmtm,1:length) = soln%vel(1:n_mmtm,i,j,high+1:low:order)
!p(1:length) = soln%p(i,j,high+1:low:order)
!temp(1:length) = soln%temp(i,j,high+1:low:order)
!molweight = sum(soln%molecular_weight)
!vol = grid%grid_vars%volume(i,j,high:low:order)
call set_bc_k(bound%bc_label, &
soln%rho(i,j,khigh:klow:korder), &
soln%vel(1:3,i,j,khigh:klow:korder), &
soln%p(i,j,khigh:klow:korder), &
soln%temp(i,j,khigh:klow:korder), &
molweight, &
grid%grid_vars%volume(i,j,khigh:klow:korder), &
grid%grid_vars%zeta_n(1:3,i,j,k), &
bclow, &
bchigh, &
n_mmtm,i,j,bound, sign_s)
!soln%rho(i,j,high+1:low:order) = rho(1:length)
!soln%vel(1:n_mmtm,i,j,high+1:low:order) = vel(1:n_mmtm,1:length)
!soln%p(i,j,high+1:low:order) = p(1:length)
!soln%temp(i,j,high+1:low:order) = temp(1:length)
!molweight = sum(soln%molecular_weight)
end do
end do
#if OMP_LOOP
!$OMP END PARALLEL DO
#endif
!$acc end kernels
!$acc end data
end subroutine set_ghost_bc_kmax
In the snippet of the code, if I use constant variables to indicate the range of the parameters, eg. using “soln%rho(i,j,khigh:klow:korder)”, then when I compile it also returns the error "nvlink error : Undefined reference to ‘cudaMalloc’ in ‘lib/liblibsensei.a:euler_bc_ghost.F90.o’
nvlink error : Undefined reference to ‘cudaFree’ in ‘lib/liblibsensei.a:euler_bc_ghost.F90.o’.
However, if I specify the values of the index, i.e. using “soln%rho(i,j,13:9:-1)” then it could compile.
But why? Thanks a lot!
"