xref: /petsc/src/sys/objects/device/impls/cupm/cupminterface.cxx (revision a4af0ceea8a251db97ee0dc5c0d52d4adf50264a)
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