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