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*9371c9d4SSatish Balay namespace Petsc { 9a4af0ceeSJacob Faibussowitsch 10*9371c9d4SSatish Balay namespace Device { 11a4af0ceeSJacob Faibussowitsch 12*9371c9d4SSatish Balay namespace CUPM { 13a4af0ceeSJacob Faibussowitsch 14*9371c9d4SSatish Balay namespace Impl { 15a4af0ceeSJacob Faibussowitsch 16*9371c9d4SSatish Balay #define PETSC_CUPM_STATIC_VARIABLE_DEFN(theirs, DEVICE, ours) const decltype(theirs) Interface<DeviceType::DEVICE>::ours; 17a4af0ceeSJacob Faibussowitsch 1817f48955SJacob Faibussowitsch // in case either one or the other don't agree on a name, you can specify all three here: 1917f48955SJacob Faibussowitsch // 2017f48955SJacob Faibussowitsch // PETSC_CUPM_DEFINE_STATIC_VARIABLE_EXACT(cudaSuccess, hipAllGood, cupmSuccess) -> 2117f48955SJacob Faibussowitsch // const decltype(cudaSuccess) Interface<DeviceType::CUDA>::cupmSuccess; 2217f48955SJacob Faibussowitsch // const decltype(hipAllGood) Interface<DeviceType::HIP>::cupmSuccess; 2317f48955SJacob Faibussowitsch #define PETSC_CUPM_DEFINE_STATIC_VARIABLE_EXACT(cuoriginal, hiporiginal, ours) \ 24*9371c9d4SSatish Balay PetscIfPetscDefined(HAVE_CUDA, PETSC_CUPM_STATIC_VARIABLE_DEFN, PetscExpandToNothing)(cuoriginal, CUDA, ours) PetscIfPetscDefined(HAVE_HIP, PETSC_CUPM_STATIC_VARIABLE_DEFN, PetscExpandToNothing)(hiporiginal, HIP, ours) 25a4af0ceeSJacob Faibussowitsch 2617f48955SJacob Faibussowitsch // if both cuda and hip agree on the same naming scheme i.e. cudaSuccess and hipSuccess: 2717f48955SJacob Faibussowitsch // 2817f48955SJacob Faibussowitsch // PETSC_CUPM_DEFINE_STATIC_VARIABLE_MATCHING_SCHEME(Success) -> 2917f48955SJacob Faibussowitsch // const decltype(cudaSuccess) Interface<DeviceType::CUDA>::cupmSuccess; 3017f48955SJacob Faibussowitsch // const decltype(hipSuccess) Interface<DeviceType::HIP>::cupmSuccess; 31*9371c9d4SSatish 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)) 32a4af0ceeSJacob Faibussowitsch 33a4af0ceeSJacob Faibussowitsch // error codes 3417f48955SJacob Faibussowitsch PETSC_CUPM_DEFINE_STATIC_VARIABLE_MATCHING_SCHEME(Success) 3517f48955SJacob Faibussowitsch PETSC_CUPM_DEFINE_STATIC_VARIABLE_MATCHING_SCHEME(ErrorNotReady) 3617f48955SJacob Faibussowitsch PETSC_CUPM_DEFINE_STATIC_VARIABLE_MATCHING_SCHEME(ErrorSetOnActiveProcess) 3717f48955SJacob Faibussowitsch PETSC_CUPM_DEFINE_STATIC_VARIABLE_MATCHING_SCHEME(ErrorNoDevice) 38a4af0ceeSJacob Faibussowitsch 39a4af0ceeSJacob Faibussowitsch // hip not conforming, see declaration in cupminterface.hpp 4017f48955SJacob Faibussowitsch PETSC_CUPM_DEFINE_STATIC_VARIABLE_EXACT(cudaErrorDeviceAlreadyInUse, hipErrorContextAlreadyInUse, cupmErrorDeviceAlreadyInUse) 41a4af0ceeSJacob Faibussowitsch 42a4af0ceeSJacob Faibussowitsch // hip not conforming, and cuda faffs around with versions see declaration in cupminterface.hpp 43a4af0ceeSJacob Faibussowitsch #if PetscDefined(HAVE_CUDA) 44a4af0ceeSJacob Faibussowitsch #if PETSC_PKG_CUDA_VERSION_GE(11, 1, 0) 45a4af0ceeSJacob Faibussowitsch #define PetscCudaErrorStubLibrary ErrorStubLibrary 46a4af0ceeSJacob Faibussowitsch #endif 47a4af0ceeSJacob Faibussowitsch #endif 48a4af0ceeSJacob Faibussowitsch 49e786d1e7SJacob Faibussowitsch #ifndef PetscCudaErrorStubLibrary 50a4af0ceeSJacob Faibussowitsch #define PetscCudaErrorStubLibrary ErrorInsufficientDriver 51a4af0ceeSJacob Faibussowitsch #endif 52e786d1e7SJacob Faibussowitsch 5317f48955SJacob Faibussowitsch PETSC_CUPM_DEFINE_STATIC_VARIABLE_EXACT(PetscConcat(cuda, PetscCudaErrorStubLibrary), hipErrorInsufficientDriver, cupmErrorStubLibrary) 54a4af0ceeSJacob Faibussowitsch 55a4af0ceeSJacob Faibussowitsch // enums 5617f48955SJacob Faibussowitsch PETSC_CUPM_DEFINE_STATIC_VARIABLE_MATCHING_SCHEME(StreamNonBlocking) 5717f48955SJacob Faibussowitsch PETSC_CUPM_DEFINE_STATIC_VARIABLE_MATCHING_SCHEME(DeviceMapHost) 5817f48955SJacob Faibussowitsch PETSC_CUPM_DEFINE_STATIC_VARIABLE_MATCHING_SCHEME(MemcpyHostToDevice) 5917f48955SJacob Faibussowitsch PETSC_CUPM_DEFINE_STATIC_VARIABLE_MATCHING_SCHEME(MemcpyDeviceToHost) 6017f48955SJacob Faibussowitsch PETSC_CUPM_DEFINE_STATIC_VARIABLE_MATCHING_SCHEME(MemcpyDeviceToDevice) 6117f48955SJacob Faibussowitsch PETSC_CUPM_DEFINE_STATIC_VARIABLE_MATCHING_SCHEME(MemcpyHostToHost) 6217f48955SJacob Faibussowitsch PETSC_CUPM_DEFINE_STATIC_VARIABLE_MATCHING_SCHEME(MemcpyDefault) 6317f48955SJacob Faibussowitsch 6417f48955SJacob Faibussowitsch } // namespace Impl 6517f48955SJacob Faibussowitsch 6617f48955SJacob Faibussowitsch } // namespace CUPM 6717f48955SJacob Faibussowitsch 6817f48955SJacob Faibussowitsch } // namespace Device 69a4af0ceeSJacob Faibussowitsch 70a4af0ceeSJacob Faibussowitsch } // namespace Petsc 71