From 096bce08c138df418648aef5fd5abeef1364c455 Mon Sep 17 00:00:00 2001 From: sfilippone Date: Wed, 11 Sep 2024 12:43:46 +0200 Subject: [PATCH] Merged changes from V4 OpenACC --- openacc/psb_c_oacc_csr_mat_mod.F90 | 40 ++++++++++++++------- openacc/psb_c_oacc_ell_mat_mod.F90 | 48 ++++++++++++++++--------- openacc/psb_c_oacc_hll_mat_mod.F90 | 56 +++++++++++++++++++----------- openacc/psb_d_oacc_csr_mat_mod.F90 | 40 ++++++++++++++------- openacc/psb_d_oacc_ell_mat_mod.F90 | 48 ++++++++++++++++--------- openacc/psb_d_oacc_hll_mat_mod.F90 | 56 +++++++++++++++++++----------- openacc/psb_s_oacc_csr_mat_mod.F90 | 40 ++++++++++++++------- openacc/psb_s_oacc_ell_mat_mod.F90 | 48 ++++++++++++++++--------- openacc/psb_s_oacc_hll_mat_mod.F90 | 56 +++++++++++++++++++----------- openacc/psb_z_oacc_csr_mat_mod.F90 | 40 ++++++++++++++------- openacc/psb_z_oacc_ell_mat_mod.F90 | 48 ++++++++++++++++--------- openacc/psb_z_oacc_hll_mat_mod.F90 | 56 +++++++++++++++++++----------- 12 files changed, 376 insertions(+), 200 deletions(-) diff --git a/openacc/psb_c_oacc_csr_mat_mod.F90 b/openacc/psb_c_oacc_csr_mat_mod.F90 index 59794335..94edc5e9 100644 --- a/openacc/psb_c_oacc_csr_mat_mod.F90 +++ b/openacc/psb_c_oacc_csr_mat_mod.F90 @@ -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 diff --git a/openacc/psb_c_oacc_ell_mat_mod.F90 b/openacc/psb_c_oacc_ell_mat_mod.F90 index f0559d26..f0b9779b 100644 --- a/openacc/psb_c_oacc_ell_mat_mod.F90 +++ b/openacc/psb_c_oacc_ell_mat_mod.F90 @@ -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 diff --git a/openacc/psb_c_oacc_hll_mat_mod.F90 b/openacc/psb_c_oacc_hll_mat_mod.F90 index 93436224..98c6a2ee 100644 --- a/openacc/psb_c_oacc_hll_mat_mod.F90 +++ b/openacc/psb_c_oacc_hll_mat_mod.F90 @@ -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 diff --git a/openacc/psb_d_oacc_csr_mat_mod.F90 b/openacc/psb_d_oacc_csr_mat_mod.F90 index 08b75575..a3119b64 100644 --- a/openacc/psb_d_oacc_csr_mat_mod.F90 +++ b/openacc/psb_d_oacc_csr_mat_mod.F90 @@ -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 diff --git a/openacc/psb_d_oacc_ell_mat_mod.F90 b/openacc/psb_d_oacc_ell_mat_mod.F90 index 3e25f576..3932e286 100644 --- a/openacc/psb_d_oacc_ell_mat_mod.F90 +++ b/openacc/psb_d_oacc_ell_mat_mod.F90 @@ -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 diff --git a/openacc/psb_d_oacc_hll_mat_mod.F90 b/openacc/psb_d_oacc_hll_mat_mod.F90 index 084987e5..fd0fe54f 100644 --- a/openacc/psb_d_oacc_hll_mat_mod.F90 +++ b/openacc/psb_d_oacc_hll_mat_mod.F90 @@ -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 diff --git a/openacc/psb_s_oacc_csr_mat_mod.F90 b/openacc/psb_s_oacc_csr_mat_mod.F90 index 16668d25..5eaf80f7 100644 --- a/openacc/psb_s_oacc_csr_mat_mod.F90 +++ b/openacc/psb_s_oacc_csr_mat_mod.F90 @@ -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 diff --git a/openacc/psb_s_oacc_ell_mat_mod.F90 b/openacc/psb_s_oacc_ell_mat_mod.F90 index dcfc1850..56775879 100644 --- a/openacc/psb_s_oacc_ell_mat_mod.F90 +++ b/openacc/psb_s_oacc_ell_mat_mod.F90 @@ -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 diff --git a/openacc/psb_s_oacc_hll_mat_mod.F90 b/openacc/psb_s_oacc_hll_mat_mod.F90 index 0e7362f2..997433a1 100644 --- a/openacc/psb_s_oacc_hll_mat_mod.F90 +++ b/openacc/psb_s_oacc_hll_mat_mod.F90 @@ -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 diff --git a/openacc/psb_z_oacc_csr_mat_mod.F90 b/openacc/psb_z_oacc_csr_mat_mod.F90 index fdb59b4b..ed92373d 100644 --- a/openacc/psb_z_oacc_csr_mat_mod.F90 +++ b/openacc/psb_z_oacc_csr_mat_mod.F90 @@ -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 diff --git a/openacc/psb_z_oacc_ell_mat_mod.F90 b/openacc/psb_z_oacc_ell_mat_mod.F90 index 9d09d43d..d494922f 100644 --- a/openacc/psb_z_oacc_ell_mat_mod.F90 +++ b/openacc/psb_z_oacc_ell_mat_mod.F90 @@ -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 diff --git a/openacc/psb_z_oacc_hll_mat_mod.F90 b/openacc/psb_z_oacc_hll_mat_mod.F90 index 9eb7d08c..07739348 100644 --- a/openacc/psb_z_oacc_hll_mat_mod.F90 +++ b/openacc/psb_z_oacc_hll_mat_mod.F90 @@ -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