117f48955SJacob Faibussowitsch #include <petsc/private/cupmblasinterface.hpp> 2*96a4b4d9SJacob Faibussowitsch #include <petsc/private/petscadvancedmacros.h> 317f48955SJacob Faibussowitsch 4d71ae5a4SJacob Faibussowitsch namespace Petsc 5d71ae5a4SJacob Faibussowitsch { 617f48955SJacob Faibussowitsch 7d71ae5a4SJacob Faibussowitsch namespace device 8d71ae5a4SJacob Faibussowitsch { 917f48955SJacob Faibussowitsch 10d71ae5a4SJacob Faibussowitsch namespace cupm 11d71ae5a4SJacob Faibussowitsch { 1217f48955SJacob Faibussowitsch 13d71ae5a4SJacob Faibussowitsch namespace impl 14d71ae5a4SJacob Faibussowitsch { 1517f48955SJacob Faibussowitsch 160e6b6b59SJacob Faibussowitsch #define PETSC_CUPMBLAS_STATIC_VARIABLE_DEFN(THEIRS, DEVICE, OURS) const decltype(THEIRS) BlasInterfaceImpl<DeviceType::DEVICE>::OURS; 1717f48955SJacob 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_CUPMBLAS_DEFINE_STATIC_VARIABLE_EXACT(CUBLAS_STATUS_SUCCESS, rocblas_status_success, 2117f48955SJacob Faibussowitsch // CUPMBLAS_STATUS_SUCCESS) -> 2217f48955SJacob Faibussowitsch // const decltype(CUBLAS_STATUS_SUCCESS) BlasInterface<DeviceType::CUDA>::CUPMBLAS_STATUS_SUCCESS; 2317f48955SJacob Faibussowitsch // const decltype(rocblas_status_success) BlasInterface<DeviceType::HIP>::CUPMBLAS_STATUS_SUCCESS; 2417f48955SJacob Faibussowitsch #define PETSC_CUPMBLAS_DEFINE_STATIC_VARIABLE_EXACT(CUORIGINAL, HIPORIGINAL, OURS) \ 259371c9d4SSatish Balay PetscIfPetscDefined(HAVE_CUDA, PETSC_CUPMBLAS_STATIC_VARIABLE_DEFN, PetscExpandToNothing)(CUORIGINAL, CUDA, OURS) PetscIfPetscDefined(HAVE_HIP, PETSC_CUPMBLAS_STATIC_VARIABLE_DEFN, PetscExpandToNothing)(HIPORIGINAL, HIP, OURS) 2617f48955SJacob Faibussowitsch 2717f48955SJacob Faibussowitsch // if both cuda and hip agree on the same naming scheme i.e. CUBLAS_STATUS_SUCCESS and 2817f48955SJacob Faibussowitsch // HIPBLAS_STATUS_SUCCESS: 2917f48955SJacob Faibussowitsch // 3017f48955SJacob Faibussowitsch // PETSC_CUPMBLAS_DEFINE_STATIC_VARIABLE_MATCHING_PREFIX(STATUS_SUCCESS) -> 3117f48955SJacob Faibussowitsch // const decltype(CUBLAS_STATUS_SUCCESS) BlasInterface<DeviceType::CUDA>::CUPMBLAS_STATUS_SUCCESS; 3217f48955SJacob Faibussowitsch // const decltype(HIPBLAS_STATUS_SUCCESS) BlasInterface<DeviceType::HIP>::CUPMBLAS_STATUS_SUCCESS; 339371c9d4SSatish Balay #define PETSC_CUPMBLAS_DEFINE_STATIC_VARIABLE_MATCHING_SCHEME(SUFFIX) PETSC_CUPMBLAS_DEFINE_STATIC_VARIABLE_EXACT(PetscConcat(CUBLAS_, SUFFIX), PetscConcat(HIPBLAS_, SUFFIX), PetscConcat(CUPMBLAS_, SUFFIX)) 3417f48955SJacob Faibussowitsch 3517f48955SJacob Faibussowitsch PETSC_CUPMBLAS_DEFINE_STATIC_VARIABLE_MATCHING_SCHEME(STATUS_SUCCESS) 3617f48955SJacob Faibussowitsch PETSC_CUPMBLAS_DEFINE_STATIC_VARIABLE_MATCHING_SCHEME(STATUS_NOT_INITIALIZED) 3717f48955SJacob Faibussowitsch PETSC_CUPMBLAS_DEFINE_STATIC_VARIABLE_MATCHING_SCHEME(STATUS_ALLOC_FAILED) 380e6b6b59SJacob Faibussowitsch PETSC_CUPMBLAS_DEFINE_STATIC_VARIABLE_MATCHING_SCHEME(POINTER_MODE_HOST) 390e6b6b59SJacob Faibussowitsch PETSC_CUPMBLAS_DEFINE_STATIC_VARIABLE_MATCHING_SCHEME(POINTER_MODE_DEVICE) 40*96a4b4d9SJacob Faibussowitsch PETSC_CUPMBLAS_DEFINE_STATIC_VARIABLE_MATCHING_SCHEME(OP_T) 41*96a4b4d9SJacob Faibussowitsch PETSC_CUPMBLAS_DEFINE_STATIC_VARIABLE_MATCHING_SCHEME(OP_N) 42*96a4b4d9SJacob Faibussowitsch PETSC_CUPMBLAS_DEFINE_STATIC_VARIABLE_MATCHING_SCHEME(OP_C) 43*96a4b4d9SJacob Faibussowitsch PETSC_CUPMBLAS_DEFINE_STATIC_VARIABLE_MATCHING_SCHEME(FILL_MODE_LOWER) 44*96a4b4d9SJacob Faibussowitsch PETSC_CUPMBLAS_DEFINE_STATIC_VARIABLE_MATCHING_SCHEME(FILL_MODE_UPPER) 45*96a4b4d9SJacob Faibussowitsch PETSC_CUPMBLAS_DEFINE_STATIC_VARIABLE_MATCHING_SCHEME(SIDE_LEFT) 46*96a4b4d9SJacob Faibussowitsch PETSC_CUPMBLAS_DEFINE_STATIC_VARIABLE_MATCHING_SCHEME(DIAG_NON_UNIT) 4717f48955SJacob Faibussowitsch 480e6b6b59SJacob Faibussowitsch #if PetscDefined(HAVE_CUDA) 490e6b6b59SJacob Faibussowitsch template struct BlasInterface<DeviceType::CUDA>; 500e6b6b59SJacob Faibussowitsch #endif 5117f48955SJacob Faibussowitsch 520e6b6b59SJacob Faibussowitsch #if PetscDefined(HAVE_HIP) 530e6b6b59SJacob Faibussowitsch template struct BlasInterface<DeviceType::HIP>; 540e6b6b59SJacob Faibussowitsch #endif 5517f48955SJacob Faibussowitsch 560e6b6b59SJacob Faibussowitsch } // namespace impl 570e6b6b59SJacob Faibussowitsch 580e6b6b59SJacob Faibussowitsch } // namespace cupm 590e6b6b59SJacob Faibussowitsch 600e6b6b59SJacob Faibussowitsch } // namespace device 6117f48955SJacob Faibussowitsch 6217f48955SJacob Faibussowitsch } // namespace Petsc 63