xref: /petsc/src/sys/objects/device/impls/cupm/cupminterface.cxx (revision 0e6b6b5985dd9b1172860d21fb88bd3966bf7c54)
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 
89371c9d4SSatish Balay namespace Petsc {
9a4af0ceeSJacob Faibussowitsch 
10*0e6b6b59SJacob Faibussowitsch namespace device {
11a4af0ceeSJacob Faibussowitsch 
12*0e6b6b59SJacob Faibussowitsch namespace cupm {
13a4af0ceeSJacob Faibussowitsch 
14*0e6b6b59SJacob Faibussowitsch namespace impl {
15a4af0ceeSJacob Faibussowitsch 
16*0e6b6b59SJacob Faibussowitsch #define PETSC_CUPM_STATIC_VARIABLE_DEFN(theirs, DEVICE, ours) const decltype(theirs) InterfaceImpl<DeviceType::DEVICE>::ours
17*0e6b6b59SJacob Faibussowitsch 
18*0e6b6b59SJacob Faibussowitsch #define PETSC_CUPM_STATIC_VARIABLE_DEFN_CLASS(type_name, DEVICE, ours) const typename InterfaceImpl<DeviceType::DEVICE>::type_name InterfaceImpl<DeviceType::DEVICE>::ours
19*0e6b6b59SJacob Faibussowitsch 
20*0e6b6b59SJacob Faibussowitsch #define PETSC_CUPM_STATIC_VARIABLE_DEFN_EXACT(type_name, DEVICE, ours) const type_name InterfaceImpl<DeviceType::DEVICE>::ours
21a4af0ceeSJacob Faibussowitsch 
2217f48955SJacob Faibussowitsch // in case either one or the other don't agree on a name, you can specify all three here:
2317f48955SJacob Faibussowitsch //
2417f48955SJacob Faibussowitsch // PETSC_CUPM_DEFINE_STATIC_VARIABLE_EXACT(cudaSuccess, hipAllGood, cupmSuccess) ->
2517f48955SJacob Faibussowitsch // const decltype(cudaSuccess) Interface<DeviceType::CUDA>::cupmSuccess;
2617f48955SJacob Faibussowitsch // const decltype(hipAllGood)  Interface<DeviceType::HIP>::cupmSuccess;
2717f48955SJacob Faibussowitsch #define PETSC_CUPM_DEFINE_STATIC_VARIABLE_EXACT(cuoriginal, hiporiginal, ours) \
28*0e6b6b59SJacob Faibussowitsch   PetscIfPetscDefined(HAVE_CUDA, PETSC_CUPM_STATIC_VARIABLE_DEFN, PetscExpandToNothing)(cuoriginal, CUDA, ours); \
29*0e6b6b59SJacob Faibussowitsch   PetscIfPetscDefined(HAVE_HIP, PETSC_CUPM_STATIC_VARIABLE_DEFN, PetscExpandToNothing)(hiporiginal, HIP, ours)
30*0e6b6b59SJacob Faibussowitsch 
31*0e6b6b59SJacob Faibussowitsch // define the static variable in terms of the class typename
32*0e6b6b59SJacob Faibussowitsch #define PETSC_CUPM_DEFINE_STATIC_VARIABLE_VIA_CLASS_TYPENAME(type_name, ours) \
33*0e6b6b59SJacob Faibussowitsch   PetscIfPetscDefined(HAVE_CUDA, PETSC_CUPM_STATIC_VARIABLE_DEFN_CLASS, PetscExpandToNothing)(type_name, CUDA, ours); \
34*0e6b6b59SJacob Faibussowitsch   PetscIfPetscDefined(HAVE_HIP, PETSC_CUPM_STATIC_VARIABLE_DEFN_CLASS, PetscExpandToNothing)(type_name, HIP, ours)
35*0e6b6b59SJacob Faibussowitsch 
36*0e6b6b59SJacob Faibussowitsch #define PETSC_CUPM_DEFINE_STATIC_VARIABLE_VIA_EXACT_TYPENAME(type_name, ours) \
37*0e6b6b59SJacob Faibussowitsch   PetscIfPetscDefined(HAVE_CUDA, PETSC_CUPM_STATIC_VARIABLE_DEFN_EXACT, PetscExpandToNothing)(type_name, CUDA, ours); \
38*0e6b6b59SJacob Faibussowitsch   PetscIfPetscDefined(HAVE_HIP, PETSC_CUPM_STATIC_VARIABLE_DEFN_EXACT, PetscExpandToNothing)(type_name, HIP, ours)
39a4af0ceeSJacob Faibussowitsch 
4017f48955SJacob Faibussowitsch // if both cuda and hip agree on the same naming scheme i.e. cudaSuccess and hipSuccess:
4117f48955SJacob Faibussowitsch //
4217f48955SJacob Faibussowitsch // PETSC_CUPM_DEFINE_STATIC_VARIABLE_MATCHING_SCHEME(Success) ->
4317f48955SJacob Faibussowitsch // const decltype(cudaSuccess) Interface<DeviceType::CUDA>::cupmSuccess;
4417f48955SJacob Faibussowitsch // const decltype(hipSuccess)  Interface<DeviceType::HIP>::cupmSuccess;
459371c9d4SSatish 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))
46a4af0ceeSJacob Faibussowitsch 
47a4af0ceeSJacob Faibussowitsch // error codes
48*0e6b6b59SJacob Faibussowitsch PETSC_CUPM_DEFINE_STATIC_VARIABLE_VIA_CLASS_TYPENAME(cupmError_t, cupmSuccess);
49*0e6b6b59SJacob Faibussowitsch PETSC_CUPM_DEFINE_STATIC_VARIABLE_VIA_CLASS_TYPENAME(cupmError_t, cupmErrorNotReady);
50*0e6b6b59SJacob Faibussowitsch PETSC_CUPM_DEFINE_STATIC_VARIABLE_VIA_CLASS_TYPENAME(cupmError_t, cupmErrorSetOnActiveProcess);
51*0e6b6b59SJacob Faibussowitsch PETSC_CUPM_DEFINE_STATIC_VARIABLE_VIA_CLASS_TYPENAME(cupmError_t, cupmErrorNoDevice);
52*0e6b6b59SJacob Faibussowitsch PETSC_CUPM_DEFINE_STATIC_VARIABLE_VIA_CLASS_TYPENAME(cupmError_t, cupmErrorDeviceAlreadyInUse);
53*0e6b6b59SJacob Faibussowitsch PETSC_CUPM_DEFINE_STATIC_VARIABLE_VIA_CLASS_TYPENAME(cupmError_t, cupmErrorStubLibrary);
54a4af0ceeSJacob Faibussowitsch 
55a4af0ceeSJacob Faibussowitsch // enums
56*0e6b6b59SJacob Faibussowitsch PETSC_CUPM_DEFINE_STATIC_VARIABLE_MATCHING_SCHEME(StreamDefault);
57*0e6b6b59SJacob Faibussowitsch PETSC_CUPM_DEFINE_STATIC_VARIABLE_MATCHING_SCHEME(StreamNonBlocking);
58*0e6b6b59SJacob Faibussowitsch PETSC_CUPM_DEFINE_STATIC_VARIABLE_MATCHING_SCHEME(DeviceMapHost);
5917f48955SJacob Faibussowitsch 
60*0e6b6b59SJacob Faibussowitsch PETSC_CUPM_DEFINE_STATIC_VARIABLE_VIA_CLASS_TYPENAME(cupmMemcpyKind_t, cupmMemcpyHostToDevice);
61*0e6b6b59SJacob Faibussowitsch PETSC_CUPM_DEFINE_STATIC_VARIABLE_VIA_CLASS_TYPENAME(cupmMemcpyKind_t, cupmMemcpyDeviceToHost);
62*0e6b6b59SJacob Faibussowitsch PETSC_CUPM_DEFINE_STATIC_VARIABLE_VIA_CLASS_TYPENAME(cupmMemcpyKind_t, cupmMemcpyDeviceToDevice);
63*0e6b6b59SJacob Faibussowitsch PETSC_CUPM_DEFINE_STATIC_VARIABLE_VIA_CLASS_TYPENAME(cupmMemcpyKind_t, cupmMemcpyHostToHost);
64*0e6b6b59SJacob Faibussowitsch PETSC_CUPM_DEFINE_STATIC_VARIABLE_VIA_CLASS_TYPENAME(cupmMemcpyKind_t, cupmMemcpyDefault);
65*0e6b6b59SJacob Faibussowitsch PETSC_CUPM_DEFINE_STATIC_VARIABLE_VIA_CLASS_TYPENAME(cupmMemoryType_t, cupmMemoryTypeHost);
66*0e6b6b59SJacob Faibussowitsch PETSC_CUPM_DEFINE_STATIC_VARIABLE_VIA_CLASS_TYPENAME(cupmMemoryType_t, cupmMemoryTypeDevice);
67*0e6b6b59SJacob Faibussowitsch PETSC_CUPM_DEFINE_STATIC_VARIABLE_VIA_CLASS_TYPENAME(cupmMemoryType_t, cupmMemoryTypeManaged);
6817f48955SJacob Faibussowitsch 
69*0e6b6b59SJacob Faibussowitsch PETSC_CUPM_DEFINE_STATIC_VARIABLE_MATCHING_SCHEME(EventDisableTiming);
70*0e6b6b59SJacob Faibussowitsch PETSC_CUPM_DEFINE_STATIC_VARIABLE_VIA_EXACT_TYPENAME(int, cupmHostAllocDefault);
71*0e6b6b59SJacob Faibussowitsch PETSC_CUPM_DEFINE_STATIC_VARIABLE_VIA_EXACT_TYPENAME(int, cupmHostAllocWriteCombined);
7217f48955SJacob Faibussowitsch 
73*0e6b6b59SJacob Faibussowitsch PETSC_CUPM_DEFINE_STATIC_VARIABLE_VIA_CLASS_TYPENAME(cupmMemPoolAttr, cupmMemPoolAttrReleaseThreshold);
74*0e6b6b59SJacob Faibussowitsch 
75*0e6b6b59SJacob Faibussowitsch #if PetscDefined(HAVE_CUDA)
76*0e6b6b59SJacob Faibussowitsch template struct Interface<DeviceType::CUDA>;
77*0e6b6b59SJacob Faibussowitsch #endif
78*0e6b6b59SJacob Faibussowitsch #if PetscDefined(HAVE_HIP)
79*0e6b6b59SJacob Faibussowitsch template struct Interface<DeviceType::HIP>;
80*0e6b6b59SJacob Faibussowitsch #endif
81*0e6b6b59SJacob Faibussowitsch 
82*0e6b6b59SJacob Faibussowitsch } // namespace impl
83*0e6b6b59SJacob Faibussowitsch 
84*0e6b6b59SJacob Faibussowitsch } // namespace cupm
85*0e6b6b59SJacob Faibussowitsch 
86*0e6b6b59SJacob Faibussowitsch } // namespace device
87a4af0ceeSJacob Faibussowitsch 
88a4af0ceeSJacob Faibussowitsch } // namespace Petsc
89