xref: /petsc/include/petscdevice_hip.h (revision d71ae5a4db6382e7f06317b8d368875286fe9008)
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