Actual source code: cupminterface.cxx

  1: #include <petsc/private/cupminterface.hpp>
  2: #include <petsc/private/petscadvancedmacros.h>

  4: // This file serves simply to store the definitions of all the static variables that we
  5: // DON'T have access to. Ones defined in PETSc-defined enum classes don't seem to have to
  6: // need this declaration...

  8: namespace Petsc
  9: {

 11: namespace Device
 12: {

 14: namespace CUPM
 15: {

 17: namespace Impl
 18: {

 20: #define PETSC_CUPM_STATIC_VARIABLE_DEFN(theirs,DEVICE,ours)     \
 21:   const decltype(theirs) Interface<DeviceType::DEVICE>::ours;

 23: // in case either one or the other don't agree on a name, you can specify all three here:
 24: //
 25: // PETSC_CUPM_DEFINE_STATIC_VARIABLE_EXACT(cudaSuccess, hipAllGood, cupmSuccess) ->
 26: // const decltype(cudaSuccess) Interface<DeviceType::CUDA>::cupmSuccess;
 27: // const decltype(hipAllGood)  Interface<DeviceType::HIP>::cupmSuccess;
 28: #define PETSC_CUPM_DEFINE_STATIC_VARIABLE_EXACT(cuoriginal,hiporiginal,ours) \
 29:   PetscIfPetscDefined(HAVE_CUDA,PETSC_CUPM_STATIC_VARIABLE_DEFN,PetscExpandToNothing)(cuoriginal,CUDA,ours) \
 30:   PetscIfPetscDefined(HAVE_HIP,PETSC_CUPM_STATIC_VARIABLE_DEFN,PetscExpandToNothing)(hiporiginal,HIP,ours)

 32: // if both cuda and hip agree on the same naming scheme i.e. cudaSuccess and hipSuccess:
 33: //
 34: // PETSC_CUPM_DEFINE_STATIC_VARIABLE_MATCHING_SCHEME(Success) ->
 35: // const decltype(cudaSuccess) Interface<DeviceType::CUDA>::cupmSuccess;
 36: // const decltype(hipSuccess)  Interface<DeviceType::HIP>::cupmSuccess;
 37: #define PETSC_CUPM_DEFINE_STATIC_VARIABLE_MATCHING_SCHEME(suffix)         \
 38:   PETSC_CUPM_DEFINE_STATIC_VARIABLE_EXACT(PetscConcat(cuda,suffix),PetscConcat(hip,suffix),PetscConcat(cupm,suffix))

 40: // error codes
 41: PETSC_CUPM_DEFINE_STATIC_VARIABLE_MATCHING_SCHEME(Success)
 42: PETSC_CUPM_DEFINE_STATIC_VARIABLE_MATCHING_SCHEME(ErrorNotReady)
 43: PETSC_CUPM_DEFINE_STATIC_VARIABLE_MATCHING_SCHEME(ErrorSetOnActiveProcess)
 44: PETSC_CUPM_DEFINE_STATIC_VARIABLE_MATCHING_SCHEME(ErrorNoDevice)

 46: // hip not conforming, see declaration in cupminterface.hpp
 47: PETSC_CUPM_DEFINE_STATIC_VARIABLE_EXACT(cudaErrorDeviceAlreadyInUse,hipErrorContextAlreadyInUse,cupmErrorDeviceAlreadyInUse)

 49: // hip not conforming, and cuda faffs around with versions see declaration in cupminterface.hpp
 50: #if PetscDefined(HAVE_CUDA)
 51: #  if PETSC_PKG_CUDA_VERSION_GE(11,1,0)
 52: #    define PetscCudaErrorStubLibrary ErrorStubLibrary
 53: #  endif
 54: #endif

 56: #ifndef PetscCudaErrorStubLibrary
 57: #define PetscCudaErrorStubLibrary ErrorInsufficientDriver
 58: #endif

 60: PETSC_CUPM_DEFINE_STATIC_VARIABLE_EXACT(PetscConcat(cuda,PetscCudaErrorStubLibrary),hipErrorInsufficientDriver,cupmErrorStubLibrary)

 62: // enums
 63: PETSC_CUPM_DEFINE_STATIC_VARIABLE_MATCHING_SCHEME(StreamNonBlocking)
 64: PETSC_CUPM_DEFINE_STATIC_VARIABLE_MATCHING_SCHEME(DeviceMapHost)
 65: PETSC_CUPM_DEFINE_STATIC_VARIABLE_MATCHING_SCHEME(MemcpyHostToDevice)
 66: PETSC_CUPM_DEFINE_STATIC_VARIABLE_MATCHING_SCHEME(MemcpyDeviceToHost)
 67: PETSC_CUPM_DEFINE_STATIC_VARIABLE_MATCHING_SCHEME(MemcpyDeviceToDevice)
 68: PETSC_CUPM_DEFINE_STATIC_VARIABLE_MATCHING_SCHEME(MemcpyHostToHost)
 69: PETSC_CUPM_DEFINE_STATIC_VARIABLE_MATCHING_SCHEME(MemcpyDefault)

 71: } // namespace Impl

 73: } // namespace CUPM

 75: } // namespace Device

 77: } // namespace Petsc