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