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