#include #include // This file serves simply to store the definitions of all the static variables that we // DON'T have access to. Ones defined in PETSc-defined enum classes don't seem to have to // need this declaration... namespace Petsc { namespace Device { namespace CUPM { namespace Impl { #define PETSC_CUPM_STATIC_VARIABLE_DEFN(theirs,DEVICE,ours) \ const decltype(theirs) Interface::ours; // in case either one or the other don't agree on a name, you can specify all three here: // // PETSC_CUPM_DEFINE_STATIC_VARIABLE_EXACT(cudaSuccess, hipAllGood, cupmSuccess) -> // const decltype(cudaSuccess) Interface::cupmSuccess; // const decltype(hipAllGood) Interface::cupmSuccess; #define PETSC_CUPM_DEFINE_STATIC_VARIABLE_EXACT(cuoriginal,hiporiginal,ours) \ PetscIfPetscDefined(HAVE_CUDA,PETSC_CUPM_STATIC_VARIABLE_DEFN,PetscExpandToNothing)(cuoriginal,CUDA,ours) \ PetscIfPetscDefined(HAVE_HIP,PETSC_CUPM_STATIC_VARIABLE_DEFN,PetscExpandToNothing)(hiporiginal,HIP,ours) // if both cuda and hip agree on the same naming scheme i.e. cudaSuccess and hipSuccess: // // PETSC_CUPM_DEFINE_STATIC_VARIABLE_MATCHING_SCHEME(Success) -> // const decltype(cudaSuccess) Interface::cupmSuccess; // const decltype(hipSuccess) Interface::cupmSuccess; #define PETSC_CUPM_DEFINE_STATIC_VARIABLE_MATCHING_SCHEME(suffix) \ PETSC_CUPM_DEFINE_STATIC_VARIABLE_EXACT(PetscConcat(cuda,suffix),PetscConcat(hip,suffix),PetscConcat(cupm,suffix)) // error codes PETSC_CUPM_DEFINE_STATIC_VARIABLE_MATCHING_SCHEME(Success) PETSC_CUPM_DEFINE_STATIC_VARIABLE_MATCHING_SCHEME(ErrorNotReady) PETSC_CUPM_DEFINE_STATIC_VARIABLE_MATCHING_SCHEME(ErrorSetOnActiveProcess) PETSC_CUPM_DEFINE_STATIC_VARIABLE_MATCHING_SCHEME(ErrorNoDevice) // hip not conforming, see declaration in cupminterface.hpp PETSC_CUPM_DEFINE_STATIC_VARIABLE_EXACT(cudaErrorDeviceAlreadyInUse,hipErrorContextAlreadyInUse,cupmErrorDeviceAlreadyInUse) // hip not conforming, and cuda faffs around with versions see declaration in cupminterface.hpp #if PetscDefined(HAVE_CUDA) # if PETSC_PKG_CUDA_VERSION_GE(11,1,0) # define PetscCudaErrorStubLibrary ErrorStubLibrary # endif #endif #ifndef PetscCudaErrorStubLibrary #define PetscCudaErrorStubLibrary ErrorInsufficientDriver #endif PETSC_CUPM_DEFINE_STATIC_VARIABLE_EXACT(PetscConcat(cuda,PetscCudaErrorStubLibrary),hipErrorInsufficientDriver,cupmErrorStubLibrary) // enums PETSC_CUPM_DEFINE_STATIC_VARIABLE_MATCHING_SCHEME(StreamNonBlocking) PETSC_CUPM_DEFINE_STATIC_VARIABLE_MATCHING_SCHEME(DeviceMapHost) PETSC_CUPM_DEFINE_STATIC_VARIABLE_MATCHING_SCHEME(MemcpyHostToDevice) PETSC_CUPM_DEFINE_STATIC_VARIABLE_MATCHING_SCHEME(MemcpyDeviceToHost) PETSC_CUPM_DEFINE_STATIC_VARIABLE_MATCHING_SCHEME(MemcpyDeviceToDevice) PETSC_CUPM_DEFINE_STATIC_VARIABLE_MATCHING_SCHEME(MemcpyHostToHost) PETSC_CUPM_DEFINE_STATIC_VARIABLE_MATCHING_SCHEME(MemcpyDefault) } // namespace Impl } // namespace CUPM } // namespace Device } // namespace Petsc