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