1*a4af0ceeSJacob Faibussowitsch #include <petsc/private/cupminterface.hpp> 2*a4af0ceeSJacob Faibussowitsch 3*a4af0ceeSJacob Faibussowitsch // This file serves simply to store the definitions of all the static variables that we 4*a4af0ceeSJacob Faibussowitsch // DON'T have access to. Ones defined in PETSc-defined enum classes don't seem to have to 5*a4af0ceeSJacob Faibussowitsch // need this declaration... 6*a4af0ceeSJacob Faibussowitsch 7*a4af0ceeSJacob Faibussowitsch namespace Petsc 8*a4af0ceeSJacob Faibussowitsch { 9*a4af0ceeSJacob Faibussowitsch 10*a4af0ceeSJacob Faibussowitsch // do all of this with macros to enforce that both CUDA and HIP implementations both have 11*a4af0ceeSJacob Faibussowitsch // things defined. If you for example implement something on the HIP side but forget to 12*a4af0ceeSJacob Faibussowitsch // implement it on the CUDA side you'll get an error. 13*a4af0ceeSJacob Faibussowitsch 14*a4af0ceeSJacob Faibussowitsch // need these for the indirection when building the if_0 and if_1 variants of the macro 15*a4af0ceeSJacob Faibussowitsch #define CAT_(x,y) x ## y 16*a4af0ceeSJacob Faibussowitsch #define CAT(x,y) CAT_(x,y) 17*a4af0ceeSJacob Faibussowitsch 18*a4af0ceeSJacob Faibussowitsch #define PETSC_CUPM_DEFINE_STATIC_VARIABLE_IF_HAVE_EXACT_0(PREFIX,original,mapped) 19*a4af0ceeSJacob Faibussowitsch #define PETSC_CUPM_DEFINE_STATIC_VARIABLE_IF_HAVE_EXACT_1(PREFIX,original,mapped) \ 20*a4af0ceeSJacob Faibussowitsch const decltype(original) CUPMInterface<CUPMDeviceType::PREFIX>::mapped 21*a4af0ceeSJacob Faibussowitsch 22*a4af0ceeSJacob Faibussowitsch #define PETSC_CUPM_DEFINE_STATIC_VARIABLE_IF_HAVE_EXACT(HAVE,PREFIX,orginal,mapped) \ 23*a4af0ceeSJacob Faibussowitsch CAT(PETSC_CUPM_DEFINE_STATIC_VARIABLE_IF_HAVE_EXACT_,HAVE)(PREFIX,orginal,mapped) 24*a4af0ceeSJacob Faibussowitsch 25*a4af0ceeSJacob Faibussowitsch #define PETSC_CUPM_DEFINE_STATIC_VARIABLE_EXACT_(PREFIX,orginal,mapped) \ 26*a4af0ceeSJacob Faibussowitsch PETSC_CUPM_DEFINE_STATIC_VARIABLE_IF_HAVE_EXACT(PetscDefined(HAVE_ ## PREFIX),PREFIX,orginal,mapped) 27*a4af0ceeSJacob Faibussowitsch 28*a4af0ceeSJacob Faibussowitsch // in case either one or the other don't agree on a name, you can specify all three here 29*a4af0ceeSJacob Faibussowitsch #define PETSC_CUPM_DEFINE_STATIC_VARIABLE_EXACT(cuoriginal,hiporiginal,mapped) \ 30*a4af0ceeSJacob Faibussowitsch PETSC_CUPM_DEFINE_STATIC_VARIABLE_EXACT_(CUDA,CAT(cuda,cuoriginal),CAT(cupm,mapped)); \ 31*a4af0ceeSJacob Faibussowitsch PETSC_CUPM_DEFINE_STATIC_VARIABLE_EXACT_(HIP,CAT(hip,hiporiginal),CAT(cupm,mapped)) 32*a4af0ceeSJacob Faibussowitsch 33*a4af0ceeSJacob Faibussowitsch // if both cuda and hip agree on the same name 34*a4af0ceeSJacob Faibussowitsch #define PETSC_CUPM_DEFINE_STATIC_VARIABLE(stem) \ 35*a4af0ceeSJacob Faibussowitsch PETSC_CUPM_DEFINE_STATIC_VARIABLE_EXACT(stem,stem,stem) 36*a4af0ceeSJacob Faibussowitsch 37*a4af0ceeSJacob Faibussowitsch // error codes 38*a4af0ceeSJacob Faibussowitsch PETSC_CUPM_DEFINE_STATIC_VARIABLE(Success); 39*a4af0ceeSJacob Faibussowitsch PETSC_CUPM_DEFINE_STATIC_VARIABLE(ErrorNotReady); 40*a4af0ceeSJacob Faibussowitsch PETSC_CUPM_DEFINE_STATIC_VARIABLE(ErrorSetOnActiveProcess); 41*a4af0ceeSJacob Faibussowitsch 42*a4af0ceeSJacob Faibussowitsch // hip not conforming, see declaration in cupminterface.hpp 43*a4af0ceeSJacob Faibussowitsch PETSC_CUPM_DEFINE_STATIC_VARIABLE_EXACT(ErrorDeviceAlreadyInUse,ErrorContextAlreadyInUse,ErrorDeviceAlreadyInUse); 44*a4af0ceeSJacob Faibussowitsch 45*a4af0ceeSJacob Faibussowitsch // hip not conforming, and cuda faffs around with versions see declaration in cupminterface.hpp 46*a4af0ceeSJacob Faibussowitsch #if PetscDefined(HAVE_CUDA) 47*a4af0ceeSJacob Faibussowitsch # if PETSC_PKG_CUDA_VERSION_GE(11,1,0) 48*a4af0ceeSJacob Faibussowitsch # define PetscCudaErrorStubLibrary ErrorStubLibrary 49*a4af0ceeSJacob Faibussowitsch # endif 50*a4af0ceeSJacob Faibussowitsch #endif 51*a4af0ceeSJacob Faibussowitsch 52*a4af0ceeSJacob Faibussowitsch #if !defined(petscCudaErrStubLib) 53*a4af0ceeSJacob Faibussowitsch # define PetscCudaErrorStubLibrary ErrorInsufficientDriver 54*a4af0ceeSJacob Faibussowitsch #endif 55*a4af0ceeSJacob Faibussowitsch PETSC_CUPM_DEFINE_STATIC_VARIABLE_EXACT(PetscCudaErrorStubLibrary,ErrorInsufficientDriver,ErrorStubLibrary); 56*a4af0ceeSJacob Faibussowitsch 57*a4af0ceeSJacob Faibussowitsch // enums 58*a4af0ceeSJacob Faibussowitsch PETSC_CUPM_DEFINE_STATIC_VARIABLE(StreamNonBlocking); 59*a4af0ceeSJacob Faibussowitsch PETSC_CUPM_DEFINE_STATIC_VARIABLE(DeviceMapHost); 60*a4af0ceeSJacob Faibussowitsch PETSC_CUPM_DEFINE_STATIC_VARIABLE(MemcpyHostToDevice); 61*a4af0ceeSJacob Faibussowitsch 62*a4af0ceeSJacob Faibussowitsch } // namespace Petsc 63