1use cuda_driver_sys::{cuGetErrorString, cudaError_enum};
11use std::error::Error;
12use std::ffi::CStr;
13use std::fmt;
14use std::mem;
15use std::os::raw::c_char;
16use std::ptr;
17use std::result::Result;
18
19#[repr(u32)]
21#[allow(missing_docs)]
22#[derive(Clone, Copy, Debug, Eq, PartialEq)]
23pub enum CudaError {
24 InvalidValue = 1,
26 OutOfMemory = 2,
27 NotInitialized = 3,
28 Deinitialized = 4,
29 ProfilerDisabled = 5,
30 ProfilerNotInitialized = 6,
31 ProfilerAlreadyStarted = 7,
32 ProfilerAlreadyStopped = 8,
33 NoDevice = 100,
34 InvalidDevice = 101,
35 InvalidImage = 200,
36 InvalidContext = 201,
37 ContextAlreadyCurrent = 202,
38 MapFailed = 205,
39 UnmapFailed = 206,
40 ArrayIsMapped = 207,
41 AlreadyMapped = 208,
42 NoBinaryForGpu = 209,
43 AlreadyAcquired = 210,
44 NotMapped = 211,
45 NotMappedAsArray = 212,
46 NotMappedAsPointer = 213,
47 EccUncorrectable = 214,
48 UnsupportedLimit = 215,
49 ContextAlreadyInUse = 216,
50 PeerAccessUnsupported = 217,
51 InvalidPtx = 218,
52 InvalidGraphicsContext = 219,
53 NvlinkUncorrectable = 220,
54 InvalidSouce = 300,
55 FileNotFound = 301,
56 SharedObjectSymbolNotFound = 302,
57 SharedObjectInitFailed = 303,
58 OperatingSystemError = 304,
59 InvalidHandle = 400,
60 NotFound = 500,
61 NotReady = 600,
62 IllegalAddress = 700,
63 LaunchOutOfResources = 701,
64 LaunchTimeout = 702,
65 LaunchIncompatibleTexturing = 703,
66 PeerAccessAlreadyEnabled = 704,
67 PeerAccessNotEnabled = 705,
68 PrimaryContextActive = 708,
69 ContextIsDestroyed = 709,
70 AssertError = 710,
71 TooManyPeers = 711,
72 HostMemoryAlreadyRegistered = 712,
73 HostMemoryNotRegistered = 713,
74 HardwareStackError = 714,
75 IllegalInstruction = 715,
76 MisalignedAddress = 716,
77 InvalidAddressSpace = 717,
78 InvalidProgramCounter = 718,
79 LaunchFailed = 719,
80 NotPermitted = 800,
81 NotSupported = 801,
82 UnknownError = 999,
83
84 InvalidMemoryAllocation = 100_100,
86
87 #[doc(hidden)]
88 __Nonexhaustive,
89}
90impl fmt::Display for CudaError {
91 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
92 match *self {
93 CudaError::InvalidMemoryAllocation => write!(f, "Invalid memory allocation"),
94 CudaError::__Nonexhaustive => write!(f, "__Nonexhaustive"),
95 other if (other as u32) <= 999 => {
96 let value = other as u32;
97 let mut ptr: *const c_char = ptr::null();
98 unsafe {
99 cuGetErrorString(mem::transmute(value), &mut ptr as *mut *const c_char)
100 .to_result()
101 .map_err(|_| fmt::Error)?;
102 let cstr = CStr::from_ptr(ptr);
103 write!(f, "{:?}", cstr)
104 }
105 }
106 _ => write!(f, "Unknown error"),
108 }
109 }
110}
111impl Error for CudaError {}
112
113pub type CudaResult<T> = Result<T, CudaError>;
115
116pub type DropResult<T> = Result<(), (CudaError, T)>;
118
119pub(crate) trait ToResult {
120 fn to_result(self) -> CudaResult<()>;
121}
122impl ToResult for cudaError_enum {
123 fn to_result(self) -> CudaResult<()> {
124 match self {
125 cudaError_enum::CUDA_SUCCESS => Ok(()),
126 cudaError_enum::CUDA_ERROR_INVALID_VALUE => Err(CudaError::InvalidValue),
127 cudaError_enum::CUDA_ERROR_OUT_OF_MEMORY => Err(CudaError::OutOfMemory),
128 cudaError_enum::CUDA_ERROR_NOT_INITIALIZED => Err(CudaError::NotInitialized),
129 cudaError_enum::CUDA_ERROR_DEINITIALIZED => Err(CudaError::Deinitialized),
130 cudaError_enum::CUDA_ERROR_PROFILER_DISABLED => Err(CudaError::ProfilerDisabled),
131 cudaError_enum::CUDA_ERROR_PROFILER_NOT_INITIALIZED => {
132 Err(CudaError::ProfilerNotInitialized)
133 }
134 cudaError_enum::CUDA_ERROR_PROFILER_ALREADY_STARTED => {
135 Err(CudaError::ProfilerAlreadyStarted)
136 }
137 cudaError_enum::CUDA_ERROR_PROFILER_ALREADY_STOPPED => {
138 Err(CudaError::ProfilerAlreadyStopped)
139 }
140 cudaError_enum::CUDA_ERROR_NO_DEVICE => Err(CudaError::NoDevice),
141 cudaError_enum::CUDA_ERROR_INVALID_DEVICE => Err(CudaError::InvalidDevice),
142 cudaError_enum::CUDA_ERROR_INVALID_IMAGE => Err(CudaError::InvalidImage),
143 cudaError_enum::CUDA_ERROR_INVALID_CONTEXT => Err(CudaError::InvalidContext),
144 cudaError_enum::CUDA_ERROR_CONTEXT_ALREADY_CURRENT => {
145 Err(CudaError::ContextAlreadyCurrent)
146 }
147 cudaError_enum::CUDA_ERROR_MAP_FAILED => Err(CudaError::MapFailed),
148 cudaError_enum::CUDA_ERROR_UNMAP_FAILED => Err(CudaError::UnmapFailed),
149 cudaError_enum::CUDA_ERROR_ARRAY_IS_MAPPED => Err(CudaError::ArrayIsMapped),
150 cudaError_enum::CUDA_ERROR_ALREADY_MAPPED => Err(CudaError::AlreadyMapped),
151 cudaError_enum::CUDA_ERROR_NO_BINARY_FOR_GPU => Err(CudaError::NoBinaryForGpu),
152 cudaError_enum::CUDA_ERROR_ALREADY_ACQUIRED => Err(CudaError::AlreadyAcquired),
153 cudaError_enum::CUDA_ERROR_NOT_MAPPED => Err(CudaError::NotMapped),
154 cudaError_enum::CUDA_ERROR_NOT_MAPPED_AS_ARRAY => Err(CudaError::NotMappedAsArray),
155 cudaError_enum::CUDA_ERROR_NOT_MAPPED_AS_POINTER => Err(CudaError::NotMappedAsPointer),
156 cudaError_enum::CUDA_ERROR_ECC_UNCORRECTABLE => Err(CudaError::EccUncorrectable),
157 cudaError_enum::CUDA_ERROR_UNSUPPORTED_LIMIT => Err(CudaError::UnsupportedLimit),
158 cudaError_enum::CUDA_ERROR_CONTEXT_ALREADY_IN_USE => {
159 Err(CudaError::ContextAlreadyInUse)
160 }
161 cudaError_enum::CUDA_ERROR_PEER_ACCESS_UNSUPPORTED => {
162 Err(CudaError::PeerAccessUnsupported)
163 }
164 cudaError_enum::CUDA_ERROR_INVALID_PTX => Err(CudaError::InvalidPtx),
165 cudaError_enum::CUDA_ERROR_INVALID_GRAPHICS_CONTEXT => {
166 Err(CudaError::InvalidGraphicsContext)
167 }
168 cudaError_enum::CUDA_ERROR_NVLINK_UNCORRECTABLE => Err(CudaError::NvlinkUncorrectable),
169 cudaError_enum::CUDA_ERROR_INVALID_SOURCE => Err(CudaError::InvalidSouce),
170 cudaError_enum::CUDA_ERROR_FILE_NOT_FOUND => Err(CudaError::FileNotFound),
171 cudaError_enum::CUDA_ERROR_SHARED_OBJECT_SYMBOL_NOT_FOUND => {
172 Err(CudaError::SharedObjectSymbolNotFound)
173 }
174 cudaError_enum::CUDA_ERROR_SHARED_OBJECT_INIT_FAILED => {
175 Err(CudaError::SharedObjectInitFailed)
176 }
177 cudaError_enum::CUDA_ERROR_OPERATING_SYSTEM => Err(CudaError::OperatingSystemError),
178 cudaError_enum::CUDA_ERROR_INVALID_HANDLE => Err(CudaError::InvalidHandle),
179 cudaError_enum::CUDA_ERROR_NOT_FOUND => Err(CudaError::NotFound),
180 cudaError_enum::CUDA_ERROR_NOT_READY => Err(CudaError::NotReady),
181 cudaError_enum::CUDA_ERROR_ILLEGAL_ADDRESS => Err(CudaError::IllegalAddress),
182 cudaError_enum::CUDA_ERROR_LAUNCH_OUT_OF_RESOURCES => {
183 Err(CudaError::LaunchOutOfResources)
184 }
185 cudaError_enum::CUDA_ERROR_LAUNCH_TIMEOUT => Err(CudaError::LaunchTimeout),
186 cudaError_enum::CUDA_ERROR_LAUNCH_INCOMPATIBLE_TEXTURING => {
187 Err(CudaError::LaunchIncompatibleTexturing)
188 }
189 cudaError_enum::CUDA_ERROR_PEER_ACCESS_ALREADY_ENABLED => {
190 Err(CudaError::PeerAccessAlreadyEnabled)
191 }
192 cudaError_enum::CUDA_ERROR_PEER_ACCESS_NOT_ENABLED => {
193 Err(CudaError::PeerAccessNotEnabled)
194 }
195 cudaError_enum::CUDA_ERROR_PRIMARY_CONTEXT_ACTIVE => {
196 Err(CudaError::PrimaryContextActive)
197 }
198 cudaError_enum::CUDA_ERROR_CONTEXT_IS_DESTROYED => Err(CudaError::ContextIsDestroyed),
199 cudaError_enum::CUDA_ERROR_ASSERT => Err(CudaError::AssertError),
200 cudaError_enum::CUDA_ERROR_TOO_MANY_PEERS => Err(CudaError::TooManyPeers),
201 cudaError_enum::CUDA_ERROR_HOST_MEMORY_ALREADY_REGISTERED => {
202 Err(CudaError::HostMemoryAlreadyRegistered)
203 }
204 cudaError_enum::CUDA_ERROR_HOST_MEMORY_NOT_REGISTERED => {
205 Err(CudaError::HostMemoryNotRegistered)
206 }
207 cudaError_enum::CUDA_ERROR_HARDWARE_STACK_ERROR => Err(CudaError::HardwareStackError),
208 cudaError_enum::CUDA_ERROR_ILLEGAL_INSTRUCTION => Err(CudaError::IllegalInstruction),
209 cudaError_enum::CUDA_ERROR_MISALIGNED_ADDRESS => Err(CudaError::MisalignedAddress),
210 cudaError_enum::CUDA_ERROR_INVALID_ADDRESS_SPACE => Err(CudaError::InvalidAddressSpace),
211 cudaError_enum::CUDA_ERROR_INVALID_PC => Err(CudaError::InvalidProgramCounter),
212 cudaError_enum::CUDA_ERROR_LAUNCH_FAILED => Err(CudaError::LaunchFailed),
213 cudaError_enum::CUDA_ERROR_NOT_PERMITTED => Err(CudaError::NotPermitted),
214 cudaError_enum::CUDA_ERROR_NOT_SUPPORTED => Err(CudaError::NotSupported),
215 _ => Err(CudaError::UnknownError),
216 }
217 }
218}