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