xref: /petsc/src/vec/is/sf/impls/basic/cupm/sfcupm.hpp (revision bb59972c36a4dbc3a3dca65232097048bda6fd19)
1054def41SToby Isaac #pragma once
2054def41SToby Isaac #include <../src/vec/is/sf/impls/basic/sfpack.h>
3054def41SToby Isaac #include <petsc/private/cupminterface.hpp>
4054def41SToby Isaac #include <petsc/private/cupmatomics.hpp>
5054def41SToby Isaac #include <petsc/private/deviceimpl.h>
6054def41SToby Isaac 
7054def41SToby Isaac namespace Petsc
8054def41SToby Isaac {
9054def41SToby Isaac 
10054def41SToby Isaac namespace sf
11054def41SToby Isaac {
12054def41SToby Isaac 
13054def41SToby Isaac namespace cupm
14054def41SToby Isaac {
15054def41SToby Isaac 
16054def41SToby Isaac namespace impl
17054def41SToby Isaac {
18054def41SToby Isaac 
19054def41SToby Isaac template <device::cupm::DeviceType T>
20*85f25e71SJed Brown struct PETSC_SINGLE_LIBRARY_VISIBILITY_INTERNAL SfInterface : device::cupm::impl::Interface<T> {
21054def41SToby Isaac   PETSC_CUPM_INHERIT_INTERFACE_TYPEDEFS_USING(T);
22054def41SToby Isaac 
23054def41SToby Isaac private:
24054def41SToby Isaac   template <typename Type, PetscInt BS, PetscInt EQ>
25054def41SToby Isaac   static PetscErrorCode Pack(PetscSFLink, PetscInt, PetscInt, PetscSFPackOpt, const PetscInt *, const void *, void *) noexcept;
26054def41SToby Isaac 
27054def41SToby Isaac   template <typename Type, class Op, PetscInt BS, PetscInt EQ>
28054def41SToby Isaac   static PetscErrorCode UnpackAndOp(PetscSFLink, PetscInt, PetscInt, PetscSFPackOpt, const PetscInt *, void *, const void *) noexcept;
29054def41SToby Isaac 
30054def41SToby Isaac   template <typename Type, class Op, PetscInt BS, PetscInt EQ>
31054def41SToby Isaac   static PetscErrorCode FetchAndOp(PetscSFLink, PetscInt, PetscInt, PetscSFPackOpt, const PetscInt *, void *, void *) noexcept;
32054def41SToby Isaac 
33054def41SToby Isaac   template <typename Type, class Op, PetscInt BS, PetscInt EQ>
34054def41SToby Isaac   static PetscErrorCode ScatterAndOp(PetscSFLink, PetscInt, PetscInt, PetscSFPackOpt, const PetscInt *, const void *, PetscInt, PetscSFPackOpt, const PetscInt *, void *) noexcept;
35054def41SToby Isaac 
36054def41SToby Isaac   template <typename Type, PetscInt BS, PetscInt EQ>
37054def41SToby Isaac   static PetscErrorCode ScatterAndInsert(PetscSFLink, PetscInt, PetscInt, PetscSFPackOpt, const PetscInt *, const void *, PetscInt, PetscSFPackOpt, const PetscInt *, void *) noexcept;
38054def41SToby Isaac 
39054def41SToby Isaac   template <typename Type, class Op, PetscInt BS, PetscInt EQ>
40054def41SToby Isaac   static PetscErrorCode FetchAndOpLocal(PetscSFLink, PetscInt, PetscInt, PetscSFPackOpt, const PetscInt *, void *, PetscInt, PetscSFPackOpt, const PetscInt *, const void *, void *) noexcept;
41054def41SToby Isaac 
42054def41SToby Isaac   template <typename Type, PetscInt BS, PetscInt EQ>
43054def41SToby Isaac   static void PackInit_RealType(PetscSFLink) noexcept;
44054def41SToby Isaac 
45054def41SToby Isaac   template <typename Type, PetscInt BS, PetscInt EQ, PetscInt size /*sizeof(Type)*/>
46054def41SToby Isaac   struct PackInit_IntegerType_Atomic;
47054def41SToby Isaac 
48054def41SToby Isaac   template <typename Type, PetscInt BS, PetscInt EQ>
49054def41SToby Isaac   static void PackInit_IntegerType(PetscSFLink link) noexcept;
50054def41SToby Isaac 
51054def41SToby Isaac #if PetscDefined(HAVE_COMPLEX)
52054def41SToby Isaac   template <typename Type, PetscInt BS, PetscInt EQ>
53054def41SToby Isaac   static void PackInit_ComplexType(PetscSFLink link) noexcept;
54054def41SToby Isaac #endif
55054def41SToby Isaac 
56054def41SToby Isaac   template <typename Type>
57054def41SToby Isaac   static void PackInit_PairType(PetscSFLink link) noexcept;
58054def41SToby Isaac 
59054def41SToby Isaac   template <typename Type, PetscInt BS, PetscInt EQ>
60054def41SToby Isaac   static void PackInit_DumbType(PetscSFLink link) noexcept;
61054def41SToby Isaac 
62054def41SToby Isaac   static PetscErrorCode LinkSyncDevice(PetscSFLink) noexcept;
63054def41SToby Isaac   static PetscErrorCode LinkSyncStream(PetscSFLink) noexcept;
64054def41SToby Isaac   static PetscErrorCode LinkMemcpy(PetscSFLink, PetscMemType, void *, PetscMemType, const void *, size_t) noexcept;
65054def41SToby Isaac   static PetscErrorCode LinkDestroy_MPI(PetscSF, PetscSFLink) noexcept;
66054def41SToby Isaac 
67054def41SToby Isaac public:
68054def41SToby Isaac   static PetscErrorCode Malloc(PetscMemType, size_t, void **) noexcept;
69054def41SToby Isaac   static PetscErrorCode Free(PetscMemType, void *) noexcept;
70054def41SToby Isaac   static PetscErrorCode LinkSetUp(PetscSF, PetscSFLink, MPI_Datatype) noexcept;
71054def41SToby Isaac };
72054def41SToby Isaac 
73054def41SToby Isaac } // namespace impl
74054def41SToby Isaac 
75054def41SToby Isaac } // namespace cupm
76054def41SToby Isaac 
77054def41SToby Isaac } // namespace sf
78054def41SToby Isaac 
79054def41SToby Isaac } // namespace Petsc
80