xref: /petsc/src/sys/objects/device/impls/cupm/cupmblasinterface.cxx (revision d71ae5a4db6382e7f06317b8d368875286fe9008)
117f48955SJacob Faibussowitsch #include <petsc/private/cupmblasinterface.hpp>
217f48955SJacob Faibussowitsch 
3*d71ae5a4SJacob Faibussowitsch namespace Petsc
4*d71ae5a4SJacob Faibussowitsch {
517f48955SJacob Faibussowitsch 
6*d71ae5a4SJacob Faibussowitsch namespace device
7*d71ae5a4SJacob Faibussowitsch {
817f48955SJacob Faibussowitsch 
9*d71ae5a4SJacob Faibussowitsch namespace cupm
10*d71ae5a4SJacob Faibussowitsch {
1117f48955SJacob Faibussowitsch 
12*d71ae5a4SJacob Faibussowitsch namespace impl
13*d71ae5a4SJacob Faibussowitsch {
1417f48955SJacob Faibussowitsch 
150e6b6b59SJacob Faibussowitsch #define PETSC_CUPMBLAS_STATIC_VARIABLE_DEFN(THEIRS, DEVICE, OURS) const decltype(THEIRS) BlasInterfaceImpl<DeviceType::DEVICE>::OURS;
1617f48955SJacob Faibussowitsch 
1717f48955SJacob Faibussowitsch // in case either one or the other don't agree on a name, you can specify all three here:
1817f48955SJacob Faibussowitsch //
1917f48955SJacob Faibussowitsch // PETSC_CUPMBLAS_DEFINE_STATIC_VARIABLE_EXACT(CUBLAS_STATUS_SUCCESS, rocblas_status_success,
2017f48955SJacob Faibussowitsch // CUPMBLAS_STATUS_SUCCESS) ->
2117f48955SJacob Faibussowitsch // const decltype(CUBLAS_STATUS_SUCCESS)  BlasInterface<DeviceType::CUDA>::CUPMBLAS_STATUS_SUCCESS;
2217f48955SJacob Faibussowitsch // const decltype(rocblas_status_success) BlasInterface<DeviceType::HIP>::CUPMBLAS_STATUS_SUCCESS;
2317f48955SJacob Faibussowitsch #define PETSC_CUPMBLAS_DEFINE_STATIC_VARIABLE_EXACT(CUORIGINAL, HIPORIGINAL, OURS) \
249371c9d4SSatish 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)
2517f48955SJacob Faibussowitsch 
2617f48955SJacob Faibussowitsch // if both cuda and hip agree on the same naming scheme i.e. CUBLAS_STATUS_SUCCESS and
2717f48955SJacob Faibussowitsch // HIPBLAS_STATUS_SUCCESS:
2817f48955SJacob Faibussowitsch //
2917f48955SJacob Faibussowitsch // PETSC_CUPMBLAS_DEFINE_STATIC_VARIABLE_MATCHING_PREFIX(STATUS_SUCCESS) ->
3017f48955SJacob Faibussowitsch // const decltype(CUBLAS_STATUS_SUCCESS)  BlasInterface<DeviceType::CUDA>::CUPMBLAS_STATUS_SUCCESS;
3117f48955SJacob Faibussowitsch // const decltype(HIPBLAS_STATUS_SUCCESS) BlasInterface<DeviceType::HIP>::CUPMBLAS_STATUS_SUCCESS;
329371c9d4SSatish 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))
3317f48955SJacob Faibussowitsch 
3417f48955SJacob Faibussowitsch PETSC_CUPMBLAS_DEFINE_STATIC_VARIABLE_MATCHING_SCHEME(STATUS_SUCCESS)
3517f48955SJacob Faibussowitsch PETSC_CUPMBLAS_DEFINE_STATIC_VARIABLE_MATCHING_SCHEME(STATUS_NOT_INITIALIZED)
3617f48955SJacob Faibussowitsch PETSC_CUPMBLAS_DEFINE_STATIC_VARIABLE_MATCHING_SCHEME(STATUS_ALLOC_FAILED)
370e6b6b59SJacob Faibussowitsch PETSC_CUPMBLAS_DEFINE_STATIC_VARIABLE_MATCHING_SCHEME(POINTER_MODE_HOST)
380e6b6b59SJacob Faibussowitsch PETSC_CUPMBLAS_DEFINE_STATIC_VARIABLE_MATCHING_SCHEME(POINTER_MODE_DEVICE)
3917f48955SJacob Faibussowitsch 
400e6b6b59SJacob Faibussowitsch #if PetscDefined(HAVE_CUDA)
410e6b6b59SJacob Faibussowitsch template struct BlasInterface<DeviceType::CUDA>;
420e6b6b59SJacob Faibussowitsch #endif
4317f48955SJacob Faibussowitsch 
440e6b6b59SJacob Faibussowitsch #if PetscDefined(HAVE_HIP)
450e6b6b59SJacob Faibussowitsch template struct BlasInterface<DeviceType::HIP>;
460e6b6b59SJacob Faibussowitsch #endif
4717f48955SJacob Faibussowitsch 
480e6b6b59SJacob Faibussowitsch } // namespace impl
490e6b6b59SJacob Faibussowitsch 
500e6b6b59SJacob Faibussowitsch } // namespace cupm
510e6b6b59SJacob Faibussowitsch 
520e6b6b59SJacob Faibussowitsch } // namespace device
5317f48955SJacob Faibussowitsch 
5417f48955SJacob Faibussowitsch } // namespace Petsc
55