xref: /petsc/include/petscvec_kokkos.hpp (revision ac09b9214d23ea9ad238aa607de9fa447fd4e91b)
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