1a4af0ceeSJacob Faibussowitsch #include <petsc/private/cupminterface.hpp> 2*17f48955SJacob 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 8a4af0ceeSJacob Faibussowitsch namespace Petsc 9a4af0ceeSJacob Faibussowitsch { 10a4af0ceeSJacob Faibussowitsch 11*17f48955SJacob Faibussowitsch namespace Device 12*17f48955SJacob Faibussowitsch { 13a4af0ceeSJacob Faibussowitsch 14*17f48955SJacob Faibussowitsch namespace CUPM 15*17f48955SJacob Faibussowitsch { 16a4af0ceeSJacob Faibussowitsch 17*17f48955SJacob Faibussowitsch namespace Impl 18*17f48955SJacob Faibussowitsch { 19a4af0ceeSJacob Faibussowitsch 20*17f48955SJacob Faibussowitsch #define PETSC_CUPM_STATIC_VARIABLE_DEFN(theirs,DEVICE,ours) \ 21*17f48955SJacob Faibussowitsch const decltype(theirs) Interface<DeviceType::DEVICE>::ours; 22a4af0ceeSJacob Faibussowitsch 23*17f48955SJacob Faibussowitsch // in case either one or the other don't agree on a name, you can specify all three here: 24*17f48955SJacob Faibussowitsch // 25*17f48955SJacob Faibussowitsch // PETSC_CUPM_DEFINE_STATIC_VARIABLE_EXACT(cudaSuccess, hipAllGood, cupmSuccess) -> 26*17f48955SJacob Faibussowitsch // const decltype(cudaSuccess) Interface<DeviceType::CUDA>::cupmSuccess; 27*17f48955SJacob Faibussowitsch // const decltype(hipAllGood) Interface<DeviceType::HIP>::cupmSuccess; 28*17f48955SJacob Faibussowitsch #define PETSC_CUPM_DEFINE_STATIC_VARIABLE_EXACT(cuoriginal,hiporiginal,ours) \ 29*17f48955SJacob Faibussowitsch PetscIfPetscDefined(HAVE_CUDA,PETSC_CUPM_STATIC_VARIABLE_DEFN,PetscExpandToNothing)(cuoriginal,CUDA,ours) \ 30*17f48955SJacob Faibussowitsch PetscIfPetscDefined(HAVE_HIP,PETSC_CUPM_STATIC_VARIABLE_DEFN,PetscExpandToNothing)(hiporiginal,HIP,ours) 31a4af0ceeSJacob Faibussowitsch 32*17f48955SJacob Faibussowitsch // if both cuda and hip agree on the same naming scheme i.e. cudaSuccess and hipSuccess: 33*17f48955SJacob Faibussowitsch // 34*17f48955SJacob Faibussowitsch // PETSC_CUPM_DEFINE_STATIC_VARIABLE_MATCHING_SCHEME(Success) -> 35*17f48955SJacob Faibussowitsch // const decltype(cudaSuccess) Interface<DeviceType::CUDA>::cupmSuccess; 36*17f48955SJacob Faibussowitsch // const decltype(hipSuccess) Interface<DeviceType::HIP>::cupmSuccess; 37*17f48955SJacob Faibussowitsch #define PETSC_CUPM_DEFINE_STATIC_VARIABLE_MATCHING_SCHEME(suffix) \ 38*17f48955SJacob Faibussowitsch PETSC_CUPM_DEFINE_STATIC_VARIABLE_EXACT(PetscConcat(cuda,suffix),PetscConcat(hip,suffix),PetscConcat(cupm,suffix)) 39a4af0ceeSJacob Faibussowitsch 40a4af0ceeSJacob Faibussowitsch // error codes 41*17f48955SJacob Faibussowitsch PETSC_CUPM_DEFINE_STATIC_VARIABLE_MATCHING_SCHEME(Success) 42*17f48955SJacob Faibussowitsch PETSC_CUPM_DEFINE_STATIC_VARIABLE_MATCHING_SCHEME(ErrorNotReady) 43*17f48955SJacob Faibussowitsch PETSC_CUPM_DEFINE_STATIC_VARIABLE_MATCHING_SCHEME(ErrorSetOnActiveProcess) 44*17f48955SJacob Faibussowitsch PETSC_CUPM_DEFINE_STATIC_VARIABLE_MATCHING_SCHEME(ErrorNoDevice) 45a4af0ceeSJacob Faibussowitsch 46a4af0ceeSJacob Faibussowitsch // hip not conforming, see declaration in cupminterface.hpp 47*17f48955SJacob Faibussowitsch PETSC_CUPM_DEFINE_STATIC_VARIABLE_EXACT(cudaErrorDeviceAlreadyInUse,hipErrorContextAlreadyInUse,cupmErrorDeviceAlreadyInUse) 48a4af0ceeSJacob Faibussowitsch 49a4af0ceeSJacob Faibussowitsch // hip not conforming, and cuda faffs around with versions see declaration in cupminterface.hpp 50a4af0ceeSJacob Faibussowitsch #if PetscDefined(HAVE_CUDA) 51a4af0ceeSJacob Faibussowitsch # if PETSC_PKG_CUDA_VERSION_GE(11,1,0) 52a4af0ceeSJacob Faibussowitsch # define PetscCudaErrorStubLibrary ErrorStubLibrary 53a4af0ceeSJacob Faibussowitsch # endif 54a4af0ceeSJacob Faibussowitsch #endif 55a4af0ceeSJacob Faibussowitsch 56e786d1e7SJacob Faibussowitsch #ifndef PetscCudaErrorStubLibrary 57a4af0ceeSJacob Faibussowitsch #define PetscCudaErrorStubLibrary ErrorInsufficientDriver 58a4af0ceeSJacob Faibussowitsch #endif 59e786d1e7SJacob Faibussowitsch 60*17f48955SJacob Faibussowitsch PETSC_CUPM_DEFINE_STATIC_VARIABLE_EXACT(PetscConcat(cuda,PetscCudaErrorStubLibrary),hipErrorInsufficientDriver,cupmErrorStubLibrary) 61a4af0ceeSJacob Faibussowitsch 62a4af0ceeSJacob Faibussowitsch // enums 63*17f48955SJacob Faibussowitsch PETSC_CUPM_DEFINE_STATIC_VARIABLE_MATCHING_SCHEME(StreamNonBlocking) 64*17f48955SJacob Faibussowitsch PETSC_CUPM_DEFINE_STATIC_VARIABLE_MATCHING_SCHEME(DeviceMapHost) 65*17f48955SJacob Faibussowitsch PETSC_CUPM_DEFINE_STATIC_VARIABLE_MATCHING_SCHEME(MemcpyHostToDevice) 66*17f48955SJacob Faibussowitsch PETSC_CUPM_DEFINE_STATIC_VARIABLE_MATCHING_SCHEME(MemcpyDeviceToHost) 67*17f48955SJacob Faibussowitsch PETSC_CUPM_DEFINE_STATIC_VARIABLE_MATCHING_SCHEME(MemcpyDeviceToDevice) 68*17f48955SJacob Faibussowitsch PETSC_CUPM_DEFINE_STATIC_VARIABLE_MATCHING_SCHEME(MemcpyHostToHost) 69*17f48955SJacob Faibussowitsch PETSC_CUPM_DEFINE_STATIC_VARIABLE_MATCHING_SCHEME(MemcpyDefault) 70*17f48955SJacob Faibussowitsch 71*17f48955SJacob Faibussowitsch } // namespace Impl 72*17f48955SJacob Faibussowitsch 73*17f48955SJacob Faibussowitsch } // namespace CUPM 74*17f48955SJacob Faibussowitsch 75*17f48955SJacob Faibussowitsch } // namespace Device 76a4af0ceeSJacob Faibussowitsch 77a4af0ceeSJacob Faibussowitsch } // namespace Petsc 78