xref: /petsc/include/petscdevice.h (revision 9566063d113dddea24716c546802770db7481bc0)
1030f984aSJacob Faibussowitsch #if !defined(PETSCDEVICE_H)
2030f984aSJacob Faibussowitsch #define PETSCDEVICE_H
3030f984aSJacob Faibussowitsch 
4030f984aSJacob Faibussowitsch #include <petscsys.h>
5030f984aSJacob Faibussowitsch #include <petscdevicetypes.h>
6a4af0ceeSJacob Faibussowitsch #include <petscpkg_version.h>
7030f984aSJacob Faibussowitsch 
807e4ef11SJacob Faibussowitsch #if defined(PETSC_HAVE_CUDA)
9030f984aSJacob Faibussowitsch #include <cuda.h>
10030f984aSJacob Faibussowitsch #include <cuda_runtime.h>
11030f984aSJacob Faibussowitsch #include <cublas_v2.h>
12030f984aSJacob Faibussowitsch #include <cusolverDn.h>
13030f984aSJacob Faibussowitsch #include <cusolverSp.h>
14030f984aSJacob Faibussowitsch #include <cufft.h>
15030f984aSJacob Faibussowitsch 
16030f984aSJacob Faibussowitsch /* cuBLAS does not have cublasGetErrorName(). We create one on our own. */
17030f984aSJacob Faibussowitsch PETSC_EXTERN const char* PetscCUBLASGetErrorName(cublasStatus_t); /* PETSC_EXTERN since it is exposed by the CHKERRCUBLAS macro */
18030f984aSJacob Faibussowitsch PETSC_EXTERN const char* PetscCUSolverGetErrorName(cusolverStatus_t);
19030f984aSJacob Faibussowitsch PETSC_EXTERN const char* PetscCUFFTGetErrorName(cufftResult);
20030f984aSJacob Faibussowitsch 
21a4af0ceeSJacob Faibussowitsch /* REMOVE ME */
22a4af0ceeSJacob Faibussowitsch #define WaitForCUDA() cudaDeviceSynchronize()
23030f984aSJacob Faibussowitsch 
24030f984aSJacob Faibussowitsch /* CUDART_VERSION = 1000 x major + 10 x minor version */
25030f984aSJacob Faibussowitsch 
26030f984aSJacob Faibussowitsch /* Could not find exactly which CUDART_VERSION introduced cudaGetErrorName. At least it was in CUDA 8.0 (Sep. 2016) */
27a4af0ceeSJacob Faibussowitsch #if PETSC_PKG_CUDA_VERSION_GE(8,0,0)
28*9566063dSJacob Faibussowitsch #define PetscCallCUDA(...) do {                                         \
295f80ce2aSJacob Faibussowitsch     const cudaError_t _p_cuda_err__ = __VA_ARGS__;                      \
30a4af0ceeSJacob Faibussowitsch     if (PetscUnlikely(_p_cuda_err__ != cudaSuccess)) {                  \
31a4af0ceeSJacob Faibussowitsch       const char *name  = cudaGetErrorName(_p_cuda_err__);              \
32a4af0ceeSJacob Faibussowitsch       const char *descr = cudaGetErrorString(_p_cuda_err__);            \
3398921bdaSJacob Faibussowitsch       SETERRQ(PETSC_COMM_SELF,PETSC_ERR_GPU,"cuda error %d (%s) : %s",  \
34a4af0ceeSJacob Faibussowitsch               (PetscErrorCode)_p_cuda_err__,name,descr);                \
35030f984aSJacob Faibussowitsch     }                                                                   \
36030f984aSJacob Faibussowitsch   } while (0)
37a4af0ceeSJacob Faibussowitsch #else /* PETSC_PKG_CUDA_VERSION_GE(8,0,0) */
38*9566063dSJacob Faibussowitsch #define PetscCallCUDA(...) do {                                                                \
395f80ce2aSJacob Faibussowitsch   const cudaError_t _p_cuda_err__ = __VA_ARGS__;                                               \
40*9566063dSJacob Faibussowitsch   PetscCheck(_p_cuda_err__ == cudaSuccess,PETSC_COMM_SELF,PETSC_ERR_GPU,"cuda error %d",(PetscErrorCode)_p_cuda_err__); \
41a4af0ceeSJacob Faibussowitsch } while (0)
42a4af0ceeSJacob Faibussowitsch #endif /* PETSC_PKG_CUDA_VERSION_GE(8,0,0) */
43*9566063dSJacob Faibussowitsch #define CHKERRCUDA(...) PetscCallCUDA(__VA_ARGS__)
44030f984aSJacob Faibussowitsch 
45*9566063dSJacob Faibussowitsch #define PetscCallCUBLAS(...) do {                                       \
465f80ce2aSJacob Faibussowitsch     const cublasStatus_t _p_cublas_stat__ = __VA_ARGS__;                \
47a4af0ceeSJacob Faibussowitsch     if (PetscUnlikely(_p_cublas_stat__ != CUBLAS_STATUS_SUCCESS)) {     \
48a4af0ceeSJacob Faibussowitsch       const char *name = PetscCUBLASGetErrorName(_p_cublas_stat__);     \
49a4af0ceeSJacob Faibussowitsch       if (((_p_cublas_stat__ == CUBLAS_STATUS_NOT_INITIALIZED) ||       \
50a4af0ceeSJacob Faibussowitsch            (_p_cublas_stat__ == CUBLAS_STATUS_ALLOC_FAILED))   &&       \
51a4af0ceeSJacob Faibussowitsch           PetscDeviceInitialized(PETSC_DEVICE_CUDA)) {                  \
5298921bdaSJacob Faibussowitsch         SETERRQ(PETSC_COMM_SELF,PETSC_ERR_GPU_RESOURCE,                 \
53a4af0ceeSJacob Faibussowitsch                 "cuBLAS error %d (%s). "                                \
54a4af0ceeSJacob Faibussowitsch                 "Reports not initialized or alloc failed; "             \
55a4af0ceeSJacob Faibussowitsch                 "this indicates the GPU may have run out resources",    \
56a4af0ceeSJacob Faibussowitsch                 (PetscErrorCode)_p_cublas_stat__,name);                 \
57a4af0ceeSJacob Faibussowitsch       } else {                                                          \
5898921bdaSJacob Faibussowitsch         SETERRQ(PETSC_COMM_SELF,PETSC_ERR_GPU,"cuBLAS error %d (%s)",   \
59a4af0ceeSJacob Faibussowitsch                 (PetscErrorCode)_p_cublas_stat__,name);                 \
60a4af0ceeSJacob Faibussowitsch       }                                                                 \
61030f984aSJacob Faibussowitsch     }                                                                   \
62030f984aSJacob Faibussowitsch   } while (0)
63*9566063dSJacob Faibussowitsch #define CHKERRCUBLAS(...) PetscCallCUBLAS(__VA_ARGS__)
64030f984aSJacob Faibussowitsch 
655d8933d6SRichard Tran Mills #if (CUSPARSE_VER_MAJOR > 10 || CUSPARSE_VER_MAJOR == 10 && CUSPARSE_VER_MINOR >= 2) /* According to cuda/10.1.168 on OLCF Summit */
66*9566063dSJacob Faibussowitsch #define PetscCallCUSPARSE(...)\
675d8933d6SRichard Tran Mills do {\
685f80ce2aSJacob Faibussowitsch   const cusparseStatus_t _p_cusparse_stat__ = __VA_ARGS__;\
699ace16cdSJacob Faibussowitsch   if (PetscUnlikely(_p_cusparse_stat__)) {\
709ace16cdSJacob Faibussowitsch     const char *name  = cusparseGetErrorName(_p_cusparse_stat__);\
719ace16cdSJacob Faibussowitsch     const char *descr = cusparseGetErrorString(_p_cusparse_stat__);\
722c71b3e2SJacob Faibussowitsch     PetscCheck((_p_cusparse_stat__ != CUSPARSE_STATUS_NOT_INITIALIZED) && (_p_cusparse_stat__ != CUSPARSE_STATUS_ALLOC_FAILED),PETSC_COMM_SELF,PETSC_ERR_GPU_RESOURCE,"cuSPARSE errorcode %d (%s) : %s. Reports not initialized or alloc failed; this indicates the GPU has run out resources",(int)_p_cusparse_stat__,name,descr); \
739ace16cdSJacob Faibussowitsch     else SETERRQ(PETSC_COMM_SELF,PETSC_ERR_GPU,"cuSPARSE errorcode %d (%s) : %s",(int)_p_cusparse_stat__,name,descr);\
745d8933d6SRichard Tran Mills   }\
755d8933d6SRichard Tran Mills } while (0)
765d8933d6SRichard Tran Mills #else  /* (CUSPARSE_VER_MAJOR > 10 || CUSPARSE_VER_MAJOR == 10 && CUSPARSE_VER_MINOR >= 2) */
77*9566063dSJacob Faibussowitsch #define PetscCallCUSPARSE(...) do { \
785f80ce2aSJacob Faibussowitsch   const cusparseStatus_t _p_cusparse_stat__ = __VA_ARGS__; \
792c71b3e2SJacob Faibussowitsch   PetscCheck(_p_cusparse_stat__ == CUSPARSE_STATUS_SUCCESS,PETSC_COMM_SELF,PETSC_ERR_GPU,"cuSPARSE errorcode %d",(PetscErrorCode)_p_cusparse_stat__); \
809a202e32SJacob Faibussowitsch   } while (0)
815d8933d6SRichard Tran Mills #endif /* (CUSPARSE_VER_MAJOR > 10 || CUSPARSE_VER_MAJOR == 10 && CUSPARSE_VER_MINOR >= 2) */
82*9566063dSJacob Faibussowitsch #define CHKERRCUSPARSE(...) PetscCallCUSPARSE(__VA_ARGS__)
835d8933d6SRichard Tran Mills 
84*9566063dSJacob Faibussowitsch #define PetscCallCUSOLVER(...) do {                                     \
855f80ce2aSJacob Faibussowitsch     const cusolverStatus_t _p_cusolver_stat__ = __VA_ARGS__;            \
86a4af0ceeSJacob Faibussowitsch     if (PetscUnlikely(_p_cusolver_stat__ != CUSOLVER_STATUS_SUCCESS)) { \
87a4af0ceeSJacob Faibussowitsch       const char *name = PetscCUSolverGetErrorName(_p_cusolver_stat__); \
88a4af0ceeSJacob Faibussowitsch       if (((_p_cusolver_stat__ == CUSOLVER_STATUS_NOT_INITIALIZED) ||   \
89a4af0ceeSJacob Faibussowitsch            (_p_cusolver_stat__ == CUSOLVER_STATUS_ALLOC_FAILED)    ||   \
90a4af0ceeSJacob Faibussowitsch            (_p_cusolver_stat__ == CUSOLVER_STATUS_INTERNAL_ERROR)) &&   \
91a4af0ceeSJacob Faibussowitsch           PetscDeviceInitialized(PETSC_DEVICE_CUDA)) {                  \
9298921bdaSJacob Faibussowitsch         SETERRQ(PETSC_COMM_SELF,PETSC_ERR_GPU_RESOURCE,                 \
93a4af0ceeSJacob Faibussowitsch                 "cuSolver error %d (%s). "                              \
94a4af0ceeSJacob Faibussowitsch                 "This indicates the GPU may have run out resources",    \
95a4af0ceeSJacob Faibussowitsch                 (PetscErrorCode)_p_cusolver_stat__,name);               \
96a4af0ceeSJacob Faibussowitsch       } else {                                                          \
9798921bdaSJacob Faibussowitsch         SETERRQ(PETSC_COMM_SELF,PETSC_ERR_GPU,"cuSolver error %d (%s)", \
98a4af0ceeSJacob Faibussowitsch                 (PetscErrorCode)_p_cusolver_stat__,name);               \
99a4af0ceeSJacob Faibussowitsch       }                                                                 \
100030f984aSJacob Faibussowitsch     }                                                                   \
101030f984aSJacob Faibussowitsch   } while (0)
102*9566063dSJacob Faibussowitsch #define CHKERRCUSOLVER(...) PetscCallCUSOLVER(__VA_ARGS__)
103030f984aSJacob Faibussowitsch 
104*9566063dSJacob Faibussowitsch #define PetscCallCUFFT(...)   do {                                      \
1055f80ce2aSJacob Faibussowitsch     const cufftResult_t _p_cufft_stat__ = __VA_ARGS__;                  \
106a4af0ceeSJacob Faibussowitsch     if (PetscUnlikely(_p_cufft_stat__ != CUFFT_SUCCESS)) {              \
107a4af0ceeSJacob Faibussowitsch       const char *name = PetscCUFFTGetErrorName(_p_cufft_stat__);       \
108a4af0ceeSJacob Faibussowitsch       if (((_p_cufft_stat__ == CUFFT_SETUP_FAILED)  ||                  \
109a4af0ceeSJacob Faibussowitsch            (_p_cufft_stat__ == CUFFT_ALLOC_FAILED)) &&                  \
110a4af0ceeSJacob Faibussowitsch           PetscDeviceInitialized(PETSC_DEVICE_CUDA)) {                  \
11198921bdaSJacob Faibussowitsch         SETERRQ(PETSC_COMM_SELF,PETSC_ERR_GPU_RESOURCE,                 \
112a4af0ceeSJacob Faibussowitsch                 "cuFFT error %d (%s). "                                 \
113a4af0ceeSJacob Faibussowitsch                 "Reports not initialized or alloc failed; "             \
114a4af0ceeSJacob Faibussowitsch                 "this indicates the GPU has run out resources",         \
115a4af0ceeSJacob Faibussowitsch                 (PetscErrorCode)_p_cufft_stat__,name);                  \
116a4af0ceeSJacob Faibussowitsch       } else {                                                          \
11798921bdaSJacob Faibussowitsch         SETERRQ(PETSC_COMM_SELF,PETSC_ERR_GPU,"cuFFT error %d (%s)",    \
118a4af0ceeSJacob Faibussowitsch                 (PetscErrorCode)_p_cufft_stat__,name);                  \
119a4af0ceeSJacob Faibussowitsch       }                                                                 \
120a4af0ceeSJacob Faibussowitsch     }                                                                   \
121a4af0ceeSJacob Faibussowitsch   } while (0)
122*9566063dSJacob Faibussowitsch #define CHKERRCUFFT(...) PetscCallCUFFT(__VA_ARGS__)
123a4af0ceeSJacob Faibussowitsch 
124*9566063dSJacob Faibussowitsch #define PetscCallCURAND(...)  do {                                      \
1255f80ce2aSJacob Faibussowitsch     const curandStatus_t _p_curand_stat__ = __VA_ARGS__;                \
126a4af0ceeSJacob Faibussowitsch     if (PetscUnlikely(_p_curand_stat__ != CURAND_STATUS_SUCCESS)) {     \
127a4af0ceeSJacob Faibussowitsch       if (((_p_curand_stat__ == CURAND_STATUS_INITIALIZATION_FAILED) || \
128a4af0ceeSJacob Faibussowitsch            (_p_curand_stat__ == CURAND_STATUS_ALLOCATION_FAILED))    && \
129a4af0ceeSJacob Faibussowitsch           PetscDeviceInitialized(PETSC_DEVICE_CUDA)) {                  \
13098921bdaSJacob Faibussowitsch         SETERRQ(PETSC_COMM_SELF,PETSC_ERR_GPU_RESOURCE,                 \
131a4af0ceeSJacob Faibussowitsch                 "cuRAND error %d. "                                     \
132a4af0ceeSJacob Faibussowitsch                 "Reports not initialized or alloc failed; "             \
133a4af0ceeSJacob Faibussowitsch                 "this indicates the GPU has run out resources",         \
134a4af0ceeSJacob Faibussowitsch                 (PetscErrorCode)_p_curand_stat__);                      \
135a4af0ceeSJacob Faibussowitsch       } else {                                                          \
13698921bdaSJacob Faibussowitsch         SETERRQ(PETSC_COMM_SELF,PETSC_ERR_GPU,                          \
137a4af0ceeSJacob Faibussowitsch                 "cuRand error %d",(PetscErrorCode)_p_curand_stat__);    \
138a4af0ceeSJacob Faibussowitsch       }                                                                 \
139030f984aSJacob Faibussowitsch     }                                                                   \
140030f984aSJacob Faibussowitsch   } while (0)
141*9566063dSJacob Faibussowitsch #define CHKERRCURAND(...) PetscCallCURAND(__VA_ARGS__)
142030f984aSJacob Faibussowitsch 
143030f984aSJacob Faibussowitsch PETSC_EXTERN cudaStream_t   PetscDefaultCudaStream; /* The default stream used by PETSc */
144030f984aSJacob Faibussowitsch 
145030f984aSJacob Faibussowitsch PETSC_EXTERN PetscErrorCode PetscCUBLASGetHandle(cublasHandle_t*);
146030f984aSJacob Faibussowitsch PETSC_EXTERN PetscErrorCode PetscCUSOLVERDnGetHandle(cusolverDnHandle_t*);
14707e4ef11SJacob Faibussowitsch #endif /* PETSC_HAVE_CUDA */
148030f984aSJacob Faibussowitsch 
14907e4ef11SJacob Faibussowitsch #if defined(PETSC_HAVE_HIP)
150030f984aSJacob Faibussowitsch #include <hip/hip_runtime.h>
151030f984aSJacob Faibussowitsch #include <hipblas.h>
152030f984aSJacob Faibussowitsch #if defined(__HIP_PLATFORM_NVCC__)
153030f984aSJacob Faibussowitsch #include <cusolverDn.h>
154030f984aSJacob Faibussowitsch #else /* __HIP_PLATFORM_HCC__ */
155030f984aSJacob Faibussowitsch #include <rocsolver.h>
156030f984aSJacob Faibussowitsch #endif /* __HIP_PLATFORM_NVCC__ */
157030f984aSJacob Faibussowitsch 
158a4af0ceeSJacob Faibussowitsch /* REMOVE ME */
159a4af0ceeSJacob Faibussowitsch #define WaitForHIP() hipDeviceSynchronize()
160030f984aSJacob Faibussowitsch 
161030f984aSJacob Faibussowitsch /* hipBLAS does not have hipblasGetErrorName(). We create one on our own. */
162030f984aSJacob Faibussowitsch PETSC_EXTERN const char* PetscHIPBLASGetErrorName(hipblasStatus_t); /* PETSC_EXTERN since it is exposed by the CHKERRHIPBLAS macro */
163030f984aSJacob Faibussowitsch 
164*9566063dSJacob Faibussowitsch #define PetscCallHIP(...)     do {                                      \
1655f80ce2aSJacob Faibussowitsch     const hipError_t _p_hip_err__ = __VA_ARGS__;                        \
166a4af0ceeSJacob Faibussowitsch     if (PetscUnlikely(_p_hip_err__ != hipSuccess)) {                    \
167a4af0ceeSJacob Faibussowitsch       const char *name  = hipGetErrorName(_p_hip_err__);                \
168a4af0ceeSJacob Faibussowitsch       const char *descr = hipGetErrorString(_p_hip_err__);              \
16998921bdaSJacob Faibussowitsch       SETERRQ(PETSC_COMM_SELF,PETSC_ERR_GPU,"hip error %d (%s) : %s",   \
170a4af0ceeSJacob Faibussowitsch               (PetscErrorCode)_p_hip_err__,name,descr);                 \
171030f984aSJacob Faibussowitsch     }                                                                   \
172030f984aSJacob Faibussowitsch   } while (0)
173*9566063dSJacob Faibussowitsch #define CHKERRHIP(...) PetscCallHIP(__VA_ARGS__)
174030f984aSJacob Faibussowitsch 
175*9566063dSJacob Faibussowitsch #define PetscCallHIPBLAS(...) do {                                      \
1765f80ce2aSJacob Faibussowitsch     const hipblasStatus_t _p_hipblas_stat__ = __VA_ARGS__;              \
177a4af0ceeSJacob Faibussowitsch     if (PetscUnlikely(_p_hipblas_stat__ != HIPBLAS_STATUS_SUCCESS)) {   \
178a4af0ceeSJacob Faibussowitsch       const char *name = PetscHIPBLASGetErrorName(_p_hipblas_stat__);   \
17998921bdaSJacob Faibussowitsch       SETERRQ(PETSC_COMM_SELF,PETSC_ERR_GPU,"hipBLAS error %d (%s)",    \
180a4af0ceeSJacob Faibussowitsch               (PetscErrorCode)_p_hipblas_stat__,name);                  \
181030f984aSJacob Faibussowitsch     }                                                                   \
182030f984aSJacob Faibussowitsch   } while (0)
183*9566063dSJacob Faibussowitsch #define CHKERRHIPBLAS(...) PetscCallHIPBLAS(__VA_ARGS__)
184030f984aSJacob Faibussowitsch 
185030f984aSJacob Faibussowitsch /* TODO: SEK:  Need to figure out the hipsolver issues */
186*9566063dSJacob Faibussowitsch #define PetscCallHIPSOLVER(...) do { \
1875f80ce2aSJacob Faibussowitsch     const hipsolverStatus_t _p_hipsolver_stat__ = __VA_ARGS__; \
1882c71b3e2SJacob Faibussowitsch     PetscCheck(!_p_hipsolver_stat__,PETSC_COMM_SELF,PETSC_ERR_GPU,"HIPSOLVER error %d",(PetscErrorCode)_p_hipsolver_stat__); \
189030f984aSJacob Faibussowitsch   } while (0)
190*9566063dSJacob Faibussowitsch #define CHKERRHIPSOLVER(...) PetscCallHIPSOLVER(__VA_ARGS__)
191030f984aSJacob Faibussowitsch 
192030f984aSJacob Faibussowitsch /* hipSolver does not exist yet so we work around it
193030f984aSJacob Faibussowitsch  rocSOLVER users rocBLAS for the handle
194030f984aSJacob Faibussowitsch  * */
195030f984aSJacob Faibussowitsch #if defined(__HIP_PLATFORM_NVCC__)
196030f984aSJacob Faibussowitsch typedef cusolverDnHandle_t hipsolverHandle_t;
197030f984aSJacob Faibussowitsch typedef cusolverStatus_t   hipsolverStatus_t;
198030f984aSJacob Faibussowitsch 
199030f984aSJacob Faibussowitsch /* Alias hipsolverDestroy to cusolverDnDestroy */
2009fbee547SJacob Faibussowitsch static inline hipsolverStatus_t hipsolverDestroy(hipsolverHandle_t *hipsolverhandle)
201030f984aSJacob Faibussowitsch {
20298921bdaSJacob Faibussowitsch   return cusolverDnDestroy(hipsolverhandle);
203030f984aSJacob Faibussowitsch }
204030f984aSJacob Faibussowitsch 
205030f984aSJacob Faibussowitsch /* Alias hipsolverCreate to cusolverDnCreate */
2069fbee547SJacob Faibussowitsch static inline hipsolverStatus_t hipsolverCreate(hipsolverHandle_t *hipsolverhandle)
207030f984aSJacob Faibussowitsch {
20898921bdaSJacob Faibussowitsch   return cusolverDnCreate(hipsolverhandle);
209030f984aSJacob Faibussowitsch }
210030f984aSJacob Faibussowitsch 
211030f984aSJacob Faibussowitsch /* Alias hipsolverGetStream to cusolverDnGetStream */
2129fbee547SJacob Faibussowitsch static inline hipsolverStatus_t hipsolverGetStream(hipsolverHandle_t handle, hipStream_t *stream)
213030f984aSJacob Faibussowitsch {
214030f984aSJacob Faibussowitsch   return cusolverDnGetStream(handle,stream);
215030f984aSJacob Faibussowitsch }
216030f984aSJacob Faibussowitsch 
217030f984aSJacob Faibussowitsch /* Alias hipsolverSetStream to cusolverDnSetStream */
2189fbee547SJacob Faibussowitsch static inline hipsolverStatus_t hipsolverSetStream(hipsolverHandle_t handle, hipStream_t stream)
219030f984aSJacob Faibussowitsch {
220030f984aSJacob Faibussowitsch   return cusolveDnSetStream(handle,stream);
221030f984aSJacob Faibussowitsch }
222030f984aSJacob Faibussowitsch #else /* __HIP_PLATFORM_HCC__ */
223030f984aSJacob Faibussowitsch typedef rocblas_handle hipsolverHandle_t;
224030f984aSJacob Faibussowitsch typedef rocblas_status hipsolverStatus_t;
225030f984aSJacob Faibussowitsch 
226030f984aSJacob Faibussowitsch /* Alias hipsolverDestroy to rocblas_destroy_handle */
2279fbee547SJacob Faibussowitsch static inline hipsolverStatus_t hipsolverDestroy(hipsolverHandle_t  hipsolverhandle)
228030f984aSJacob Faibussowitsch {
229030f984aSJacob Faibussowitsch   return rocblas_destroy_handle(hipsolverhandle);
230030f984aSJacob Faibussowitsch }
231030f984aSJacob Faibussowitsch 
232030f984aSJacob Faibussowitsch /* Alias hipsolverCreate to rocblas_destroy_handle */
2339fbee547SJacob Faibussowitsch static inline hipsolverStatus_t hipsolverCreate(hipsolverHandle_t *hipsolverhandle)
234030f984aSJacob Faibussowitsch {
235030f984aSJacob Faibussowitsch   return rocblas_create_handle(hipsolverhandle);
236030f984aSJacob Faibussowitsch }
237030f984aSJacob Faibussowitsch 
238030f984aSJacob Faibussowitsch /* Alias hipsolverGetStream to rocblas_get_stream */
2399fbee547SJacob Faibussowitsch static inline hipsolverStatus_t hipsolverGetStream(hipsolverHandle_t handle, hipStream_t *stream)
240030f984aSJacob Faibussowitsch {
241030f984aSJacob Faibussowitsch   return rocblas_get_stream(handle,stream);
242030f984aSJacob Faibussowitsch }
243030f984aSJacob Faibussowitsch 
244030f984aSJacob Faibussowitsch /* Alias hipsolverSetStream to rocblas_set_stream */
2459fbee547SJacob Faibussowitsch static inline hipsolverStatus_t hipsolverSetStream(hipsolverHandle_t handle, hipStream_t stream)
246030f984aSJacob Faibussowitsch {
247030f984aSJacob Faibussowitsch   return rocblas_set_stream(handle,stream);
248030f984aSJacob Faibussowitsch }
249030f984aSJacob Faibussowitsch #endif /* __HIP_PLATFORM_NVCC__ */
250030f984aSJacob Faibussowitsch PETSC_EXTERN hipStream_t    PetscDefaultHipStream; /* The default stream used by PETSc */
251030f984aSJacob Faibussowitsch 
252030f984aSJacob Faibussowitsch PETSC_EXTERN PetscErrorCode PetscHIPBLASGetHandle(hipblasHandle_t*);
253030f984aSJacob Faibussowitsch PETSC_EXTERN PetscErrorCode PetscHIPSOLVERGetHandle(hipsolverHandle_t*);
25407e4ef11SJacob Faibussowitsch #endif /* PETSC_HAVE_HIP */
255030f984aSJacob Faibussowitsch 
256cb9b7bb0SJacob Faibussowitsch /* Cannot use the device context api without C++ */
257cb9b7bb0SJacob Faibussowitsch #if defined(PETSC_HAVE_CXX)
258030f984aSJacob Faibussowitsch PETSC_EXTERN PetscErrorCode PetscDeviceInitializePackage(void);
259030f984aSJacob Faibussowitsch PETSC_EXTERN PetscErrorCode PetscDeviceFinalizePackage(void);
260030f984aSJacob Faibussowitsch 
261030f984aSJacob Faibussowitsch /* PetscDevice */
262a4af0ceeSJacob Faibussowitsch PETSC_EXTERN PetscErrorCode PetscDeviceInitialize(PetscDeviceType);
263a4af0ceeSJacob Faibussowitsch PETSC_EXTERN PetscBool      PetscDeviceInitialized(PetscDeviceType);
264a4af0ceeSJacob Faibussowitsch PETSC_EXTERN PetscErrorCode PetscDeviceCreate(PetscDeviceType,PetscInt,PetscDevice*);
265030f984aSJacob Faibussowitsch PETSC_EXTERN PetscErrorCode PetscDeviceConfigure(PetscDevice);
266a4af0ceeSJacob Faibussowitsch PETSC_EXTERN PetscErrorCode PetscDeviceView(PetscDevice,PetscViewer);
267030f984aSJacob Faibussowitsch PETSC_EXTERN PetscErrorCode PetscDeviceDestroy(PetscDevice*);
26891e63d38SStefano Zampini PETSC_EXTERN PetscErrorCode PetscDeviceGetDeviceId(PetscDevice,PetscInt*);
269030f984aSJacob Faibussowitsch 
270030f984aSJacob Faibussowitsch /* PetscDeviceContext */
271030f984aSJacob Faibussowitsch PETSC_EXTERN PetscErrorCode PetscDeviceContextCreate(PetscDeviceContext*);
272030f984aSJacob Faibussowitsch PETSC_EXTERN PetscErrorCode PetscDeviceContextDestroy(PetscDeviceContext*);
273030f984aSJacob Faibussowitsch PETSC_EXTERN PetscErrorCode PetscDeviceContextSetDevice(PetscDeviceContext,PetscDevice);
274030f984aSJacob Faibussowitsch PETSC_EXTERN PetscErrorCode PetscDeviceContextGetDevice(PetscDeviceContext,PetscDevice*);
275030f984aSJacob Faibussowitsch PETSC_EXTERN PetscErrorCode PetscDeviceContextSetStreamType(PetscDeviceContext,PetscStreamType);
276030f984aSJacob Faibussowitsch PETSC_EXTERN PetscErrorCode PetscDeviceContextGetStreamType(PetscDeviceContext,PetscStreamType*);
277030f984aSJacob Faibussowitsch PETSC_EXTERN PetscErrorCode PetscDeviceContextSetUp(PetscDeviceContext);
278030f984aSJacob Faibussowitsch PETSC_EXTERN PetscErrorCode PetscDeviceContextDuplicate(PetscDeviceContext,PetscDeviceContext*);
279030f984aSJacob Faibussowitsch PETSC_EXTERN PetscErrorCode PetscDeviceContextQueryIdle(PetscDeviceContext,PetscBool*);
280030f984aSJacob Faibussowitsch PETSC_EXTERN PetscErrorCode PetscDeviceContextWaitForContext(PetscDeviceContext,PetscDeviceContext);
281030f984aSJacob Faibussowitsch PETSC_EXTERN PetscErrorCode PetscDeviceContextFork(PetscDeviceContext,PetscInt,PetscDeviceContext**);
282030f984aSJacob Faibussowitsch PETSC_EXTERN PetscErrorCode PetscDeviceContextJoin(PetscDeviceContext,PetscInt,PetscDeviceContextJoinMode,PetscDeviceContext**);
283030f984aSJacob Faibussowitsch PETSC_EXTERN PetscErrorCode PetscDeviceContextSynchronize(PetscDeviceContext);
284030f984aSJacob Faibussowitsch PETSC_EXTERN PetscErrorCode PetscDeviceContextGetCurrentContext(PetscDeviceContext*);
285030f984aSJacob Faibussowitsch PETSC_EXTERN PetscErrorCode PetscDeviceContextSetCurrentContext(PetscDeviceContext);
286030f984aSJacob Faibussowitsch PETSC_EXTERN PetscErrorCode PetscDeviceContextSetFromOptions(MPI_Comm,const char[],PetscDeviceContext);
287cb9b7bb0SJacob Faibussowitsch #endif /* PETSC_HAVE_CXX */
28898921bdaSJacob Faibussowitsch 
289030f984aSJacob Faibussowitsch #endif /* PETSCDEVICE_H */
290