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