xref: /petsc/src/vec/is/sf/impls/basic/cupm/sfcupm.hpp (revision 054def416aed7ef27d70c7e34050958e02f4a5f4)
1*054def41SToby Isaac #pragma once
2*054def41SToby Isaac #include <../src/vec/is/sf/impls/basic/sfpack.h>
3*054def41SToby Isaac #include <petsc/private/cupminterface.hpp>
4*054def41SToby Isaac #include <petsc/private/cupmatomics.hpp>
5*054def41SToby Isaac #include <petsc/private/deviceimpl.h>
6*054def41SToby Isaac 
7*054def41SToby Isaac namespace Petsc
8*054def41SToby Isaac {
9*054def41SToby Isaac 
10*054def41SToby Isaac namespace sf
11*054def41SToby Isaac {
12*054def41SToby Isaac 
13*054def41SToby Isaac namespace cupm
14*054def41SToby Isaac {
15*054def41SToby Isaac 
16*054def41SToby Isaac namespace impl
17*054def41SToby Isaac {
18*054def41SToby Isaac 
19*054def41SToby Isaac template <device::cupm::DeviceType T>
20*054def41SToby Isaac struct SfInterface : device::cupm::impl::Interface<T> {
21*054def41SToby Isaac   PETSC_CUPM_INHERIT_INTERFACE_TYPEDEFS_USING(T);
22*054def41SToby Isaac 
23*054def41SToby Isaac private:
24*054def41SToby Isaac   template <typename Type, PetscInt BS, PetscInt EQ>
25*054def41SToby Isaac   static PetscErrorCode Pack(PetscSFLink, PetscInt, PetscInt, PetscSFPackOpt, const PetscInt *, const void *, void *) noexcept;
26*054def41SToby Isaac 
27*054def41SToby Isaac   template <typename Type, class Op, PetscInt BS, PetscInt EQ>
28*054def41SToby Isaac   static PetscErrorCode UnpackAndOp(PetscSFLink, PetscInt, PetscInt, PetscSFPackOpt, const PetscInt *, void *, const void *) noexcept;
29*054def41SToby Isaac 
30*054def41SToby Isaac   template <typename Type, class Op, PetscInt BS, PetscInt EQ>
31*054def41SToby Isaac   static PetscErrorCode FetchAndOp(PetscSFLink, PetscInt, PetscInt, PetscSFPackOpt, const PetscInt *, void *, void *) noexcept;
32*054def41SToby Isaac 
33*054def41SToby Isaac   template <typename Type, class Op, PetscInt BS, PetscInt EQ>
34*054def41SToby Isaac   static PetscErrorCode ScatterAndOp(PetscSFLink, PetscInt, PetscInt, PetscSFPackOpt, const PetscInt *, const void *, PetscInt, PetscSFPackOpt, const PetscInt *, void *) noexcept;
35*054def41SToby Isaac 
36*054def41SToby Isaac   template <typename Type, PetscInt BS, PetscInt EQ>
37*054def41SToby Isaac   static PetscErrorCode ScatterAndInsert(PetscSFLink, PetscInt, PetscInt, PetscSFPackOpt, const PetscInt *, const void *, PetscInt, PetscSFPackOpt, const PetscInt *, void *) noexcept;
38*054def41SToby Isaac 
39*054def41SToby Isaac   template <typename Type, class Op, PetscInt BS, PetscInt EQ>
40*054def41SToby Isaac   static PetscErrorCode FetchAndOpLocal(PetscSFLink, PetscInt, PetscInt, PetscSFPackOpt, const PetscInt *, void *, PetscInt, PetscSFPackOpt, const PetscInt *, const void *, void *) noexcept;
41*054def41SToby Isaac 
42*054def41SToby Isaac   template <typename Type, PetscInt BS, PetscInt EQ>
43*054def41SToby Isaac   static void PackInit_RealType(PetscSFLink) noexcept;
44*054def41SToby Isaac 
45*054def41SToby Isaac   template <typename Type, PetscInt BS, PetscInt EQ, PetscInt size /*sizeof(Type)*/>
46*054def41SToby Isaac   struct PackInit_IntegerType_Atomic;
47*054def41SToby Isaac 
48*054def41SToby Isaac   template <typename Type, PetscInt BS, PetscInt EQ>
49*054def41SToby Isaac   static void PackInit_IntegerType(PetscSFLink link) noexcept;
50*054def41SToby Isaac 
51*054def41SToby Isaac #if PetscDefined(HAVE_COMPLEX)
52*054def41SToby Isaac   template <typename Type, PetscInt BS, PetscInt EQ>
53*054def41SToby Isaac   static void PackInit_ComplexType(PetscSFLink link) noexcept;
54*054def41SToby Isaac #endif
55*054def41SToby Isaac 
56*054def41SToby Isaac   template <typename Type>
57*054def41SToby Isaac   static void PackInit_PairType(PetscSFLink link) noexcept;
58*054def41SToby Isaac 
59*054def41SToby Isaac   template <typename Type, PetscInt BS, PetscInt EQ>
60*054def41SToby Isaac   static void PackInit_DumbType(PetscSFLink link) noexcept;
61*054def41SToby Isaac 
62*054def41SToby Isaac   static PetscErrorCode LinkSyncDevice(PetscSFLink) noexcept;
63*054def41SToby Isaac   static PetscErrorCode LinkSyncStream(PetscSFLink) noexcept;
64*054def41SToby Isaac   static PetscErrorCode LinkMemcpy(PetscSFLink, PetscMemType, void *, PetscMemType, const void *, size_t) noexcept;
65*054def41SToby Isaac   static PetscErrorCode LinkDestroy_MPI(PetscSF, PetscSFLink) noexcept;
66*054def41SToby Isaac 
67*054def41SToby Isaac public:
68*054def41SToby Isaac   static PetscErrorCode Malloc(PetscMemType, size_t, void **) noexcept;
69*054def41SToby Isaac   static PetscErrorCode Free(PetscMemType, void *) noexcept;
70*054def41SToby Isaac   static PetscErrorCode LinkSetUp(PetscSF, PetscSFLink, MPI_Datatype) noexcept;
71*054def41SToby Isaac };
72*054def41SToby Isaac 
73*054def41SToby Isaac } // namespace impl
74*054def41SToby Isaac 
75*054def41SToby Isaac } // namespace cupm
76*054def41SToby Isaac 
77*054def41SToby Isaac } // namespace sf
78*054def41SToby Isaac 
79*054def41SToby Isaac } // namespace Petsc
80