xref: /petsc/src/sys/objects/device/impls/cupm/cupminterface.cxx (revision d71ae5a4db6382e7f06317b8d368875286fe9008)
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 
8*d71ae5a4SJacob Faibussowitsch namespace Petsc
9*d71ae5a4SJacob Faibussowitsch {
10a4af0ceeSJacob Faibussowitsch 
11*d71ae5a4SJacob Faibussowitsch namespace device
12*d71ae5a4SJacob Faibussowitsch {
13a4af0ceeSJacob Faibussowitsch 
14*d71ae5a4SJacob Faibussowitsch namespace cupm
15*d71ae5a4SJacob Faibussowitsch {
16a4af0ceeSJacob Faibussowitsch 
17*d71ae5a4SJacob Faibussowitsch namespace impl
18*d71ae5a4SJacob 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);
690e6b6b59SJacob Faibussowitsch PETSC_CUPM_DEFINE_STATIC_VARIABLE_VIA_CLASS_TYPENAME(cupmMemoryType_t, cupmMemoryTypeHost);
700e6b6b59SJacob Faibussowitsch PETSC_CUPM_DEFINE_STATIC_VARIABLE_VIA_CLASS_TYPENAME(cupmMemoryType_t, cupmMemoryTypeDevice);
710e6b6b59SJacob Faibussowitsch PETSC_CUPM_DEFINE_STATIC_VARIABLE_VIA_CLASS_TYPENAME(cupmMemoryType_t, cupmMemoryTypeManaged);
7217f48955SJacob Faibussowitsch 
730e6b6b59SJacob Faibussowitsch PETSC_CUPM_DEFINE_STATIC_VARIABLE_MATCHING_SCHEME(EventDisableTiming);
740e6b6b59SJacob Faibussowitsch PETSC_CUPM_DEFINE_STATIC_VARIABLE_VIA_EXACT_TYPENAME(int, cupmHostAllocDefault);
750e6b6b59SJacob Faibussowitsch PETSC_CUPM_DEFINE_STATIC_VARIABLE_VIA_EXACT_TYPENAME(int, cupmHostAllocWriteCombined);
7617f48955SJacob Faibussowitsch 
770e6b6b59SJacob Faibussowitsch PETSC_CUPM_DEFINE_STATIC_VARIABLE_VIA_CLASS_TYPENAME(cupmMemPoolAttr, cupmMemPoolAttrReleaseThreshold);
780e6b6b59SJacob Faibussowitsch 
790e6b6b59SJacob Faibussowitsch #if PetscDefined(HAVE_CUDA)
800e6b6b59SJacob Faibussowitsch template struct Interface<DeviceType::CUDA>;
810e6b6b59SJacob Faibussowitsch #endif
820e6b6b59SJacob Faibussowitsch #if PetscDefined(HAVE_HIP)
830e6b6b59SJacob Faibussowitsch template struct Interface<DeviceType::HIP>;
840e6b6b59SJacob Faibussowitsch #endif
850e6b6b59SJacob Faibussowitsch 
860e6b6b59SJacob Faibussowitsch } // namespace impl
870e6b6b59SJacob Faibussowitsch 
880e6b6b59SJacob Faibussowitsch } // namespace cupm
890e6b6b59SJacob Faibussowitsch 
900e6b6b59SJacob Faibussowitsch } // namespace device
91a4af0ceeSJacob Faibussowitsch 
92a4af0ceeSJacob Faibussowitsch } // namespace Petsc
93