xref: /petsc/include/petscvec_kokkos.hpp (revision 87497f523770ea28bdc907071c6e8146b51bca00)
1152b3e56SJunchao Zhang #if !defined(PETSCVEC_KOKKOS_HPP)
2152b3e56SJunchao Zhang #define PETSCVEC_KOKKOS_HPP
3152b3e56SJunchao Zhang 
411d22bbfSJunchao Zhang #include <petscconf.h>
511d22bbfSJunchao Zhang 
6ac09b921SBarry Smith /* SUBMANSEC = Vec */
7ac09b921SBarry 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:
32*87497f52SBarry Smith .  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:
38*87497f52SBarry Smith    If the vector is not of type `VECKOKKOS`, an error will be raised.
39*87497f52SBarry Smith 
40*87497f52SBarry Smith    The functions are similar to `VecGetArrayRead()` and `VecGetArray()` respectively. One can read-only or read/write the returned Kokkos View.
41*87497f52SBarry Smith 
42*87497f52SBarry Smith    Passing in a const View enables read-only access.
43*87497f52SBarry Smith 
44*87497f52SBarry Smith    One must return the View by a matching `VecRestoreKokkosView()` after finishing using the View. Currently, only two memory
4521bad809SJunchao Zhang    spaces are supported: Kokkos::HostSpace and Kokkos::DefaultExecutionSpace::memory_space.
4621bad809SJunchao Zhang    If needed, a memory copy will be internally called to copy the latest vector data to the specified memory space.
4721bad809SJunchao Zhang 
4821bad809SJunchao Zhang    Level: beginner
4921bad809SJunchao Zhang 
50db781477SPatrick Sanan .seealso: `VecRestoreKokkosView()`, `VecRestoreArray()`, `VecGetKokkosViewWrite()`, `VecGetArrayRead()`, `VecGetArrays()`, `VecGetArrayF90()`, `VecGetArrayReadF90()`, `VecPlaceArray()`, `VecGetArray2d()`,
51db781477SPatrick Sanan           `VecGetArrayPair()`, `VecRestoreArrayPair()`, `VecGetArrayWrite()`, `VecRestoreArrayWrite()`
5221bad809SJunchao Zhang @*/
53152b3e56SJunchao Zhang   template<class MemorySpace> PetscErrorCode VecGetKokkosView (Vec,Kokkos::View<const PetscScalar*,MemorySpace>*);
54152b3e56SJunchao Zhang   template<class MemorySpace> PetscErrorCode VecGetKokkosView (Vec,Kokkos::View<PetscScalar*,MemorySpace>*);
5521bad809SJunchao Zhang 
5621bad809SJunchao Zhang /*@C
57*87497f52SBarry Smith    VecRestoreKokkosView - Returns a Kokkos View gotten by `VecGetKokkosView()`.
5821bad809SJunchao Zhang 
5921bad809SJunchao Zhang    Synopsis:
6021bad809SJunchao Zhang    #include <petscvec_kokkos.hpp>
6121bad809SJunchao Zhang    PetscErrorCode VecRestoreKokkosView  (Vec v,Kokkos::View<const PetscScalar*,MemorySpace>* kv);
6221bad809SJunchao Zhang    PetscErrorCode VecRestoreKokkosView  (Vec v,Kokkos::View<PetscScalar*,MemorySpace>* kv);
6321bad809SJunchao Zhang 
6421bad809SJunchao Zhang    Logically Collective on Vec
6521bad809SJunchao Zhang 
66f1a722f8SMatthew G. Knepley    Input Parameters:
67*87497f52SBarry Smith +  v  - the vector in type of `VECKOKKOS`
6821bad809SJunchao Zhang -  kv - the Kokkos View with a user-specified template parameter MemorySpace
6921bad809SJunchao Zhang 
7021bad809SJunchao Zhang    Notes:
71*87497f52SBarry Smith    If the vector is not of type `VECKOKKOS`, an error will be raised.
72*87497f52SBarry Smith    The functions are similar to `VecRestoreArrayRead()` and `VecRestoreArray()` respectively. They are the counterpart of `VecGetKokkosView()`.
7321bad809SJunchao Zhang 
7421bad809SJunchao Zhang    Level: beginner
7521bad809SJunchao Zhang 
76db781477SPatrick Sanan .seealso: `VecGetKokkosView()`, `VecRestoreKokkosViewWrite()`, `VecRestoreArray()`, `VecGetArrayRead()`, `VecGetArrays()`, `VecGetArrayF90()`, `VecGetArrayReadF90()`, `VecPlaceArray()`, `VecGetArray2d()`,
77db781477SPatrick Sanan           `VecGetArrayPair()`, `VecRestoreArrayPair()`, `VecGetArrayWrite()`, `VecRestoreArrayWrite()`
7821bad809SJunchao Zhang @*/
7921bad809SJunchao Zhang   template<class MemorySpace> PetscErrorCode VecRestoreKokkosView(Vec,Kokkos::View<const PetscScalar*,MemorySpace>*){return 0;}
80152b3e56SJunchao Zhang   template<class MemorySpace> PetscErrorCode VecRestoreKokkosView(Vec,Kokkos::View<PetscScalar*,MemorySpace>*);
81152b3e56SJunchao Zhang 
8221bad809SJunchao Zhang 
8321bad809SJunchao Zhang /*@C
8421bad809SJunchao Zhang    VecGetKokkosViewWrite - Returns a Kokkos View that contains the array of a vector in the specified memory space.
8521bad809SJunchao Zhang 
8621bad809SJunchao Zhang    Synopsis:
8721bad809SJunchao Zhang    #include <petscvec_kokkos.hpp>
8821bad809SJunchao Zhang    PetscErrorCode VecGetKokkosViewWrite  (Vec v,Kokkos::View<PetscScalar*,MemorySpace>* kv);
8921bad809SJunchao Zhang 
9021bad809SJunchao Zhang    Logically Collective on Vec
9121bad809SJunchao Zhang 
9221bad809SJunchao Zhang    Input Parameter:
93*87497f52SBarry Smith .  v - the vector in type of `VECKOKKOS`
9421bad809SJunchao Zhang 
9521bad809SJunchao Zhang    Output Parameter:
9621bad809SJunchao Zhang .  kv - the Kokkos View with a user-specified template parameter MemorySpace
9721bad809SJunchao Zhang 
9821bad809SJunchao Zhang    Notes:
99*87497f52SBarry Smith    If the vector is not of type `VECKOKKOS`, an error will be raised.
100*87497f52SBarry Smith 
101*87497f52SBarry Smith    The functions is similar to `VecGetArrayWrite()`. The returned view might contain garbage data or stale data and one is not
10221bad809SJunchao Zhang    expected to read data from the View. Instead, one is expected to overwrite all data in the View.
103*87497f52SBarry Smith    One must return the View by a matching `VecRestoreKokkosViewWrite()` after finishing using the View.
104*87497f52SBarry Smith 
10521bad809SJunchao Zhang    Currently, only two memory spaces are supported: Kokkos::HostSpace and Kokkos::DefaultExecutionSpace::memory_space.
10621bad809SJunchao Zhang 
10721bad809SJunchao Zhang    Level: beginner
10821bad809SJunchao Zhang 
109db781477SPatrick Sanan .seealso: `VecRestoreKokkosViewWrite()`, `VecRestoreKokkosView()`, `VecGetKokkosView()`, `VecRestoreArray()`, `VecGetArrayRead()`, `VecGetArrays()`, `VecGetArrayF90()`, `VecGetArrayReadF90()`, `VecPlaceArray()`, `VecGetArray2d()`,
110db781477SPatrick Sanan           `VecGetArrayPair()`, `VecRestoreArrayPair()`, `VecGetArrayWrite()`, `VecRestoreArrayWrite()`
11121bad809SJunchao Zhang @*/
112152b3e56SJunchao Zhang   template<class MemorySpace> PetscErrorCode VecGetKokkosViewWrite    (Vec,Kokkos::View<PetscScalar*,MemorySpace>*);
11321bad809SJunchao Zhang 
11421bad809SJunchao Zhang /*@C
115*87497f52SBarry Smith    VecRestoreKokkosViewWrite - Returns a Kokkos View gotten with `VecGetKokkosViewWrite()`.
11621bad809SJunchao Zhang 
11721bad809SJunchao Zhang    Synopsis:
11821bad809SJunchao Zhang    #include <petscvec_kokkos.hpp>
11921bad809SJunchao Zhang    PetscErrorCode VecRestoreKokkosViewWrite  (Vec v,Kokkos::View<PetscScalar*,MemorySpace>* kv);
12021bad809SJunchao Zhang 
12121bad809SJunchao Zhang    Logically Collective on Vec
12221bad809SJunchao Zhang 
123f1a722f8SMatthew G. Knepley    Input Parameters:
124*87497f52SBarry Smith +  v  - the vector in type of `VECKOKKOS`
12521bad809SJunchao Zhang -  kv - the Kokkos View with a user-specified template parameter MemorySpace
12621bad809SJunchao Zhang 
12721bad809SJunchao Zhang    Notes:
128*87497f52SBarry Smith    If the vector is not of type `VECKOKKOS`, an error will be raised.
129*87497f52SBarry Smith 
130*87497f52SBarry Smith    The function is similar to `VecRestoreArrayWrite()`. It is the counterpart of `VecGetKokkosViewWrite()`.
13121bad809SJunchao Zhang 
13221bad809SJunchao Zhang    Level: beginner
13321bad809SJunchao Zhang 
134db781477SPatrick Sanan .seealso: `VecGetKokkosViewWrite()`, `VecGetKokkosView()`, `VecGetKokkosView()`, `VecRestoreArray()`, `VecGetArrayRead()`, `VecGetArrays()`, `VecGetArrayF90()`, `VecGetArrayReadF90()`, `VecPlaceArray()`, `VecGetArray2d()`,
135db781477SPatrick Sanan           `VecGetArrayPair()`, `VecRestoreArrayPair()`, `VecGetArrayWrite()`, `VecRestoreArrayWrite()`
13621bad809SJunchao Zhang @*/
137152b3e56SJunchao Zhang   template<class MemorySpace> PetscErrorCode VecRestoreKokkosViewWrite(Vec,Kokkos::View<PetscScalar*,MemorySpace>*);
138152b3e56SJunchao Zhang 
139a02b07edSJunchao Zhang  #if defined(PETSC_HAVE_COMPLEX) && defined(PETSC_USE_COMPLEX)
140a02b07edSJunchao Zhang   static_assert(std::alignment_of<Kokkos::complex<PetscReal>>::value == std::alignment_of<std::complex<PetscReal>>::value,
141a02b07edSJunchao 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");
142a02b07edSJunchao Zhang  #endif
143a02b07edSJunchao Zhang 
144152b3e56SJunchao Zhang #endif
145152b3e56SJunchao Zhang 
146152b3e56SJunchao Zhang #endif
147