1152b3e56SJunchao Zhang #if !defined(PETSCVEC_KOKKOS_HPP) 2152b3e56SJunchao Zhang #define PETSCVEC_KOKKOS_HPP 3152b3e56SJunchao Zhang 411d22bbfSJunchao Zhang #include <petscconf.h> 511d22bbfSJunchao Zhang 6*ac09b921SBarry Smith /* SUBMANSEC = Vec */ 7*ac09b921SBarry Smith 811d22bbfSJunchao Zhang #if defined(PETSC_HAVE_KOKKOS) 911d22bbfSJunchao Zhang #if defined(petsccomplexlib) 1011d22bbfSJunchao Zhang #error "Error: You must include petscvec_kokkos.hpp before other petsc headers in this C++ file to use petsc complex with Kokkos" 1111d22bbfSJunchao Zhang #endif 1211d22bbfSJunchao Zhang 1311d22bbfSJunchao Zhang #define PETSC_DESIRE_KOKKOS_COMPLEX 1 /* To control the definition of petsccomplexlib in petscsystypes.h */ 1411d22bbfSJunchao Zhang #endif 1511d22bbfSJunchao Zhang 16152b3e56SJunchao Zhang #include <petscvec.h> 17152b3e56SJunchao Zhang 18152b3e56SJunchao Zhang #if defined(PETSC_HAVE_KOKKOS) 19152b3e56SJunchao Zhang #include <Kokkos_Core.hpp> 20152b3e56SJunchao Zhang 2121bad809SJunchao Zhang /*@C 2221bad809SJunchao Zhang VecGetKokkosView - Returns a constant Kokkos View that contains up-to-date data of a vector in the specified memory space. 23152b3e56SJunchao Zhang 2421bad809SJunchao Zhang Synopsis: 2521bad809SJunchao Zhang #include <petscvec_kokkos.hpp> 2621bad809SJunchao Zhang PetscErrorCode VecGetKokkosView (Vec v,Kokkos::View<const PetscScalar*,MemorySpace>* kv); 2721bad809SJunchao Zhang PetscErrorCode VecGetKokkosView (Vec v,Kokkos::View<PetscScalar*,MemorySpace>* kv); 2821bad809SJunchao Zhang 2921bad809SJunchao Zhang Logically Collective on Vec 3021bad809SJunchao Zhang 3121bad809SJunchao Zhang Input Parameter: 3221bad809SJunchao Zhang . v - the vector in type of VECKOKKOS 3321bad809SJunchao Zhang 3421bad809SJunchao Zhang Output Parameter: 3521bad809SJunchao Zhang . kv - the Kokkos View with a user-specified template parameter MemorySpace 3621bad809SJunchao Zhang 3721bad809SJunchao Zhang Notes: 3821bad809SJunchao Zhang If the vector is not of type VECKOKKOS, an error will be raised. 3921bad809SJunchao Zhang The functions are similar to VecGetArrayRead() and VecGetArray() respectively. One can read-only or read/write the returned Kokkos View. 4021bad809SJunchao Zhang Note that passing in a const View enables read-only access. 4121bad809SJunchao Zhang One must return the View by a matching VecRestoreKokkosView() after finishing using the View. Currently, only two memory 4221bad809SJunchao Zhang spaces are supported: Kokkos::HostSpace and Kokkos::DefaultExecutionSpace::memory_space. 4321bad809SJunchao Zhang If needed, a memory copy will be internally called to copy the latest vector data to the specified memory space. 4421bad809SJunchao Zhang 4521bad809SJunchao Zhang Level: beginner 4621bad809SJunchao Zhang 47db781477SPatrick Sanan .seealso: `VecRestoreKokkosView()`, `VecRestoreArray()`, `VecGetKokkosViewWrite()`, `VecGetArrayRead()`, `VecGetArrays()`, `VecGetArrayF90()`, `VecGetArrayReadF90()`, `VecPlaceArray()`, `VecGetArray2d()`, 48db781477SPatrick Sanan `VecGetArrayPair()`, `VecRestoreArrayPair()`, `VecGetArrayWrite()`, `VecRestoreArrayWrite()` 4921bad809SJunchao Zhang @*/ 50152b3e56SJunchao Zhang template<class MemorySpace> PetscErrorCode VecGetKokkosView (Vec,Kokkos::View<const PetscScalar*,MemorySpace>*); 51152b3e56SJunchao Zhang template<class MemorySpace> PetscErrorCode VecGetKokkosView (Vec,Kokkos::View<PetscScalar*,MemorySpace>*); 5221bad809SJunchao Zhang 5321bad809SJunchao Zhang /*@C 5421bad809SJunchao Zhang VecRestoreKokkosView - Returns a Kokkos View gotten by VecGetKokkosView(). 5521bad809SJunchao Zhang 5621bad809SJunchao Zhang Synopsis: 5721bad809SJunchao Zhang #include <petscvec_kokkos.hpp> 5821bad809SJunchao Zhang PetscErrorCode VecRestoreKokkosView (Vec v,Kokkos::View<const PetscScalar*,MemorySpace>* kv); 5921bad809SJunchao Zhang PetscErrorCode VecRestoreKokkosView (Vec v,Kokkos::View<PetscScalar*,MemorySpace>* kv); 6021bad809SJunchao Zhang 6121bad809SJunchao Zhang Logically Collective on Vec 6221bad809SJunchao Zhang 63f1a722f8SMatthew G. Knepley Input Parameters: 6421bad809SJunchao Zhang + v - the vector in type of VECKOKKOS 6521bad809SJunchao Zhang - kv - the Kokkos View with a user-specified template parameter MemorySpace 6621bad809SJunchao Zhang 6721bad809SJunchao Zhang Notes: 6821bad809SJunchao Zhang If the vector is not of type VECKOKKOS, an error will be raised. 6921bad809SJunchao Zhang The functions are similar to VecRestoreArrayRead() and VecRestoreArray() respectively. They are the counterpart of VecGetKokkosView(). 7021bad809SJunchao Zhang 7121bad809SJunchao Zhang Level: beginner 7221bad809SJunchao Zhang 73db781477SPatrick Sanan .seealso: `VecGetKokkosView()`, `VecRestoreKokkosViewWrite()`, `VecRestoreArray()`, `VecGetArrayRead()`, `VecGetArrays()`, `VecGetArrayF90()`, `VecGetArrayReadF90()`, `VecPlaceArray()`, `VecGetArray2d()`, 74db781477SPatrick Sanan `VecGetArrayPair()`, `VecRestoreArrayPair()`, `VecGetArrayWrite()`, `VecRestoreArrayWrite()` 7521bad809SJunchao Zhang @*/ 7621bad809SJunchao Zhang template<class MemorySpace> PetscErrorCode VecRestoreKokkosView(Vec,Kokkos::View<const PetscScalar*,MemorySpace>*){return 0;} 77152b3e56SJunchao Zhang template<class MemorySpace> PetscErrorCode VecRestoreKokkosView(Vec,Kokkos::View<PetscScalar*,MemorySpace>*); 78152b3e56SJunchao Zhang 7921bad809SJunchao Zhang 8021bad809SJunchao Zhang /*@C 8121bad809SJunchao Zhang VecGetKokkosViewWrite - Returns a Kokkos View that contains the array of a vector in the specified memory space. 8221bad809SJunchao Zhang 8321bad809SJunchao Zhang Synopsis: 8421bad809SJunchao Zhang #include <petscvec_kokkos.hpp> 8521bad809SJunchao Zhang PetscErrorCode VecGetKokkosViewWrite (Vec v,Kokkos::View<PetscScalar*,MemorySpace>* kv); 8621bad809SJunchao Zhang 8721bad809SJunchao Zhang Logically Collective on Vec 8821bad809SJunchao Zhang 8921bad809SJunchao Zhang Input Parameter: 9021bad809SJunchao Zhang . v - the vector in type of VECKOKKOS 9121bad809SJunchao Zhang 9221bad809SJunchao Zhang Output Parameter: 9321bad809SJunchao Zhang . kv - the Kokkos View with a user-specified template parameter MemorySpace 9421bad809SJunchao Zhang 9521bad809SJunchao Zhang Notes: 9621bad809SJunchao Zhang If the vector is not of type VECKOKKOS, an error will be raised. 9721bad809SJunchao Zhang The functions is similar to VecGetArrayWrite(). The returned view might contain garbage data or stale data and one is not 9821bad809SJunchao Zhang expected to read data from the View. Instead, one is expected to overwrite all data in the View. 9921bad809SJunchao Zhang One must return the View by a matching VecRestoreKokkosViewWrite() after finishing using the View. 10021bad809SJunchao Zhang Currently, only two memory spaces are supported: Kokkos::HostSpace and Kokkos::DefaultExecutionSpace::memory_space. 10121bad809SJunchao Zhang 10221bad809SJunchao Zhang Level: beginner 10321bad809SJunchao Zhang 104db781477SPatrick Sanan .seealso: `VecRestoreKokkosViewWrite()`, `VecRestoreKokkosView()`, `VecGetKokkosView()`, `VecRestoreArray()`, `VecGetArrayRead()`, `VecGetArrays()`, `VecGetArrayF90()`, `VecGetArrayReadF90()`, `VecPlaceArray()`, `VecGetArray2d()`, 105db781477SPatrick Sanan `VecGetArrayPair()`, `VecRestoreArrayPair()`, `VecGetArrayWrite()`, `VecRestoreArrayWrite()` 10621bad809SJunchao Zhang @*/ 107152b3e56SJunchao Zhang template<class MemorySpace> PetscErrorCode VecGetKokkosViewWrite (Vec,Kokkos::View<PetscScalar*,MemorySpace>*); 10821bad809SJunchao Zhang 10921bad809SJunchao Zhang /*@C 11021bad809SJunchao Zhang VecRestoreKokkosViewWrite - Returns a Kokkos View gotten by VecGetKokkosViewWrite(). 11121bad809SJunchao Zhang 11221bad809SJunchao Zhang Synopsis: 11321bad809SJunchao Zhang #include <petscvec_kokkos.hpp> 11421bad809SJunchao Zhang PetscErrorCode VecRestoreKokkosViewWrite (Vec v,Kokkos::View<PetscScalar*,MemorySpace>* kv); 11521bad809SJunchao Zhang 11621bad809SJunchao Zhang Logically Collective on Vec 11721bad809SJunchao Zhang 118f1a722f8SMatthew G. Knepley Input Parameters: 11921bad809SJunchao Zhang + v - the vector in type of VECKOKKOS 12021bad809SJunchao Zhang - kv - the Kokkos View with a user-specified template parameter MemorySpace 12121bad809SJunchao Zhang 12221bad809SJunchao Zhang Notes: 12321bad809SJunchao Zhang If the vector is not of type VECKOKKOS, an error will be raised. 12421bad809SJunchao Zhang The function is similar to VecRestoreArrayWrite(). It is the counterpart of VecGetKokkosViewWrite(). 12521bad809SJunchao Zhang 12621bad809SJunchao Zhang Level: beginner 12721bad809SJunchao Zhang 128db781477SPatrick Sanan .seealso: `VecGetKokkosViewWrite()`, `VecGetKokkosView()`, `VecGetKokkosView()`, `VecRestoreArray()`, `VecGetArrayRead()`, `VecGetArrays()`, `VecGetArrayF90()`, `VecGetArrayReadF90()`, `VecPlaceArray()`, `VecGetArray2d()`, 129db781477SPatrick Sanan `VecGetArrayPair()`, `VecRestoreArrayPair()`, `VecGetArrayWrite()`, `VecRestoreArrayWrite()` 13021bad809SJunchao Zhang @*/ 131152b3e56SJunchao Zhang template<class MemorySpace> PetscErrorCode VecRestoreKokkosViewWrite(Vec,Kokkos::View<PetscScalar*,MemorySpace>*); 132152b3e56SJunchao Zhang 133a02b07edSJunchao Zhang #if defined(PETSC_HAVE_COMPLEX) && defined(PETSC_USE_COMPLEX) 134a02b07edSJunchao Zhang static_assert(std::alignment_of<Kokkos::complex<PetscReal>>::value == std::alignment_of<std::complex<PetscReal>>::value, 135a02b07edSJunchao Zhang "Alignment of Kokkos::complex<PetscReal> and std::complex<PetscReal> mismatch. Reconfigure your Kokkos with -DKOKKOS_ENABLE_COMPLEX_ALIGN=OFF, or let PETSc install Kokkos for you with --download-kokkos --download-kokkos-kernels"); 136a02b07edSJunchao Zhang #endif 137a02b07edSJunchao Zhang 138152b3e56SJunchao Zhang #endif 139152b3e56SJunchao Zhang 140152b3e56SJunchao Zhang #endif 141