xref: /petsc/src/sys/objects/device/impls/cupm/cupminterface.cxx (revision cd871708d6ae82bd70cc1a9e2138f9b57839fe75)
1a4af0ceeSJacob Faibussowitsch #include <petsc/private/cupminterface.hpp>
217f48955SJacob Faibussowitsch #include <petsc/private/petscadvancedmacros.h>
3a4af0ceeSJacob Faibussowitsch 
4a4af0ceeSJacob Faibussowitsch // This file serves simply to store the definitions of all the static variables that we
5a4af0ceeSJacob Faibussowitsch // DON'T have access to. Ones defined in PETSc-defined enum classes don't seem to have to
6a4af0ceeSJacob Faibussowitsch // need this declaration...
7a4af0ceeSJacob Faibussowitsch 
8d71ae5a4SJacob Faibussowitsch namespace Petsc
9d71ae5a4SJacob Faibussowitsch {
10a4af0ceeSJacob Faibussowitsch 
11d71ae5a4SJacob Faibussowitsch namespace device
12d71ae5a4SJacob Faibussowitsch {
13a4af0ceeSJacob Faibussowitsch 
14d71ae5a4SJacob Faibussowitsch namespace cupm
15d71ae5a4SJacob Faibussowitsch {
16a4af0ceeSJacob Faibussowitsch 
17d71ae5a4SJacob Faibussowitsch namespace impl
18d71ae5a4SJacob Faibussowitsch {
19a4af0ceeSJacob Faibussowitsch 
200e6b6b59SJacob Faibussowitsch #define PETSC_CUPM_STATIC_VARIABLE_DEFN(theirs, DEVICE, ours) const decltype(theirs) InterfaceImpl<DeviceType::DEVICE>::ours
210e6b6b59SJacob Faibussowitsch 
220e6b6b59SJacob Faibussowitsch #define PETSC_CUPM_STATIC_VARIABLE_DEFN_CLASS(type_name, DEVICE, ours) const typename InterfaceImpl<DeviceType::DEVICE>::type_name InterfaceImpl<DeviceType::DEVICE>::ours
230e6b6b59SJacob Faibussowitsch 
240e6b6b59SJacob Faibussowitsch #define PETSC_CUPM_STATIC_VARIABLE_DEFN_EXACT(type_name, DEVICE, ours) const type_name InterfaceImpl<DeviceType::DEVICE>::ours
25a4af0ceeSJacob Faibussowitsch 
2617f48955SJacob Faibussowitsch // in case either one or the other don't agree on a name, you can specify all three here:
2717f48955SJacob Faibussowitsch //
2817f48955SJacob Faibussowitsch // PETSC_CUPM_DEFINE_STATIC_VARIABLE_EXACT(cudaSuccess, hipAllGood, cupmSuccess) ->
2917f48955SJacob Faibussowitsch // const decltype(cudaSuccess) Interface<DeviceType::CUDA>::cupmSuccess;
3017f48955SJacob Faibussowitsch // const decltype(hipAllGood)  Interface<DeviceType::HIP>::cupmSuccess;
3117f48955SJacob Faibussowitsch #define PETSC_CUPM_DEFINE_STATIC_VARIABLE_EXACT(cuoriginal, hiporiginal, ours) \
320e6b6b59SJacob Faibussowitsch   PetscIfPetscDefined(HAVE_CUDA, PETSC_CUPM_STATIC_VARIABLE_DEFN, PetscExpandToNothing)(cuoriginal, CUDA, ours); \
330e6b6b59SJacob Faibussowitsch   PetscIfPetscDefined(HAVE_HIP, PETSC_CUPM_STATIC_VARIABLE_DEFN, PetscExpandToNothing)(hiporiginal, HIP, ours)
340e6b6b59SJacob Faibussowitsch 
350e6b6b59SJacob Faibussowitsch // define the static variable in terms of the class typename
360e6b6b59SJacob Faibussowitsch #define PETSC_CUPM_DEFINE_STATIC_VARIABLE_VIA_CLASS_TYPENAME(type_name, ours) \
370e6b6b59SJacob Faibussowitsch   PetscIfPetscDefined(HAVE_CUDA, PETSC_CUPM_STATIC_VARIABLE_DEFN_CLASS, PetscExpandToNothing)(type_name, CUDA, ours); \
380e6b6b59SJacob Faibussowitsch   PetscIfPetscDefined(HAVE_HIP, PETSC_CUPM_STATIC_VARIABLE_DEFN_CLASS, PetscExpandToNothing)(type_name, HIP, ours)
390e6b6b59SJacob Faibussowitsch 
400e6b6b59SJacob Faibussowitsch #define PETSC_CUPM_DEFINE_STATIC_VARIABLE_VIA_EXACT_TYPENAME(type_name, ours) \
410e6b6b59SJacob Faibussowitsch   PetscIfPetscDefined(HAVE_CUDA, PETSC_CUPM_STATIC_VARIABLE_DEFN_EXACT, PetscExpandToNothing)(type_name, CUDA, ours); \
420e6b6b59SJacob Faibussowitsch   PetscIfPetscDefined(HAVE_HIP, PETSC_CUPM_STATIC_VARIABLE_DEFN_EXACT, PetscExpandToNothing)(type_name, HIP, ours)
43a4af0ceeSJacob Faibussowitsch 
4417f48955SJacob Faibussowitsch // if both cuda and hip agree on the same naming scheme i.e. cudaSuccess and hipSuccess:
4517f48955SJacob Faibussowitsch //
4617f48955SJacob Faibussowitsch // PETSC_CUPM_DEFINE_STATIC_VARIABLE_MATCHING_SCHEME(Success) ->
4717f48955SJacob Faibussowitsch // const decltype(cudaSuccess) Interface<DeviceType::CUDA>::cupmSuccess;
4817f48955SJacob Faibussowitsch // const decltype(hipSuccess)  Interface<DeviceType::HIP>::cupmSuccess;
499371c9d4SSatish Balay #define PETSC_CUPM_DEFINE_STATIC_VARIABLE_MATCHING_SCHEME(suffix) PETSC_CUPM_DEFINE_STATIC_VARIABLE_EXACT(PetscConcat(cuda, suffix), PetscConcat(hip, suffix), PetscConcat(cupm, suffix))
50a4af0ceeSJacob Faibussowitsch 
51a4af0ceeSJacob Faibussowitsch // error codes
520e6b6b59SJacob Faibussowitsch PETSC_CUPM_DEFINE_STATIC_VARIABLE_VIA_CLASS_TYPENAME(cupmError_t, cupmSuccess);
530e6b6b59SJacob Faibussowitsch PETSC_CUPM_DEFINE_STATIC_VARIABLE_VIA_CLASS_TYPENAME(cupmError_t, cupmErrorNotReady);
540e6b6b59SJacob Faibussowitsch PETSC_CUPM_DEFINE_STATIC_VARIABLE_VIA_CLASS_TYPENAME(cupmError_t, cupmErrorSetOnActiveProcess);
550e6b6b59SJacob Faibussowitsch PETSC_CUPM_DEFINE_STATIC_VARIABLE_VIA_CLASS_TYPENAME(cupmError_t, cupmErrorNoDevice);
560e6b6b59SJacob Faibussowitsch PETSC_CUPM_DEFINE_STATIC_VARIABLE_VIA_CLASS_TYPENAME(cupmError_t, cupmErrorDeviceAlreadyInUse);
570e6b6b59SJacob Faibussowitsch PETSC_CUPM_DEFINE_STATIC_VARIABLE_VIA_CLASS_TYPENAME(cupmError_t, cupmErrorStubLibrary);
58a4af0ceeSJacob Faibussowitsch 
59a4af0ceeSJacob Faibussowitsch // enums
600e6b6b59SJacob Faibussowitsch PETSC_CUPM_DEFINE_STATIC_VARIABLE_MATCHING_SCHEME(StreamDefault);
610e6b6b59SJacob Faibussowitsch PETSC_CUPM_DEFINE_STATIC_VARIABLE_MATCHING_SCHEME(StreamNonBlocking);
620e6b6b59SJacob Faibussowitsch PETSC_CUPM_DEFINE_STATIC_VARIABLE_MATCHING_SCHEME(DeviceMapHost);
6317f48955SJacob Faibussowitsch 
640e6b6b59SJacob Faibussowitsch PETSC_CUPM_DEFINE_STATIC_VARIABLE_VIA_CLASS_TYPENAME(cupmMemcpyKind_t, cupmMemcpyHostToDevice);
650e6b6b59SJacob Faibussowitsch PETSC_CUPM_DEFINE_STATIC_VARIABLE_VIA_CLASS_TYPENAME(cupmMemcpyKind_t, cupmMemcpyDeviceToHost);
660e6b6b59SJacob Faibussowitsch PETSC_CUPM_DEFINE_STATIC_VARIABLE_VIA_CLASS_TYPENAME(cupmMemcpyKind_t, cupmMemcpyDeviceToDevice);
670e6b6b59SJacob Faibussowitsch PETSC_CUPM_DEFINE_STATIC_VARIABLE_VIA_CLASS_TYPENAME(cupmMemcpyKind_t, cupmMemcpyHostToHost);
680e6b6b59SJacob Faibussowitsch PETSC_CUPM_DEFINE_STATIC_VARIABLE_VIA_CLASS_TYPENAME(cupmMemcpyKind_t, cupmMemcpyDefault);
69012f47c9SJacob Faibussowitsch 
70012f47c9SJacob Faibussowitsch PETSC_CUPM_DEFINE_STATIC_VARIABLE_MATCHING_SCHEME(MemoryTypeHost);
71012f47c9SJacob Faibussowitsch PETSC_CUPM_DEFINE_STATIC_VARIABLE_MATCHING_SCHEME(MemoryTypeDevice);
72012f47c9SJacob Faibussowitsch // A vile, vile, hack. Would use PETSC_CUPM_DEFINE_STATIC_VARIABLE_VIA_CLASS_TYPENAME() with
73012f47c9SJacob Faibussowitsch // cupmMemoryType_t however MSVC chokes on this with:
74012f47c9SJacob Faibussowitsch //
75012f47c9SJacob Faibussowitsch // \src\sys\objects\device\impls\cupm\cupminterface.cxx(69): error C2371: 'cupmMemoryTypeHost':
76012f47c9SJacob Faibussowitsch // redefinition; different basic types
77012f47c9SJacob Faibussowitsch // \include\petsc/private/cupminterface.hpp(314): note: see declaration of 'cupmMemoryTypeHost'
78012f47c9SJacob Faibussowitsch // \src\sys\objects\device\impls\cupm\cupminterface.cxx(70): error C2371:
79012f47c9SJacob Faibussowitsch // 'cupmMemoryTypeDevice': redefinition; different basic types
80012f47c9SJacob Faibussowitsch // \include\petsc/private/cupminterface.hpp(315): note: see declaration of 'cupmMemoryTypeDevice'
81012f47c9SJacob Faibussowitsch // \src\sys\objects\device\impls\cupm\cupminterface.cxx(71): error C2371:
82012f47c9SJacob Faibussowitsch // 'cupmMemoryTypeManaged': redefinition; different basic types
83012f47c9SJacob Faibussowitsch // \include\petsc/private/cupminterface.hpp(316): note: see declaration of
84012f47c9SJacob Faibussowitsch // 'cupmMemoryTypeManaged'
85012f47c9SJacob Faibussowitsch //
86012f47c9SJacob Faibussowitsch // the only way to get it to compile is to use
87012f47c9SJacob Faibussowitsch // PETSC_CUPM_DEFINE_STATIC_VARIABLE_MATCHING_SCHEME() but since cupmMemoryTypeManaged is
88012f47c9SJacob Faibussowitsch // secretly hipMemoryTypeUnified that doesn't work unless we fudge it with preprocessor
89012f47c9SJacob Faibussowitsch #define hipMemoryTypeManaged hipMemoryTypeUnified
90012f47c9SJacob Faibussowitsch PETSC_CUPM_DEFINE_STATIC_VARIABLE_MATCHING_SCHEME(MemoryTypeManaged);
9117f48955SJacob Faibussowitsch 
920e6b6b59SJacob Faibussowitsch PETSC_CUPM_DEFINE_STATIC_VARIABLE_MATCHING_SCHEME(EventDisableTiming);
930e6b6b59SJacob Faibussowitsch PETSC_CUPM_DEFINE_STATIC_VARIABLE_VIA_EXACT_TYPENAME(int, cupmHostAllocDefault);
940e6b6b59SJacob Faibussowitsch PETSC_CUPM_DEFINE_STATIC_VARIABLE_VIA_EXACT_TYPENAME(int, cupmHostAllocWriteCombined);
9517f48955SJacob Faibussowitsch 
960e6b6b59SJacob Faibussowitsch PETSC_CUPM_DEFINE_STATIC_VARIABLE_VIA_CLASS_TYPENAME(cupmMemPoolAttr, cupmMemPoolAttrReleaseThreshold);
97*b547d71cSNuno Nobre PETSC_CUPM_DEFINE_STATIC_VARIABLE_VIA_CLASS_TYPENAME(cupmDeviceAttr_t, cupmDevAttrClockRate);
98*b547d71cSNuno Nobre PETSC_CUPM_DEFINE_STATIC_VARIABLE_VIA_CLASS_TYPENAME(cupmDeviceAttr_t, cupmDevAttrMemoryClockRate);
990e6b6b59SJacob Faibussowitsch 
1000e6b6b59SJacob Faibussowitsch #if PetscDefined(HAVE_CUDA)
1010e6b6b59SJacob Faibussowitsch template struct Interface<DeviceType::CUDA>;
1020e6b6b59SJacob Faibussowitsch #endif
103a0fd03d2SJacob Faibussowitsch 
1040e6b6b59SJacob Faibussowitsch #if PetscDefined(HAVE_HIP)
1050e6b6b59SJacob Faibussowitsch template struct Interface<DeviceType::HIP>;
1060e6b6b59SJacob Faibussowitsch #endif
1070e6b6b59SJacob Faibussowitsch 
1080e6b6b59SJacob Faibussowitsch } // namespace impl
1090e6b6b59SJacob Faibussowitsch 
1100e6b6b59SJacob Faibussowitsch } // namespace cupm
1110e6b6b59SJacob Faibussowitsch 
1120e6b6b59SJacob Faibussowitsch } // namespace device
113a4af0ceeSJacob Faibussowitsch 
114a4af0ceeSJacob Faibussowitsch } // namespace Petsc
115