1 #include <petsc/private/cupmblasinterface.hpp> 2 3 namespace Petsc 4 { 5 6 namespace device 7 { 8 9 namespace cupm 10 { 11 12 namespace impl 13 { 14 15 #define PETSC_CUPMBLAS_STATIC_VARIABLE_DEFN(THEIRS, DEVICE, OURS) const decltype(THEIRS) BlasInterfaceImpl<DeviceType::DEVICE>::OURS; 16 17 // in case either one or the other don't agree on a name, you can specify all three here: 18 // 19 // PETSC_CUPMBLAS_DEFINE_STATIC_VARIABLE_EXACT(CUBLAS_STATUS_SUCCESS, rocblas_status_success, 20 // CUPMBLAS_STATUS_SUCCESS) -> 21 // const decltype(CUBLAS_STATUS_SUCCESS) BlasInterface<DeviceType::CUDA>::CUPMBLAS_STATUS_SUCCESS; 22 // const decltype(rocblas_status_success) BlasInterface<DeviceType::HIP>::CUPMBLAS_STATUS_SUCCESS; 23 #define PETSC_CUPMBLAS_DEFINE_STATIC_VARIABLE_EXACT(CUORIGINAL, HIPORIGINAL, OURS) \ 24 PetscIfPetscDefined(HAVE_CUDA, PETSC_CUPMBLAS_STATIC_VARIABLE_DEFN, PetscExpandToNothing)(CUORIGINAL, CUDA, OURS) PetscIfPetscDefined(HAVE_HIP, PETSC_CUPMBLAS_STATIC_VARIABLE_DEFN, PetscExpandToNothing)(HIPORIGINAL, HIP, OURS) 25 26 // if both cuda and hip agree on the same naming scheme i.e. CUBLAS_STATUS_SUCCESS and 27 // HIPBLAS_STATUS_SUCCESS: 28 // 29 // PETSC_CUPMBLAS_DEFINE_STATIC_VARIABLE_MATCHING_PREFIX(STATUS_SUCCESS) -> 30 // const decltype(CUBLAS_STATUS_SUCCESS) BlasInterface<DeviceType::CUDA>::CUPMBLAS_STATUS_SUCCESS; 31 // const decltype(HIPBLAS_STATUS_SUCCESS) BlasInterface<DeviceType::HIP>::CUPMBLAS_STATUS_SUCCESS; 32 #define PETSC_CUPMBLAS_DEFINE_STATIC_VARIABLE_MATCHING_SCHEME(SUFFIX) PETSC_CUPMBLAS_DEFINE_STATIC_VARIABLE_EXACT(PetscConcat(CUBLAS_, SUFFIX), PetscConcat(HIPBLAS_, SUFFIX), PetscConcat(CUPMBLAS_, SUFFIX)) 33 34 PETSC_CUPMBLAS_DEFINE_STATIC_VARIABLE_MATCHING_SCHEME(STATUS_SUCCESS) 35 PETSC_CUPMBLAS_DEFINE_STATIC_VARIABLE_MATCHING_SCHEME(STATUS_NOT_INITIALIZED) 36 PETSC_CUPMBLAS_DEFINE_STATIC_VARIABLE_MATCHING_SCHEME(STATUS_ALLOC_FAILED) 37 PETSC_CUPMBLAS_DEFINE_STATIC_VARIABLE_MATCHING_SCHEME(POINTER_MODE_HOST) 38 PETSC_CUPMBLAS_DEFINE_STATIC_VARIABLE_MATCHING_SCHEME(POINTER_MODE_DEVICE) 39 40 #if PetscDefined(HAVE_CUDA) 41 template struct BlasInterface<DeviceType::CUDA>; 42 #endif 43 44 #if PetscDefined(HAVE_HIP) 45 template struct BlasInterface<DeviceType::HIP>; 46 #endif 47 48 } // namespace impl 49 50 } // namespace cupm 51 52 } // namespace device 53 54 } // namespace Petsc 55