10e6b6b59SJacob Faibussowitsch #ifndef PETSCDEVICE_HIP_H 20e6b6b59SJacob Faibussowitsch #define PETSCDEVICE_HIP_H 30e6b6b59SJacob Faibussowitsch 40e6b6b59SJacob Faibussowitsch #include <petscdevice.h> 50e6b6b59SJacob Faibussowitsch #include <petscpkg_version.h> 60e6b6b59SJacob Faibussowitsch 70e6b6b59SJacob Faibussowitsch #if defined(__HCC__) || (defined(__clang__) && defined(__HIP__)) 80e6b6b59SJacob Faibussowitsch #define PETSC_USING_HCC 1 90e6b6b59SJacob Faibussowitsch #endif 100e6b6b59SJacob Faibussowitsch 110e6b6b59SJacob Faibussowitsch #if PetscDefined(HAVE_HIP) 120e6b6b59SJacob Faibussowitsch #include <hip/hip_runtime.h> 130e6b6b59SJacob Faibussowitsch 140e6b6b59SJacob Faibussowitsch #if PETSC_PKG_HIP_VERSION_GE(5, 2, 0) 150e6b6b59SJacob Faibussowitsch #include <hipblas/hipblas.h> 160e6b6b59SJacob Faibussowitsch #else 170e6b6b59SJacob Faibussowitsch #include <hipblas.h> 180e6b6b59SJacob Faibussowitsch #endif 190e6b6b59SJacob Faibussowitsch 200e6b6b59SJacob Faibussowitsch #if defined(__HIP_PLATFORM_NVCC__) 210e6b6b59SJacob Faibussowitsch #include <cusolverDn.h> 220e6b6b59SJacob Faibussowitsch #else // __HIP_PLATFORM_HCC__ 230e6b6b59SJacob Faibussowitsch #if PETSC_PKG_HIP_VERSION_GE(5, 2, 0) 240e6b6b59SJacob Faibussowitsch #include <rocsolver/rocsolver.h> 250e6b6b59SJacob Faibussowitsch #else 260e6b6b59SJacob Faibussowitsch #include <rocsolver.h> 270e6b6b59SJacob Faibussowitsch #endif 280e6b6b59SJacob Faibussowitsch #endif // __HIP_PLATFORM_NVCC__ 290e6b6b59SJacob Faibussowitsch #include <hip/hip_complex.h> // for hipComplex, hipDoubleComplex 300e6b6b59SJacob Faibussowitsch 310e6b6b59SJacob Faibussowitsch // REMOVE ME 320e6b6b59SJacob Faibussowitsch #define WaitForHIP() hipDeviceSynchronize() 330e6b6b59SJacob Faibussowitsch 340e6b6b59SJacob Faibussowitsch /* hipBLAS does not have hipblasGetErrorName(). We create one on our own. */ 350e6b6b59SJacob Faibussowitsch PETSC_EXTERN const char *PetscHIPBLASGetErrorName(hipblasStatus_t); /* PETSC_EXTERN since it is exposed by the CHKERRHIPBLAS macro */ 360e6b6b59SJacob Faibussowitsch 370e6b6b59SJacob Faibussowitsch #define PetscCallHIP(...) \ 380e6b6b59SJacob Faibussowitsch do { \ 390e6b6b59SJacob Faibussowitsch const hipError_t _p_hip_err__ = __VA_ARGS__; \ 400e6b6b59SJacob Faibussowitsch if (PetscUnlikely(_p_hip_err__ != hipSuccess)) { \ 410e6b6b59SJacob Faibussowitsch const char *name = hipGetErrorName(_p_hip_err__); \ 420e6b6b59SJacob Faibussowitsch const char *descr = hipGetErrorString(_p_hip_err__); \ 430e6b6b59SJacob Faibussowitsch SETERRQ(PETSC_COMM_SELF, PETSC_ERR_GPU, "hip error %d (%s) : %s", (PetscErrorCode)_p_hip_err__, name, descr); \ 440e6b6b59SJacob Faibussowitsch } \ 450e6b6b59SJacob Faibussowitsch } while (0) 460e6b6b59SJacob Faibussowitsch #define CHKERRHIP(...) PetscCallHIP(__VA_ARGS__) 470e6b6b59SJacob Faibussowitsch 480e6b6b59SJacob Faibussowitsch #define PetscCallHIPBLAS(...) \ 490e6b6b59SJacob Faibussowitsch do { \ 500e6b6b59SJacob Faibussowitsch const hipblasStatus_t _p_hipblas_stat__ = __VA_ARGS__; \ 510e6b6b59SJacob Faibussowitsch if (PetscUnlikely(_p_hipblas_stat__ != HIPBLAS_STATUS_SUCCESS)) { \ 520e6b6b59SJacob Faibussowitsch const char *name = PetscHIPBLASGetErrorName(_p_hipblas_stat__); \ 530e6b6b59SJacob Faibussowitsch SETERRQ(PETSC_COMM_SELF, PETSC_ERR_GPU, "hipBLAS error %d (%s)", (PetscErrorCode)_p_hipblas_stat__, name); \ 540e6b6b59SJacob Faibussowitsch } \ 550e6b6b59SJacob Faibussowitsch } while (0) 560e6b6b59SJacob Faibussowitsch #define CHKERRHIPBLAS(...) PetscCallHIPBLAS(__VA_ARGS__) 570e6b6b59SJacob Faibussowitsch 580e6b6b59SJacob Faibussowitsch /* TODO: SEK: Need to figure out the hipsolver issues */ 590e6b6b59SJacob Faibussowitsch #define PetscCallHIPSOLVER(...) \ 600e6b6b59SJacob Faibussowitsch do { \ 610e6b6b59SJacob Faibussowitsch const hipsolverStatus_t _p_hipsolver_stat__ = __VA_ARGS__; \ 620e6b6b59SJacob Faibussowitsch PetscCheck(!_p_hipsolver_stat__, PETSC_COMM_SELF, PETSC_ERR_GPU, "HIPSOLVER error %d", (PetscErrorCode)_p_hipsolver_stat__); \ 630e6b6b59SJacob Faibussowitsch } while (0) 640e6b6b59SJacob Faibussowitsch #define CHKERRHIPSOLVER(...) PetscCallHIPSOLVER(__VA_ARGS__) 650e6b6b59SJacob Faibussowitsch 660e6b6b59SJacob Faibussowitsch /* hipSolver does not exist yet so we work around it 670e6b6b59SJacob Faibussowitsch rocSOLVER users rocBLAS for the handle 680e6b6b59SJacob Faibussowitsch * */ 690e6b6b59SJacob Faibussowitsch #if defined(__HIP_PLATFORM_NVCC__) 700e6b6b59SJacob Faibussowitsch typedef cusolverDnHandle_t hipsolverHandle_t; 710e6b6b59SJacob Faibussowitsch typedef cusolverStatus_t hipsolverStatus_t; 720e6b6b59SJacob Faibussowitsch 730e6b6b59SJacob Faibussowitsch /* Alias hipsolverDestroy to cusolverDnDestroy */ 74*d71ae5a4SJacob Faibussowitsch static inline hipsolverStatus_t hipsolverDestroy(hipsolverHandle_t *hipsolverhandle) 75*d71ae5a4SJacob Faibussowitsch { 760e6b6b59SJacob Faibussowitsch return cusolverDnDestroy(hipsolverhandle); 770e6b6b59SJacob Faibussowitsch } 780e6b6b59SJacob Faibussowitsch 790e6b6b59SJacob Faibussowitsch /* Alias hipsolverCreate to cusolverDnCreate */ 80*d71ae5a4SJacob Faibussowitsch static inline hipsolverStatus_t hipsolverCreate(hipsolverHandle_t *hipsolverhandle) 81*d71ae5a4SJacob Faibussowitsch { 820e6b6b59SJacob Faibussowitsch return cusolverDnCreate(hipsolverhandle); 830e6b6b59SJacob Faibussowitsch } 840e6b6b59SJacob Faibussowitsch 850e6b6b59SJacob Faibussowitsch /* Alias hipsolverGetStream to cusolverDnGetStream */ 86*d71ae5a4SJacob Faibussowitsch static inline hipsolverStatus_t hipsolverGetStream(hipsolverHandle_t handle, hipStream_t *stream) 87*d71ae5a4SJacob Faibussowitsch { 880e6b6b59SJacob Faibussowitsch return cusolverDnGetStream(handle, stream); 890e6b6b59SJacob Faibussowitsch } 900e6b6b59SJacob Faibussowitsch 910e6b6b59SJacob Faibussowitsch /* Alias hipsolverSetStream to cusolverDnSetStream */ 92*d71ae5a4SJacob Faibussowitsch static inline hipsolverStatus_t hipsolverSetStream(hipsolverHandle_t handle, hipStream_t stream) 93*d71ae5a4SJacob Faibussowitsch { 940e6b6b59SJacob Faibussowitsch return cusolveDnSetStream(handle, stream); 950e6b6b59SJacob Faibussowitsch } 960e6b6b59SJacob Faibussowitsch #else /* __HIP_PLATFORM_HCC__ */ 970e6b6b59SJacob Faibussowitsch typedef rocblas_handle hipsolverHandle_t; 980e6b6b59SJacob Faibussowitsch typedef rocblas_status hipsolverStatus_t; 990e6b6b59SJacob Faibussowitsch 1000e6b6b59SJacob Faibussowitsch /* Alias hipsolverDestroy to rocblas_destroy_handle */ 101*d71ae5a4SJacob Faibussowitsch static inline hipsolverStatus_t hipsolverDestroy(hipsolverHandle_t hipsolverhandle) 102*d71ae5a4SJacob Faibussowitsch { 1030e6b6b59SJacob Faibussowitsch return rocblas_destroy_handle(hipsolverhandle); 1040e6b6b59SJacob Faibussowitsch } 1050e6b6b59SJacob Faibussowitsch 1060e6b6b59SJacob Faibussowitsch /* Alias hipsolverCreate to rocblas_destroy_handle */ 107*d71ae5a4SJacob Faibussowitsch static inline hipsolverStatus_t hipsolverCreate(hipsolverHandle_t *hipsolverhandle) 108*d71ae5a4SJacob Faibussowitsch { 1090e6b6b59SJacob Faibussowitsch return rocblas_create_handle(hipsolverhandle); 1100e6b6b59SJacob Faibussowitsch } 1110e6b6b59SJacob Faibussowitsch 1120e6b6b59SJacob Faibussowitsch // Alias hipsolverGetStream to rocblas_get_stream 113*d71ae5a4SJacob Faibussowitsch static inline hipsolverStatus_t hipsolverGetStream(hipsolverHandle_t handle, hipStream_t *stream) 114*d71ae5a4SJacob Faibussowitsch { 1150e6b6b59SJacob Faibussowitsch return rocblas_get_stream(handle, stream); 1160e6b6b59SJacob Faibussowitsch } 1170e6b6b59SJacob Faibussowitsch 1180e6b6b59SJacob Faibussowitsch // Alias hipsolverSetStream to rocblas_set_stream 119*d71ae5a4SJacob Faibussowitsch static inline hipsolverStatus_t hipsolverSetStream(hipsolverHandle_t handle, hipStream_t stream) 120*d71ae5a4SJacob Faibussowitsch { 1210e6b6b59SJacob Faibussowitsch return rocblas_set_stream(handle, stream); 1220e6b6b59SJacob Faibussowitsch } 1230e6b6b59SJacob Faibussowitsch #endif // __HIP_PLATFORM_NVCC__ 1240e6b6b59SJacob Faibussowitsch 1250e6b6b59SJacob Faibussowitsch // REMOVE ME 1260e6b6b59SJacob Faibussowitsch PETSC_EXTERN hipStream_t PetscDefaultHipStream; // The default stream used by PETSc 1270e6b6b59SJacob Faibussowitsch PETSC_EXTERN PetscErrorCode PetscHIPBLASGetHandle(hipblasHandle_t *); 1280e6b6b59SJacob Faibussowitsch PETSC_EXTERN PetscErrorCode PetscHIPSOLVERGetHandle(hipsolverHandle_t *); 1290e6b6b59SJacob Faibussowitsch 1300e6b6b59SJacob Faibussowitsch #endif // PETSC_HAVE_HIP 1310e6b6b59SJacob Faibussowitsch 1320e6b6b59SJacob Faibussowitsch // these can also be defined in petscdevice_cuda.h 1330e6b6b59SJacob Faibussowitsch #ifndef PETSC_DEVICE_DEFINED_DECLS_PRIVATE 1340e6b6b59SJacob Faibussowitsch #define PETSC_DEVICE_DEFINED_DECLS_PRIVATE 1350e6b6b59SJacob Faibussowitsch #if PetscDefined(USING_HCC) 1360e6b6b59SJacob Faibussowitsch #define PETSC_HOST_DECL __host__ 1370e6b6b59SJacob Faibussowitsch #define PETSC_DEVICE_DECL __device__ 1380e6b6b59SJacob Faibussowitsch #define PETSC_KERNEL_DECL __global__ 1390e6b6b59SJacob Faibussowitsch #define PETSC_SHAREDMEM_DECL __shared__ 1400e6b6b59SJacob Faibussowitsch #define PETSC_FORCEINLINE __forceinline__ 1410e6b6b59SJacob Faibussowitsch #define PETSC_CONSTMEM_DECL __constant__ 1420e6b6b59SJacob Faibussowitsch #else 1430e6b6b59SJacob Faibussowitsch #define PETSC_HOST_DECL 1440e6b6b59SJacob Faibussowitsch #define PETSC_DEVICE_DECL 1450e6b6b59SJacob Faibussowitsch #define PETSC_KERNEL_DECL 1460e6b6b59SJacob Faibussowitsch #define PETSC_SHAREDMEM_DECL 1470e6b6b59SJacob Faibussowitsch #define PETSC_FORCEINLINE inline 1480e6b6b59SJacob Faibussowitsch #define PETSC_CONSTMEM_DECL 1490e6b6b59SJacob Faibussowitsch #endif // PETSC_USING_NVCC 1500e6b6b59SJacob Faibussowitsch 1510e6b6b59SJacob Faibussowitsch #define PETSC_HOSTDEVICE_DECL PETSC_HOST_DECL PETSC_DEVICE_DECL 1520e6b6b59SJacob Faibussowitsch #define PETSC_DEVICE_INLINE_DECL PETSC_DEVICE_DECL PETSC_FORCEINLINE 1530e6b6b59SJacob Faibussowitsch #define PETSC_HOSTDEVICE_INLINE_DECL PETSC_HOSTDEVICE_DECL PETSC_FORCEINLINE 1540e6b6b59SJacob Faibussowitsch #endif // PETSC_DEVICE_DEFINED_DECLS_PRIVATE 1550e6b6b59SJacob Faibussowitsch 1560e6b6b59SJacob Faibussowitsch #endif // PETSCDEVICE_HIP_H 157