Merged changes from V4 OpenACC

oacc_loloum
sfilippone 2 years ago
parent bcbe0c89c7
commit 096bce08c1

@ -139,9 +139,14 @@ contains
class(psb_c_oacc_csr_sparse_mat), intent(inout) :: a
integer(psb_ipk_) :: info
if (allocated(a%val)) call acc_delete_finalize(a%val)
if (allocated(a%ja)) call acc_delete_finalize(a%ja)
if (allocated(a%irp)) call acc_delete_finalize(a%irp)
!
! Note: at least on GNU, if an array is allocated
! but with size 0, then CREATE,UPDATE and DELETE
! will fail
!
if (psb_size(a%val)>0) call acc_delete_finalize(a%val)
if (psb_size(a%ja)>0) call acc_delete_finalize(a%ja)
if (psb_size(a%irp)>0) call acc_delete_finalize(a%irp)
return
end subroutine c_oacc_csr_free_dev_space
@ -246,9 +251,15 @@ contains
subroutine c_oacc_csr_sync_dev_space(a)
implicit none
class(psb_c_oacc_csr_sparse_mat), intent(inout) :: a
if (allocated(a%val)) call acc_create(a%val)
if (allocated(a%ja)) call acc_create(a%ja)
if (allocated(a%irp)) call acc_create(a%irp)
!
! Note: at least on GNU, if an array is allocated
! but with size 0, then CREATE,UPDATE and DELETE
! will fail
!
if (psb_size(a%val)>0) call acc_create(a%val)
if (psb_size(a%ja)>0) call acc_create(a%ja)
if (psb_size(a%irp)>0) call acc_create(a%irp)
end subroutine c_oacc_csr_sync_dev_space
subroutine c_oacc_csr_sync(a)
@ -258,14 +269,19 @@ contains
integer(psb_ipk_) :: info
tmpa => a
!
! Note: at least on GNU, if an array is allocated
! but with size 0, then CREATE,UPDATE and DELETE
! will fail
!
if (a%is_dev()) then
call acc_update_self(a%val)
call acc_update_self(a%ja)
call acc_update_self(a%irp)
if (psb_size(a%val)>0) call acc_update_self(a%val)
if (psb_size(a%ja)>0) call acc_update_self(a%ja)
if (psb_size(a%irp)>0) call acc_update_self(a%irp)
else if (a%is_host()) then
call acc_update_device(a%val)
call acc_update_device(a%ja)
call acc_update_device(a%irp)
if (psb_size(a%val)>0) call acc_update_device(a%val)
if (psb_size(a%ja)>0) call acc_update_device(a%ja)
if (psb_size(a%irp)>0) call acc_update_device(a%irp)
end if
call tmpa%set_sync()
end subroutine c_oacc_csr_sync

@ -138,11 +138,15 @@ contains
class(psb_c_oacc_ell_sparse_mat), intent(inout) :: a
integer(psb_ipk_) :: info
if (allocated(a%val)) call acc_delete_finalize(a%val)
if (allocated(a%ja)) call acc_delete_finalize(a%ja)
if (allocated(a%irn)) call acc_delete_finalize(a%irn)
if (allocated(a%idiag)) call acc_delete_finalize(a%idiag)
!
! Note: at least on GNU, if an array is allocated
! but with size 0, then CREATE,UPDATE and DELETE
! will fail
!
if (psb_size(a%val)>0) call acc_delete_finalize(a%val)
if (psb_size(a%ja)>0) call acc_delete_finalize(a%ja)
if (psb_size(a%irn)>0) call acc_delete_finalize(a%irn)
if (psb_size(a%idiag)>0) call acc_delete_finalize(a%idiag)
return
end subroutine c_oacc_ell_free_dev_space
@ -177,10 +181,15 @@ contains
implicit none
class(psb_c_oacc_ell_sparse_mat), intent(inout) :: a
if (allocated(a%val)) call acc_create(a%val)
if (allocated(a%ja)) call acc_create(a%ja)
if (allocated(a%irn)) call acc_create(a%irn)
if (allocated(a%idiag)) call acc_create(a%idiag)
!
! Note: at least on GNU, if an array is allocated
! but with size 0, then CREATE,UPDATE and DELETE
! will fail
!
if (psb_size(a%val)>0) call acc_create(a%val)
if (psb_size(a%ja)>0) call acc_create(a%ja)
if (psb_size(a%irn)>0) call acc_create(a%irn)
if (psb_size(a%idiag)>0) call acc_create(a%idiag)
end subroutine c_oacc_ell_sync_dev_space
function c_oacc_ell_is_host(a) result(res)
@ -241,16 +250,21 @@ contains
integer(psb_ipk_) :: info
tmpa => a
!
! Note: at least on GNU, if an array is allocated
! but with size 0, then CREATE,UPDATE and DELETE
! will fail
!
if (a%is_dev()) then
call acc_update_self(a%val)
call acc_update_self(a%ja)
call acc_update_self(a%irn)
call acc_update_self(a%idiag)
if (psb_size(a%val)>0) call acc_update_self(a%val)
if (psb_size(a%ja)>0) call acc_update_self(a%ja)
if (psb_size(a%irn)>0) call acc_update_self(a%irn)
if (psb_size(a%idiag)>0) call acc_update_self(a%idiag)
else if (a%is_host()) then
call acc_update_device(a%val)
call acc_update_device(a%ja)
call acc_update_device(a%irn)
call acc_update_device(a%idiag)
if (psb_size(a%val)>0) call acc_update_device(a%val)
if (psb_size(a%ja)>0) call acc_update_device(a%ja)
if (psb_size(a%irn)>0) call acc_update_device(a%irn)
if (psb_size(a%idiag)>0) call acc_update_device(a%idiag)
end if
call tmpa%set_sync()
end subroutine c_oacc_ell_sync

@ -138,12 +138,16 @@ contains
class(psb_c_oacc_hll_sparse_mat), intent(inout) :: a
integer(psb_ipk_) :: info
if (allocated(a%val)) call acc_delete_finalize(a%val)
if (allocated(a%ja)) call acc_delete_finalize(a%ja)
if (allocated(a%irn)) call acc_delete_finalize(a%irn)
if (allocated(a%idiag)) call acc_delete_finalize(a%idiag)
if (allocated(a%hkoffs)) call acc_delete_finalize(a%hkoffs)
!
! Note: at least on GNU, if an array is allocated
! but with size 0, then CREATE,UPDATE and DELETE
! will fail
!
if (psb_size(a%val)>0) call acc_delete_finalize(a%val)
if (psb_size(a%ja)>0) call acc_delete_finalize(a%ja)
if (psb_size(a%irn)>0) call acc_delete_finalize(a%irn)
if (psb_size(a%idiag)>0) call acc_delete_finalize(a%idiag)
if (psb_size(a%hkoffs)>0) call acc_delete_finalize(a%hkoffs)
return
end subroutine c_oacc_hll_free_dev_space
@ -231,11 +235,16 @@ contains
implicit none
class(psb_c_oacc_hll_sparse_mat), intent(inout) :: a
if (allocated(a%val)) call acc_create(a%val)
if (allocated(a%ja)) call acc_create(a%ja)
if (allocated(a%irn)) call acc_create(a%irn)
if (allocated(a%idiag)) call acc_create(a%idiag)
if (allocated(a%hkoffs)) call acc_create(a%hkoffs)
!
! Note: at least on GNU, if an array is allocated
! but with size 0, then CREATE,UPDATE and DELETE
! will fail
!
if (psb_size(a%val)>0) call acc_create(a%val)
if (psb_size(a%ja)>0) call acc_create(a%ja)
if (psb_size(a%irn)>0) call acc_create(a%irn)
if (psb_size(a%idiag)>0) call acc_create(a%idiag)
if (psb_size(a%hkoffs)>0) call acc_create(a%hkoffs)
end subroutine c_oacc_hll_sync_dev_space
@ -246,18 +255,23 @@ contains
integer(psb_ipk_) :: info
tmpa => a
!
! Note: at least on GNU, if an array is allocated
! but with size 0, then CREATE,UPDATE and DELETE
! will fail
!
if (a%is_dev()) then
call acc_update_self(a%val)
call acc_update_self(a%ja)
call acc_update_self(a%irn)
call acc_update_self(a%idiag)
call acc_update_self(a%hkoffs)
if (psb_size(a%val)>0) call acc_update_self(a%val)
if (psb_size(a%ja)>0) call acc_update_self(a%ja)
if (psb_size(a%irn)>0) call acc_update_self(a%irn)
if (psb_size(a%idiag)>0) call acc_update_self(a%idiag)
if (psb_size(a%hkoffs)>0) call acc_update_self(a%hkoffs)
else if (a%is_host()) then
call acc_update_device(a%val)
call acc_update_device(a%ja)
call acc_update_device(a%irn)
call acc_update_device(a%idiag)
call acc_update_device(a%hkoffs)
if (psb_size(a%val)>0) call acc_update_device(a%val)
if (psb_size(a%ja)>0) call acc_update_device(a%ja)
if (psb_size(a%irn)>0) call acc_update_device(a%irn)
if (psb_size(a%idiag)>0) call acc_update_device(a%idiag)
if (psb_size(a%hkoffs)>0) call acc_update_device(a%hkoffs)
end if
call tmpa%set_sync()
end subroutine c_oacc_hll_sync

@ -139,9 +139,14 @@ contains
class(psb_d_oacc_csr_sparse_mat), intent(inout) :: a
integer(psb_ipk_) :: info
if (allocated(a%val)) call acc_delete_finalize(a%val)
if (allocated(a%ja)) call acc_delete_finalize(a%ja)
if (allocated(a%irp)) call acc_delete_finalize(a%irp)
!
! Note: at least on GNU, if an array is allocated
! but with size 0, then CREATE,UPDATE and DELETE
! will fail
!
if (psb_size(a%val)>0) call acc_delete_finalize(a%val)
if (psb_size(a%ja)>0) call acc_delete_finalize(a%ja)
if (psb_size(a%irp)>0) call acc_delete_finalize(a%irp)
return
end subroutine d_oacc_csr_free_dev_space
@ -246,9 +251,15 @@ contains
subroutine d_oacc_csr_sync_dev_space(a)
implicit none
class(psb_d_oacc_csr_sparse_mat), intent(inout) :: a
if (allocated(a%val)) call acc_create(a%val)
if (allocated(a%ja)) call acc_create(a%ja)
if (allocated(a%irp)) call acc_create(a%irp)
!
! Note: at least on GNU, if an array is allocated
! but with size 0, then CREATE,UPDATE and DELETE
! will fail
!
if (psb_size(a%val)>0) call acc_create(a%val)
if (psb_size(a%ja)>0) call acc_create(a%ja)
if (psb_size(a%irp)>0) call acc_create(a%irp)
end subroutine d_oacc_csr_sync_dev_space
subroutine d_oacc_csr_sync(a)
@ -258,14 +269,19 @@ contains
integer(psb_ipk_) :: info
tmpa => a
!
! Note: at least on GNU, if an array is allocated
! but with size 0, then CREATE,UPDATE and DELETE
! will fail
!
if (a%is_dev()) then
call acc_update_self(a%val)
call acc_update_self(a%ja)
call acc_update_self(a%irp)
if (psb_size(a%val)>0) call acc_update_self(a%val)
if (psb_size(a%ja)>0) call acc_update_self(a%ja)
if (psb_size(a%irp)>0) call acc_update_self(a%irp)
else if (a%is_host()) then
call acc_update_device(a%val)
call acc_update_device(a%ja)
call acc_update_device(a%irp)
if (psb_size(a%val)>0) call acc_update_device(a%val)
if (psb_size(a%ja)>0) call acc_update_device(a%ja)
if (psb_size(a%irp)>0) call acc_update_device(a%irp)
end if
call tmpa%set_sync()
end subroutine d_oacc_csr_sync

@ -138,11 +138,15 @@ contains
class(psb_d_oacc_ell_sparse_mat), intent(inout) :: a
integer(psb_ipk_) :: info
if (allocated(a%val)) call acc_delete_finalize(a%val)
if (allocated(a%ja)) call acc_delete_finalize(a%ja)
if (allocated(a%irn)) call acc_delete_finalize(a%irn)
if (allocated(a%idiag)) call acc_delete_finalize(a%idiag)
!
! Note: at least on GNU, if an array is allocated
! but with size 0, then CREATE,UPDATE and DELETE
! will fail
!
if (psb_size(a%val)>0) call acc_delete_finalize(a%val)
if (psb_size(a%ja)>0) call acc_delete_finalize(a%ja)
if (psb_size(a%irn)>0) call acc_delete_finalize(a%irn)
if (psb_size(a%idiag)>0) call acc_delete_finalize(a%idiag)
return
end subroutine d_oacc_ell_free_dev_space
@ -177,10 +181,15 @@ contains
implicit none
class(psb_d_oacc_ell_sparse_mat), intent(inout) :: a
if (allocated(a%val)) call acc_create(a%val)
if (allocated(a%ja)) call acc_create(a%ja)
if (allocated(a%irn)) call acc_create(a%irn)
if (allocated(a%idiag)) call acc_create(a%idiag)
!
! Note: at least on GNU, if an array is allocated
! but with size 0, then CREATE,UPDATE and DELETE
! will fail
!
if (psb_size(a%val)>0) call acc_create(a%val)
if (psb_size(a%ja)>0) call acc_create(a%ja)
if (psb_size(a%irn)>0) call acc_create(a%irn)
if (psb_size(a%idiag)>0) call acc_create(a%idiag)
end subroutine d_oacc_ell_sync_dev_space
function d_oacc_ell_is_host(a) result(res)
@ -241,16 +250,21 @@ contains
integer(psb_ipk_) :: info
tmpa => a
!
! Note: at least on GNU, if an array is allocated
! but with size 0, then CREATE,UPDATE and DELETE
! will fail
!
if (a%is_dev()) then
call acc_update_self(a%val)
call acc_update_self(a%ja)
call acc_update_self(a%irn)
call acc_update_self(a%idiag)
if (psb_size(a%val)>0) call acc_update_self(a%val)
if (psb_size(a%ja)>0) call acc_update_self(a%ja)
if (psb_size(a%irn)>0) call acc_update_self(a%irn)
if (psb_size(a%idiag)>0) call acc_update_self(a%idiag)
else if (a%is_host()) then
call acc_update_device(a%val)
call acc_update_device(a%ja)
call acc_update_device(a%irn)
call acc_update_device(a%idiag)
if (psb_size(a%val)>0) call acc_update_device(a%val)
if (psb_size(a%ja)>0) call acc_update_device(a%ja)
if (psb_size(a%irn)>0) call acc_update_device(a%irn)
if (psb_size(a%idiag)>0) call acc_update_device(a%idiag)
end if
call tmpa%set_sync()
end subroutine d_oacc_ell_sync

@ -138,12 +138,16 @@ contains
class(psb_d_oacc_hll_sparse_mat), intent(inout) :: a
integer(psb_ipk_) :: info
if (allocated(a%val)) call acc_delete_finalize(a%val)
if (allocated(a%ja)) call acc_delete_finalize(a%ja)
if (allocated(a%irn)) call acc_delete_finalize(a%irn)
if (allocated(a%idiag)) call acc_delete_finalize(a%idiag)
if (allocated(a%hkoffs)) call acc_delete_finalize(a%hkoffs)
!
! Note: at least on GNU, if an array is allocated
! but with size 0, then CREATE,UPDATE and DELETE
! will fail
!
if (psb_size(a%val)>0) call acc_delete_finalize(a%val)
if (psb_size(a%ja)>0) call acc_delete_finalize(a%ja)
if (psb_size(a%irn)>0) call acc_delete_finalize(a%irn)
if (psb_size(a%idiag)>0) call acc_delete_finalize(a%idiag)
if (psb_size(a%hkoffs)>0) call acc_delete_finalize(a%hkoffs)
return
end subroutine d_oacc_hll_free_dev_space
@ -231,11 +235,16 @@ contains
implicit none
class(psb_d_oacc_hll_sparse_mat), intent(inout) :: a
if (allocated(a%val)) call acc_create(a%val)
if (allocated(a%ja)) call acc_create(a%ja)
if (allocated(a%irn)) call acc_create(a%irn)
if (allocated(a%idiag)) call acc_create(a%idiag)
if (allocated(a%hkoffs)) call acc_create(a%hkoffs)
!
! Note: at least on GNU, if an array is allocated
! but with size 0, then CREATE,UPDATE and DELETE
! will fail
!
if (psb_size(a%val)>0) call acc_create(a%val)
if (psb_size(a%ja)>0) call acc_create(a%ja)
if (psb_size(a%irn)>0) call acc_create(a%irn)
if (psb_size(a%idiag)>0) call acc_create(a%idiag)
if (psb_size(a%hkoffs)>0) call acc_create(a%hkoffs)
end subroutine d_oacc_hll_sync_dev_space
@ -246,18 +255,23 @@ contains
integer(psb_ipk_) :: info
tmpa => a
!
! Note: at least on GNU, if an array is allocated
! but with size 0, then CREATE,UPDATE and DELETE
! will fail
!
if (a%is_dev()) then
call acc_update_self(a%val)
call acc_update_self(a%ja)
call acc_update_self(a%irn)
call acc_update_self(a%idiag)
call acc_update_self(a%hkoffs)
if (psb_size(a%val)>0) call acc_update_self(a%val)
if (psb_size(a%ja)>0) call acc_update_self(a%ja)
if (psb_size(a%irn)>0) call acc_update_self(a%irn)
if (psb_size(a%idiag)>0) call acc_update_self(a%idiag)
if (psb_size(a%hkoffs)>0) call acc_update_self(a%hkoffs)
else if (a%is_host()) then
call acc_update_device(a%val)
call acc_update_device(a%ja)
call acc_update_device(a%irn)
call acc_update_device(a%idiag)
call acc_update_device(a%hkoffs)
if (psb_size(a%val)>0) call acc_update_device(a%val)
if (psb_size(a%ja)>0) call acc_update_device(a%ja)
if (psb_size(a%irn)>0) call acc_update_device(a%irn)
if (psb_size(a%idiag)>0) call acc_update_device(a%idiag)
if (psb_size(a%hkoffs)>0) call acc_update_device(a%hkoffs)
end if
call tmpa%set_sync()
end subroutine d_oacc_hll_sync

@ -139,9 +139,14 @@ contains
class(psb_s_oacc_csr_sparse_mat), intent(inout) :: a
integer(psb_ipk_) :: info
if (allocated(a%val)) call acc_delete_finalize(a%val)
if (allocated(a%ja)) call acc_delete_finalize(a%ja)
if (allocated(a%irp)) call acc_delete_finalize(a%irp)
!
! Note: at least on GNU, if an array is allocated
! but with size 0, then CREATE,UPDATE and DELETE
! will fail
!
if (psb_size(a%val)>0) call acc_delete_finalize(a%val)
if (psb_size(a%ja)>0) call acc_delete_finalize(a%ja)
if (psb_size(a%irp)>0) call acc_delete_finalize(a%irp)
return
end subroutine s_oacc_csr_free_dev_space
@ -246,9 +251,15 @@ contains
subroutine s_oacc_csr_sync_dev_space(a)
implicit none
class(psb_s_oacc_csr_sparse_mat), intent(inout) :: a
if (allocated(a%val)) call acc_create(a%val)
if (allocated(a%ja)) call acc_create(a%ja)
if (allocated(a%irp)) call acc_create(a%irp)
!
! Note: at least on GNU, if an array is allocated
! but with size 0, then CREATE,UPDATE and DELETE
! will fail
!
if (psb_size(a%val)>0) call acc_create(a%val)
if (psb_size(a%ja)>0) call acc_create(a%ja)
if (psb_size(a%irp)>0) call acc_create(a%irp)
end subroutine s_oacc_csr_sync_dev_space
subroutine s_oacc_csr_sync(a)
@ -258,14 +269,19 @@ contains
integer(psb_ipk_) :: info
tmpa => a
!
! Note: at least on GNU, if an array is allocated
! but with size 0, then CREATE,UPDATE and DELETE
! will fail
!
if (a%is_dev()) then
call acc_update_self(a%val)
call acc_update_self(a%ja)
call acc_update_self(a%irp)
if (psb_size(a%val)>0) call acc_update_self(a%val)
if (psb_size(a%ja)>0) call acc_update_self(a%ja)
if (psb_size(a%irp)>0) call acc_update_self(a%irp)
else if (a%is_host()) then
call acc_update_device(a%val)
call acc_update_device(a%ja)
call acc_update_device(a%irp)
if (psb_size(a%val)>0) call acc_update_device(a%val)
if (psb_size(a%ja)>0) call acc_update_device(a%ja)
if (psb_size(a%irp)>0) call acc_update_device(a%irp)
end if
call tmpa%set_sync()
end subroutine s_oacc_csr_sync

@ -138,11 +138,15 @@ contains
class(psb_s_oacc_ell_sparse_mat), intent(inout) :: a
integer(psb_ipk_) :: info
if (allocated(a%val)) call acc_delete_finalize(a%val)
if (allocated(a%ja)) call acc_delete_finalize(a%ja)
if (allocated(a%irn)) call acc_delete_finalize(a%irn)
if (allocated(a%idiag)) call acc_delete_finalize(a%idiag)
!
! Note: at least on GNU, if an array is allocated
! but with size 0, then CREATE,UPDATE and DELETE
! will fail
!
if (psb_size(a%val)>0) call acc_delete_finalize(a%val)
if (psb_size(a%ja)>0) call acc_delete_finalize(a%ja)
if (psb_size(a%irn)>0) call acc_delete_finalize(a%irn)
if (psb_size(a%idiag)>0) call acc_delete_finalize(a%idiag)
return
end subroutine s_oacc_ell_free_dev_space
@ -177,10 +181,15 @@ contains
implicit none
class(psb_s_oacc_ell_sparse_mat), intent(inout) :: a
if (allocated(a%val)) call acc_create(a%val)
if (allocated(a%ja)) call acc_create(a%ja)
if (allocated(a%irn)) call acc_create(a%irn)
if (allocated(a%idiag)) call acc_create(a%idiag)
!
! Note: at least on GNU, if an array is allocated
! but with size 0, then CREATE,UPDATE and DELETE
! will fail
!
if (psb_size(a%val)>0) call acc_create(a%val)
if (psb_size(a%ja)>0) call acc_create(a%ja)
if (psb_size(a%irn)>0) call acc_create(a%irn)
if (psb_size(a%idiag)>0) call acc_create(a%idiag)
end subroutine s_oacc_ell_sync_dev_space
function s_oacc_ell_is_host(a) result(res)
@ -241,16 +250,21 @@ contains
integer(psb_ipk_) :: info
tmpa => a
!
! Note: at least on GNU, if an array is allocated
! but with size 0, then CREATE,UPDATE and DELETE
! will fail
!
if (a%is_dev()) then
call acc_update_self(a%val)
call acc_update_self(a%ja)
call acc_update_self(a%irn)
call acc_update_self(a%idiag)
if (psb_size(a%val)>0) call acc_update_self(a%val)
if (psb_size(a%ja)>0) call acc_update_self(a%ja)
if (psb_size(a%irn)>0) call acc_update_self(a%irn)
if (psb_size(a%idiag)>0) call acc_update_self(a%idiag)
else if (a%is_host()) then
call acc_update_device(a%val)
call acc_update_device(a%ja)
call acc_update_device(a%irn)
call acc_update_device(a%idiag)
if (psb_size(a%val)>0) call acc_update_device(a%val)
if (psb_size(a%ja)>0) call acc_update_device(a%ja)
if (psb_size(a%irn)>0) call acc_update_device(a%irn)
if (psb_size(a%idiag)>0) call acc_update_device(a%idiag)
end if
call tmpa%set_sync()
end subroutine s_oacc_ell_sync

@ -138,12 +138,16 @@ contains
class(psb_s_oacc_hll_sparse_mat), intent(inout) :: a
integer(psb_ipk_) :: info
if (allocated(a%val)) call acc_delete_finalize(a%val)
if (allocated(a%ja)) call acc_delete_finalize(a%ja)
if (allocated(a%irn)) call acc_delete_finalize(a%irn)
if (allocated(a%idiag)) call acc_delete_finalize(a%idiag)
if (allocated(a%hkoffs)) call acc_delete_finalize(a%hkoffs)
!
! Note: at least on GNU, if an array is allocated
! but with size 0, then CREATE,UPDATE and DELETE
! will fail
!
if (psb_size(a%val)>0) call acc_delete_finalize(a%val)
if (psb_size(a%ja)>0) call acc_delete_finalize(a%ja)
if (psb_size(a%irn)>0) call acc_delete_finalize(a%irn)
if (psb_size(a%idiag)>0) call acc_delete_finalize(a%idiag)
if (psb_size(a%hkoffs)>0) call acc_delete_finalize(a%hkoffs)
return
end subroutine s_oacc_hll_free_dev_space
@ -231,11 +235,16 @@ contains
implicit none
class(psb_s_oacc_hll_sparse_mat), intent(inout) :: a
if (allocated(a%val)) call acc_create(a%val)
if (allocated(a%ja)) call acc_create(a%ja)
if (allocated(a%irn)) call acc_create(a%irn)
if (allocated(a%idiag)) call acc_create(a%idiag)
if (allocated(a%hkoffs)) call acc_create(a%hkoffs)
!
! Note: at least on GNU, if an array is allocated
! but with size 0, then CREATE,UPDATE and DELETE
! will fail
!
if (psb_size(a%val)>0) call acc_create(a%val)
if (psb_size(a%ja)>0) call acc_create(a%ja)
if (psb_size(a%irn)>0) call acc_create(a%irn)
if (psb_size(a%idiag)>0) call acc_create(a%idiag)
if (psb_size(a%hkoffs)>0) call acc_create(a%hkoffs)
end subroutine s_oacc_hll_sync_dev_space
@ -246,18 +255,23 @@ contains
integer(psb_ipk_) :: info
tmpa => a
!
! Note: at least on GNU, if an array is allocated
! but with size 0, then CREATE,UPDATE and DELETE
! will fail
!
if (a%is_dev()) then
call acc_update_self(a%val)
call acc_update_self(a%ja)
call acc_update_self(a%irn)
call acc_update_self(a%idiag)
call acc_update_self(a%hkoffs)
if (psb_size(a%val)>0) call acc_update_self(a%val)
if (psb_size(a%ja)>0) call acc_update_self(a%ja)
if (psb_size(a%irn)>0) call acc_update_self(a%irn)
if (psb_size(a%idiag)>0) call acc_update_self(a%idiag)
if (psb_size(a%hkoffs)>0) call acc_update_self(a%hkoffs)
else if (a%is_host()) then
call acc_update_device(a%val)
call acc_update_device(a%ja)
call acc_update_device(a%irn)
call acc_update_device(a%idiag)
call acc_update_device(a%hkoffs)
if (psb_size(a%val)>0) call acc_update_device(a%val)
if (psb_size(a%ja)>0) call acc_update_device(a%ja)
if (psb_size(a%irn)>0) call acc_update_device(a%irn)
if (psb_size(a%idiag)>0) call acc_update_device(a%idiag)
if (psb_size(a%hkoffs)>0) call acc_update_device(a%hkoffs)
end if
call tmpa%set_sync()
end subroutine s_oacc_hll_sync

@ -139,9 +139,14 @@ contains
class(psb_z_oacc_csr_sparse_mat), intent(inout) :: a
integer(psb_ipk_) :: info
if (allocated(a%val)) call acc_delete_finalize(a%val)
if (allocated(a%ja)) call acc_delete_finalize(a%ja)
if (allocated(a%irp)) call acc_delete_finalize(a%irp)
!
! Note: at least on GNU, if an array is allocated
! but with size 0, then CREATE,UPDATE and DELETE
! will fail
!
if (psb_size(a%val)>0) call acc_delete_finalize(a%val)
if (psb_size(a%ja)>0) call acc_delete_finalize(a%ja)
if (psb_size(a%irp)>0) call acc_delete_finalize(a%irp)
return
end subroutine z_oacc_csr_free_dev_space
@ -246,9 +251,15 @@ contains
subroutine z_oacc_csr_sync_dev_space(a)
implicit none
class(psb_z_oacc_csr_sparse_mat), intent(inout) :: a
if (allocated(a%val)) call acc_create(a%val)
if (allocated(a%ja)) call acc_create(a%ja)
if (allocated(a%irp)) call acc_create(a%irp)
!
! Note: at least on GNU, if an array is allocated
! but with size 0, then CREATE,UPDATE and DELETE
! will fail
!
if (psb_size(a%val)>0) call acc_create(a%val)
if (psb_size(a%ja)>0) call acc_create(a%ja)
if (psb_size(a%irp)>0) call acc_create(a%irp)
end subroutine z_oacc_csr_sync_dev_space
subroutine z_oacc_csr_sync(a)
@ -258,14 +269,19 @@ contains
integer(psb_ipk_) :: info
tmpa => a
!
! Note: at least on GNU, if an array is allocated
! but with size 0, then CREATE,UPDATE and DELETE
! will fail
!
if (a%is_dev()) then
call acc_update_self(a%val)
call acc_update_self(a%ja)
call acc_update_self(a%irp)
if (psb_size(a%val)>0) call acc_update_self(a%val)
if (psb_size(a%ja)>0) call acc_update_self(a%ja)
if (psb_size(a%irp)>0) call acc_update_self(a%irp)
else if (a%is_host()) then
call acc_update_device(a%val)
call acc_update_device(a%ja)
call acc_update_device(a%irp)
if (psb_size(a%val)>0) call acc_update_device(a%val)
if (psb_size(a%ja)>0) call acc_update_device(a%ja)
if (psb_size(a%irp)>0) call acc_update_device(a%irp)
end if
call tmpa%set_sync()
end subroutine z_oacc_csr_sync

@ -138,11 +138,15 @@ contains
class(psb_z_oacc_ell_sparse_mat), intent(inout) :: a
integer(psb_ipk_) :: info
if (allocated(a%val)) call acc_delete_finalize(a%val)
if (allocated(a%ja)) call acc_delete_finalize(a%ja)
if (allocated(a%irn)) call acc_delete_finalize(a%irn)
if (allocated(a%idiag)) call acc_delete_finalize(a%idiag)
!
! Note: at least on GNU, if an array is allocated
! but with size 0, then CREATE,UPDATE and DELETE
! will fail
!
if (psb_size(a%val)>0) call acc_delete_finalize(a%val)
if (psb_size(a%ja)>0) call acc_delete_finalize(a%ja)
if (psb_size(a%irn)>0) call acc_delete_finalize(a%irn)
if (psb_size(a%idiag)>0) call acc_delete_finalize(a%idiag)
return
end subroutine z_oacc_ell_free_dev_space
@ -177,10 +181,15 @@ contains
implicit none
class(psb_z_oacc_ell_sparse_mat), intent(inout) :: a
if (allocated(a%val)) call acc_create(a%val)
if (allocated(a%ja)) call acc_create(a%ja)
if (allocated(a%irn)) call acc_create(a%irn)
if (allocated(a%idiag)) call acc_create(a%idiag)
!
! Note: at least on GNU, if an array is allocated
! but with size 0, then CREATE,UPDATE and DELETE
! will fail
!
if (psb_size(a%val)>0) call acc_create(a%val)
if (psb_size(a%ja)>0) call acc_create(a%ja)
if (psb_size(a%irn)>0) call acc_create(a%irn)
if (psb_size(a%idiag)>0) call acc_create(a%idiag)
end subroutine z_oacc_ell_sync_dev_space
function z_oacc_ell_is_host(a) result(res)
@ -241,16 +250,21 @@ contains
integer(psb_ipk_) :: info
tmpa => a
!
! Note: at least on GNU, if an array is allocated
! but with size 0, then CREATE,UPDATE and DELETE
! will fail
!
if (a%is_dev()) then
call acc_update_self(a%val)
call acc_update_self(a%ja)
call acc_update_self(a%irn)
call acc_update_self(a%idiag)
if (psb_size(a%val)>0) call acc_update_self(a%val)
if (psb_size(a%ja)>0) call acc_update_self(a%ja)
if (psb_size(a%irn)>0) call acc_update_self(a%irn)
if (psb_size(a%idiag)>0) call acc_update_self(a%idiag)
else if (a%is_host()) then
call acc_update_device(a%val)
call acc_update_device(a%ja)
call acc_update_device(a%irn)
call acc_update_device(a%idiag)
if (psb_size(a%val)>0) call acc_update_device(a%val)
if (psb_size(a%ja)>0) call acc_update_device(a%ja)
if (psb_size(a%irn)>0) call acc_update_device(a%irn)
if (psb_size(a%idiag)>0) call acc_update_device(a%idiag)
end if
call tmpa%set_sync()
end subroutine z_oacc_ell_sync

@ -138,12 +138,16 @@ contains
class(psb_z_oacc_hll_sparse_mat), intent(inout) :: a
integer(psb_ipk_) :: info
if (allocated(a%val)) call acc_delete_finalize(a%val)
if (allocated(a%ja)) call acc_delete_finalize(a%ja)
if (allocated(a%irn)) call acc_delete_finalize(a%irn)
if (allocated(a%idiag)) call acc_delete_finalize(a%idiag)
if (allocated(a%hkoffs)) call acc_delete_finalize(a%hkoffs)
!
! Note: at least on GNU, if an array is allocated
! but with size 0, then CREATE,UPDATE and DELETE
! will fail
!
if (psb_size(a%val)>0) call acc_delete_finalize(a%val)
if (psb_size(a%ja)>0) call acc_delete_finalize(a%ja)
if (psb_size(a%irn)>0) call acc_delete_finalize(a%irn)
if (psb_size(a%idiag)>0) call acc_delete_finalize(a%idiag)
if (psb_size(a%hkoffs)>0) call acc_delete_finalize(a%hkoffs)
return
end subroutine z_oacc_hll_free_dev_space
@ -231,11 +235,16 @@ contains
implicit none
class(psb_z_oacc_hll_sparse_mat), intent(inout) :: a
if (allocated(a%val)) call acc_create(a%val)
if (allocated(a%ja)) call acc_create(a%ja)
if (allocated(a%irn)) call acc_create(a%irn)
if (allocated(a%idiag)) call acc_create(a%idiag)
if (allocated(a%hkoffs)) call acc_create(a%hkoffs)
!
! Note: at least on GNU, if an array is allocated
! but with size 0, then CREATE,UPDATE and DELETE
! will fail
!
if (psb_size(a%val)>0) call acc_create(a%val)
if (psb_size(a%ja)>0) call acc_create(a%ja)
if (psb_size(a%irn)>0) call acc_create(a%irn)
if (psb_size(a%idiag)>0) call acc_create(a%idiag)
if (psb_size(a%hkoffs)>0) call acc_create(a%hkoffs)
end subroutine z_oacc_hll_sync_dev_space
@ -246,18 +255,23 @@ contains
integer(psb_ipk_) :: info
tmpa => a
!
! Note: at least on GNU, if an array is allocated
! but with size 0, then CREATE,UPDATE and DELETE
! will fail
!
if (a%is_dev()) then
call acc_update_self(a%val)
call acc_update_self(a%ja)
call acc_update_self(a%irn)
call acc_update_self(a%idiag)
call acc_update_self(a%hkoffs)
if (psb_size(a%val)>0) call acc_update_self(a%val)
if (psb_size(a%ja)>0) call acc_update_self(a%ja)
if (psb_size(a%irn)>0) call acc_update_self(a%irn)
if (psb_size(a%idiag)>0) call acc_update_self(a%idiag)
if (psb_size(a%hkoffs)>0) call acc_update_self(a%hkoffs)
else if (a%is_host()) then
call acc_update_device(a%val)
call acc_update_device(a%ja)
call acc_update_device(a%irn)
call acc_update_device(a%idiag)
call acc_update_device(a%hkoffs)
if (psb_size(a%val)>0) call acc_update_device(a%val)
if (psb_size(a%ja)>0) call acc_update_device(a%ja)
if (psb_size(a%irn)>0) call acc_update_device(a%irn)
if (psb_size(a%idiag)>0) call acc_update_device(a%idiag)
if (psb_size(a%hkoffs)>0) call acc_update_device(a%hkoffs)
end if
call tmpa%set_sync()
end subroutine z_oacc_hll_sync

Loading…
Cancel
Save