mirror of
https://github.com/sfilippone/psblas3.git
synced 2026-10-18 11:52:11 +00:00
Merged changes from V4 OpenACC
This commit is contained in:
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user