Actual source code: petscdevice_hip.h

  1: #ifndef PETSCDEVICE_HIP_H
  2: #define PETSCDEVICE_HIP_H

  4: #include <petscdevice.h>
  5: #include <petscpkg_version.h>

  7: #if defined(__HCC__) || (defined(__clang__) && defined(__HIP__))
  8:   #define PETSC_USING_HCC 1
  9: #endif

 11: #if PetscDefined(HAVE_HIP)
 12:   #include <hip/hip_runtime.h>

 14:   #if PETSC_PKG_HIP_VERSION_GE(5, 2, 0)
 15:     #include <hipblas/hipblas.h>
 16:   #else
 17:     #include <hipblas.h>
 18:   #endif

 20:   #if defined(__HIP_PLATFORM_NVCC__)
 21:     #include <cusolverDn.h>
 22:   #else // __HIP_PLATFORM_HCC__
 23:     #if PETSC_PKG_HIP_VERSION_GE(5, 2, 0)
 24:       #include <rocsolver/rocsolver.h>
 25:     #else
 26:       #include <rocsolver.h>
 27:     #endif
 28:   #endif                       // __HIP_PLATFORM_NVCC__
 29:   #include <hip/hip_complex.h> // for hipComplex, hipDoubleComplex

 31:   // REMOVE ME
 32:   #define WaitForHIP() hipDeviceSynchronize()

 34: /* hipBLAS does not have hipblasGetErrorName(). We create one on our own. */
 35: PETSC_EXTERN const char *PetscHIPBLASGetErrorName(hipblasStatus_t); /* PETSC_EXTERN since it is exposed by the CHKERRHIPBLAS macro */

 37:   #define PetscCallHIP(...) \
 38:     do { \
 39:       const hipError_t _p_hip_err__ = __VA_ARGS__; \
 40:       if (PetscUnlikely(_p_hip_err__ != hipSuccess)) { \
 41:         const char *name  = hipGetErrorName(_p_hip_err__); \
 42:         const char *descr = hipGetErrorString(_p_hip_err__); \
 43:         SETERRQ(PETSC_COMM_SELF, PETSC_ERR_GPU, "hip error %d (%s) : %s", (PetscErrorCode)_p_hip_err__, name, descr); \
 44:       } \
 45:     } while (0)
 46:   #define CHKERRHIP(...) PetscCallHIP(__VA_ARGS__)

 48:   #define PetscCallHIPBLAS(...) \
 49:     do { \
 50:       const hipblasStatus_t _p_hipblas_stat__ = __VA_ARGS__; \
 51:       if (PetscUnlikely(_p_hipblas_stat__ != HIPBLAS_STATUS_SUCCESS)) { \
 52:         const char *name = PetscHIPBLASGetErrorName(_p_hipblas_stat__); \
 53:         SETERRQ(PETSC_COMM_SELF, PETSC_ERR_GPU, "hipBLAS error %d (%s)", (PetscErrorCode)_p_hipblas_stat__, name); \
 54:       } \
 55:     } while (0)
 56:   #define CHKERRHIPBLAS(...) PetscCallHIPBLAS(__VA_ARGS__)

 58:   /* TODO: SEK:  Need to figure out the hipsolver issues */
 59:   #define PetscCallHIPSOLVER(...) \
 60:     do { \
 61:       const hipsolverStatus_t _p_hipsolver_stat__ = __VA_ARGS__; \
 63:     } while (0)
 64:   #define CHKERRHIPSOLVER(...) PetscCallHIPSOLVER(__VA_ARGS__)

 66:   /* hipSolver does not exist yet so we work around it
 67:  rocSOLVER users rocBLAS for the handle
 68:  * */
 69:   #if defined(__HIP_PLATFORM_NVCC__)
 70: typedef cusolverDnHandle_t hipsolverHandle_t;
 71: typedef cusolverStatus_t   hipsolverStatus_t;

 73: /* Alias hipsolverDestroy to cusolverDnDestroy */
 74: static inline hipsolverStatus_t hipsolverDestroy(hipsolverHandle_t *hipsolverhandle)
 75: {
 76:   return cusolverDnDestroy(hipsolverhandle);
 77: }

 79: /* Alias hipsolverCreate to cusolverDnCreate */
 80: static inline hipsolverStatus_t hipsolverCreate(hipsolverHandle_t *hipsolverhandle)
 81: {
 82:   return cusolverDnCreate(hipsolverhandle);
 83: }

 85: /* Alias hipsolverGetStream to cusolverDnGetStream */
 86: static inline hipsolverStatus_t hipsolverGetStream(hipsolverHandle_t handle, hipStream_t *stream)
 87: {
 88:   return cusolverDnGetStream(handle, stream);
 89: }

 91: /* Alias hipsolverSetStream to cusolverDnSetStream */
 92: static inline hipsolverStatus_t hipsolverSetStream(hipsolverHandle_t handle, hipStream_t stream)
 93: {
 94:   return cusolveDnSetStream(handle, stream);
 95: }
 96:   #else  /* __HIP_PLATFORM_HCC__ */
 97: typedef rocblas_handle hipsolverHandle_t;
 98: typedef rocblas_status hipsolverStatus_t;

100: /* Alias hipsolverDestroy to rocblas_destroy_handle */
101: static inline hipsolverStatus_t hipsolverDestroy(hipsolverHandle_t hipsolverhandle)
102: {
103:   return rocblas_destroy_handle(hipsolverhandle);
104: }

106: /* Alias hipsolverCreate to rocblas_destroy_handle */
107: static inline hipsolverStatus_t hipsolverCreate(hipsolverHandle_t *hipsolverhandle)
108: {
109:   return rocblas_create_handle(hipsolverhandle);
110: }

112: // Alias hipsolverGetStream to rocblas_get_stream
113: static inline hipsolverStatus_t hipsolverGetStream(hipsolverHandle_t handle, hipStream_t *stream)
114: {
115:   return rocblas_get_stream(handle, stream);
116: }

118: // Alias hipsolverSetStream to rocblas_set_stream
119: static inline hipsolverStatus_t hipsolverSetStream(hipsolverHandle_t handle, hipStream_t stream)
120: {
121:   return rocblas_set_stream(handle, stream);
122: }
123:   #endif // __HIP_PLATFORM_NVCC__

125: // REMOVE ME
126: PETSC_EXTERN hipStream_t    PetscDefaultHipStream; // The default stream used by PETSc
127: PETSC_EXTERN PetscErrorCode PetscHIPBLASGetHandle(hipblasHandle_t *);
128: PETSC_EXTERN PetscErrorCode PetscHIPSOLVERGetHandle(hipsolverHandle_t *);

130: #endif // PETSC_HAVE_HIP

132: // these can also be defined in petscdevice_cuda.h
133: #ifndef PETSC_DEVICE_DEFINED_DECLS_PRIVATE
134:   #define PETSC_DEVICE_DEFINED_DECLS_PRIVATE
135:   #if PetscDefined(USING_HCC)
136:     #define PETSC_HOST_DECL      __host__
137:     #define PETSC_DEVICE_DECL    __device__
138:     #define PETSC_KERNEL_DECL    __global__
139:     #define PETSC_SHAREDMEM_DECL __shared__
140:     #define PETSC_FORCEINLINE    __forceinline__
141:     #define PETSC_CONSTMEM_DECL  __constant__
142:   #else
143:     #define PETSC_HOST_DECL
144:     #define PETSC_DEVICE_DECL
145:     #define PETSC_KERNEL_DECL
146:     #define PETSC_SHAREDMEM_DECL
147:     #define PETSC_FORCEINLINE inline
148:     #define PETSC_CONSTMEM_DECL
149:   #endif // PETSC_USING_NVCC

151:   #define PETSC_HOSTDEVICE_DECL        PETSC_HOST_DECL PETSC_DEVICE_DECL
152:   #define PETSC_DEVICE_INLINE_DECL     PETSC_DEVICE_DECL PETSC_FORCEINLINE
153:   #define PETSC_HOSTDEVICE_INLINE_DECL PETSC_HOSTDEVICE_DECL PETSC_FORCEINLINE
154: #endif // PETSC_DEVICE_DEFINED_DECLS_PRIVATE

156: #endif // PETSCDEVICE_HIP_H