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