1 // Copyright (c) 2017-2026, Lawrence Livermore National Security, LLC and other CEED contributors.
2 // All Rights Reserved. See the top-level LICENSE and NOTICE files for details.
3 //
4 // SPDX-License-Identifier: BSD-2-Clause
5 //
6 // This file is part of CEED: http://github.com/ceed
7 #pragma once
8
9 #include <ceed.h>
10 #include <ceed/backend.h>
11 #include <cublas_v2.h>
12 #include <cuda.h>
13
14 #define QUOTE(...) #__VA_ARGS__
15
16 #define CeedChk_Cu(ceed, x) \
17 do { \
18 CUresult cuda_result = (CUresult)x; \
19 if (cuda_result != CUDA_SUCCESS) { \
20 const char *msg; \
21 cuGetErrorName(cuda_result, &msg); \
22 return CeedError((ceed), CEED_ERROR_BACKEND, msg); \
23 } \
24 } while (0)
25
26 #define CeedChk_Cublas(ceed, x) \
27 do { \
28 cublasStatus_t cublas_result = x; \
29 if (cublas_result != CUBLAS_STATUS_SUCCESS) { \
30 const char *msg = cublasGetErrorName(cublas_result); \
31 return CeedError((ceed), CEED_ERROR_BACKEND, msg); \
32 } \
33 } while (0)
34
35 #define CeedCallCuda(ceed, ...) \
36 do { \
37 int ierr_q_ = __VA_ARGS__; \
38 CeedChk_Cu(ceed, ierr_q_); \
39 } while (0)
40
41 #define CeedCallCublas(ceed, ...) \
42 do { \
43 int ierr_q_ = __VA_ARGS__; \
44 CeedChk_Cublas(ceed, ierr_q_); \
45 } while (0)
46
47 #define CASE(name) \
48 case name: \
49 return #name
50 // LCOV_EXCL_START
cublasGetErrorName(cublasStatus_t error)51 static const char *cublasGetErrorName(cublasStatus_t error) {
52 switch (error) {
53 CASE(CUBLAS_STATUS_SUCCESS);
54 CASE(CUBLAS_STATUS_NOT_INITIALIZED);
55 CASE(CUBLAS_STATUS_ALLOC_FAILED);
56 CASE(CUBLAS_STATUS_INVALID_VALUE);
57 CASE(CUBLAS_STATUS_ARCH_MISMATCH);
58 CASE(CUBLAS_STATUS_MAPPING_ERROR);
59 CASE(CUBLAS_STATUS_EXECUTION_FAILED);
60 CASE(CUBLAS_STATUS_INTERNAL_ERROR);
61 default:
62 return "CUBLAS_STATUS_UNKNOWN_ERROR";
63 }
64 }
65 // LCOV_EXCL_STOP
66
67 typedef struct {
68 int device_id;
69 bool use_llvm_version;
70 int llvm_version;
71 cublasHandle_t cublas_handle;
72 struct cudaDeviceProp device_prop;
73 } Ceed_Cuda;
74
75 CEED_INTERN int CeedInit_Cuda(Ceed ceed, const char *resource);
76
77 CEED_INTERN int CeedDestroy_Cuda(Ceed ceed);
78
79 CEED_INTERN int CeedSetDeviceBoolArray_Cuda(Ceed ceed, const bool *source_array, CeedCopyMode copy_mode, CeedSize num_values,
80 const bool **target_array_owned, const bool **target_array_borrowed, const bool **target_array);
81 CEED_INTERN int CeedSetDeviceCeedInt8Array_Cuda(Ceed ceed, const CeedInt8 *source_array, CeedCopyMode copy_mode, CeedSize num_values,
82 const CeedInt8 **target_array_owned, const CeedInt8 **target_array_borrowed,
83 const CeedInt8 **target_array);
84 CEED_INTERN int CeedSetDeviceCeedIntArray_Cuda(Ceed ceed, const CeedInt *source_array, CeedCopyMode copy_mode, CeedSize num_values,
85 const CeedInt **target_array_owned, const CeedInt **target_array_borrowed,
86 const CeedInt **target_array);
87 CEED_INTERN int CeedSetDeviceCeedScalarArray_Cuda(Ceed ceed, const CeedScalar *source_array, CeedCopyMode copy_mode, CeedSize num_values,
88 const CeedScalar **target_array_owned, const CeedScalar **target_array_borrowed,
89 const CeedScalar **target_array);
90