1#![allow(deprecated)]
2
3use std::{
4 ffi::{CStr, NulError},
5 fmt::{self, Display, Formatter},
6 io,
7};
8
9use num_enum::{IntoPrimitive, TryFromPrimitive};
10use singe_core::impl_enum_conversion;
11use thiserror::Error;
12
13use singe_cuda_sys::{nvrtc, nvvm, runtime};
14
15use crate::nvrtc::Status as NvrtcStatus;
16use crate::nvvm::Status as NvvmStatus;
17
18#[derive(Error, Debug)]
19pub enum Error {
20 #[error("cuda error ({code}): {message}")]
21 Cuda { code: Status, message: String },
22
23 #[error("nvrtc error ({code}): {message}")]
24 Nvrtc { code: NvrtcStatus, message: String },
25
26 #[error("nvvm error ({code}): {message}")]
27 Nvvm { code: NvvmStatus, message: String },
28
29 #[error("string contains interior nul byte")]
30 InteriorNul,
31
32 #[error("io error: {0}")]
33 Io(#[from] io::Error),
34
35 #[error("device not found")]
36 DeviceNotFound,
37
38 #[error("invalid memory access")]
39 InvalidMemoryAccess,
40 #[error("invalid memory allocation request")]
41 InvalidMemoryAllocationRequest,
42 #[error("unexpected null handle")]
43 NullHandle,
44 #[error("invalid value")]
45 InvalidValue,
46
47 #[error("operation graph required")]
48 GraphOperationRequired,
49 #[error("graph dependency mismatch")]
50 GraphDependencyMismatch,
51}
52
53pub type Result<T> = std::result::Result<T, Error>;
54
55#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, TryFromPrimitive, IntoPrimitive)]
56#[repr(u32)]
57pub enum Status {
58 Success = runtime::cudaError_t::CUDA_SUCCESS as _,
59 InvalidValue = runtime::cudaError_t::CUDA_ERROR_INVALID_VALUE as _,
60 OutOfMemory = runtime::cudaError_t::CUDA_ERROR_OUT_OF_MEMORY as _,
61 NotInitialized = runtime::cudaError_t::CUDA_ERROR_NOT_INITIALIZED as _,
62 Deinitialized = runtime::cudaError_t::CUDA_ERROR_DEINITIALIZED as _,
63 ProfilerDisabled = runtime::cudaError_t::CUDA_ERROR_PROFILER_DISABLED as _,
64 #[deprecated]
65 ProfilerNotInitialized = runtime::cudaError_t::CUDA_ERROR_PROFILER_NOT_INITIALIZED as _,
66 #[deprecated]
67 ProfilerAlreadyStarted = runtime::cudaError_t::CUDA_ERROR_PROFILER_ALREADY_STARTED as _,
68 #[deprecated]
69 ProfilerAlreadyStopped = runtime::cudaError_t::CUDA_ERROR_PROFILER_ALREADY_STOPPED as _,
70 StubLibrary = runtime::cudaError_t::CUDA_ERROR_STUB_LIBRARY as _,
71 CallRequiresNewerDriver = runtime::cudaError_t::CUDA_ERROR_CALL_REQUIRES_NEWER_DRIVER as _,
72 DeviceUnavailable = runtime::cudaError_t::CUDA_ERROR_DEVICE_UNAVAILABLE as _,
73 NoDevice = runtime::cudaError_t::CUDA_ERROR_NO_DEVICE as _,
74 InvalidDevice = runtime::cudaError_t::CUDA_ERROR_INVALID_DEVICE as _,
75 DeviceNotLicensed = runtime::cudaError_t::CUDA_ERROR_DEVICE_NOT_LICENSED as _,
76 InvalidImage = runtime::cudaError_t::CUDA_ERROR_INVALID_IMAGE as _,
77 InvalidContext = runtime::cudaError_t::CUDA_ERROR_INVALID_CONTEXT as _,
78 #[deprecated]
79 ContextAlreadyCurrent = runtime::cudaError_t::CUDA_ERROR_CONTEXT_ALREADY_CURRENT as _,
80 MapFailed = runtime::cudaError_t::CUDA_ERROR_MAP_FAILED as _,
81 UnmapFailed = runtime::cudaError_t::CUDA_ERROR_UNMAP_FAILED as _,
82 ArrayIsMapped = runtime::cudaError_t::CUDA_ERROR_ARRAY_IS_MAPPED as _,
83 AlreadyMapped = runtime::cudaError_t::CUDA_ERROR_ALREADY_MAPPED as _,
84 NoBinaryForGpu = runtime::cudaError_t::CUDA_ERROR_NO_BINARY_FOR_GPU as _,
85 AlreadyAcquired = runtime::cudaError_t::CUDA_ERROR_ALREADY_ACQUIRED as _,
86 NotMapped = runtime::cudaError_t::CUDA_ERROR_NOT_MAPPED as _,
87 NotMappedAsArray = runtime::cudaError_t::CUDA_ERROR_NOT_MAPPED_AS_ARRAY as _,
88 NotMappedAsPointer = runtime::cudaError_t::CUDA_ERROR_NOT_MAPPED_AS_POINTER as _,
89 EccUncorrectable = runtime::cudaError_t::CUDA_ERROR_ECC_UNCORRECTABLE as _,
90 UnsupportedLimit = runtime::cudaError_t::CUDA_ERROR_UNSUPPORTED_LIMIT as _,
91 ContextAlreadyInUse = runtime::cudaError_t::CUDA_ERROR_CONTEXT_ALREADY_IN_USE as _,
92 PeerAccessUnsupported = runtime::cudaError_t::CUDA_ERROR_PEER_ACCESS_UNSUPPORTED as _,
93 InvalidPtx = runtime::cudaError_t::CUDA_ERROR_INVALID_PTX as _,
94 InvalidGraphicsContext = runtime::cudaError_t::CUDA_ERROR_INVALID_GRAPHICS_CONTEXT as _,
95 NvlinkUncorrectable = runtime::cudaError_t::CUDA_ERROR_NVLINK_UNCORRECTABLE as _,
96 JitCompilerNotFound = runtime::cudaError_t::CUDA_ERROR_JIT_COMPILER_NOT_FOUND as _,
97 UnsupportedPtxVersion = runtime::cudaError_t::CUDA_ERROR_UNSUPPORTED_PTX_VERSION as _,
98 JitCompilationDisabled = runtime::cudaError_t::CUDA_ERROR_JIT_COMPILATION_DISABLED as _,
99 UnsupportedExecAffinity = runtime::cudaError_t::CUDA_ERROR_UNSUPPORTED_EXEC_AFFINITY as _,
100 UnsupportedDevsideSync = runtime::cudaError_t::CUDA_ERROR_UNSUPPORTED_DEVSIDE_SYNC as _,
101 Contained = runtime::cudaError_t::CUDA_ERROR_CONTAINED as _,
102 InvalidSource = runtime::cudaError_t::CUDA_ERROR_INVALID_SOURCE as _,
103 FileNotFound = runtime::cudaError_t::CUDA_ERROR_FILE_NOT_FOUND as _,
104 SharedObjectSymbolNotFound =
105 runtime::cudaError_t::CUDA_ERROR_SHARED_OBJECT_SYMBOL_NOT_FOUND as _,
106 SharedObjectInitFailed = runtime::cudaError_t::CUDA_ERROR_SHARED_OBJECT_INIT_FAILED as _,
107 OperatingSystem = runtime::cudaError_t::CUDA_ERROR_OPERATING_SYSTEM as _,
108 InvalidHandle = runtime::cudaError_t::CUDA_ERROR_INVALID_HANDLE as _,
109 IllegalState = runtime::cudaError_t::CUDA_ERROR_ILLEGAL_STATE as _,
110 LossyQuery = runtime::cudaError_t::CUDA_ERROR_LOSSY_QUERY as _,
111 NotFound = runtime::cudaError_t::CUDA_ERROR_NOT_FOUND as _,
112 NotReady = runtime::cudaError_t::CUDA_ERROR_NOT_READY as _,
113 IllegalAddress = runtime::cudaError_t::CUDA_ERROR_ILLEGAL_ADDRESS as _,
114 LaunchOutOfResources = runtime::cudaError_t::CUDA_ERROR_LAUNCH_OUT_OF_RESOURCES as _,
115 LaunchTimeout = runtime::cudaError_t::CUDA_ERROR_LAUNCH_TIMEOUT as _,
116 LaunchIncompatibleTexturing =
117 runtime::cudaError_t::CUDA_ERROR_LAUNCH_INCOMPATIBLE_TEXTURING as _,
118 PeerAccessAlreadyEnabled = runtime::cudaError_t::CUDA_ERROR_PEER_ACCESS_ALREADY_ENABLED as _,
119 PeerAccessNotEnabled = runtime::cudaError_t::CUDA_ERROR_PEER_ACCESS_NOT_ENABLED as _,
120 PrimaryContextActive = runtime::cudaError_t::CUDA_ERROR_PRIMARY_CONTEXT_ACTIVE as _,
121 ContextIsDestroyed = runtime::cudaError_t::CUDA_ERROR_CONTEXT_IS_DESTROYED as _,
122 Assert = runtime::cudaError_t::CUDA_ERROR_ASSERT as _,
123 TooManyPeers = runtime::cudaError_t::CUDA_ERROR_TOO_MANY_PEERS as _,
124 HostMemoryAlreadyRegistered =
125 runtime::cudaError_t::CUDA_ERROR_HOST_MEMORY_ALREADY_REGISTERED as _,
126 HostMemoryNotRegistered = runtime::cudaError_t::CUDA_ERROR_HOST_MEMORY_NOT_REGISTERED as _,
127 HardwareStackError = runtime::cudaError_t::CUDA_ERROR_HARDWARE_STACK_ERROR as _,
128 IllegalInstruction = runtime::cudaError_t::CUDA_ERROR_ILLEGAL_INSTRUCTION as _,
129 MisalignedAddress = runtime::cudaError_t::CUDA_ERROR_MISALIGNED_ADDRESS as _,
130 InvalidAddressSpace = runtime::cudaError_t::CUDA_ERROR_INVALID_ADDRESS_SPACE as _,
131 InvalidPc = runtime::cudaError_t::CUDA_ERROR_INVALID_PC as _,
132 LaunchFailed = runtime::cudaError_t::CUDA_ERROR_LAUNCH_FAILED as _,
133 CooperativeLaunchTooLarge = runtime::cudaError_t::CUDA_ERROR_COOPERATIVE_LAUNCH_TOO_LARGE as _,
134 TensorMemoryLeak = runtime::cudaError_t::CUDA_ERROR_TENSOR_MEMORY_LEAK as _,
135 NotPermitted = runtime::cudaError_t::CUDA_ERROR_NOT_PERMITTED as _,
136 NotSupported = runtime::cudaError_t::CUDA_ERROR_NOT_SUPPORTED as _,
137 SystemNotReady = runtime::cudaError_t::CUDA_ERROR_SYSTEM_NOT_READY as _,
138 SystemDriverMismatch = runtime::cudaError_t::CUDA_ERROR_SYSTEM_DRIVER_MISMATCH as _,
139 CompatNotSupportedOnDevice =
140 runtime::cudaError_t::CUDA_ERROR_COMPAT_NOT_SUPPORTED_ON_DEVICE as _,
141 MpsConnectionFailed = runtime::cudaError_t::CUDA_ERROR_MPS_CONNECTION_FAILED as _,
142 MpsRpcFailure = runtime::cudaError_t::CUDA_ERROR_MPS_RPC_FAILURE as _,
143 MpsServerNotReady = runtime::cudaError_t::CUDA_ERROR_MPS_SERVER_NOT_READY as _,
144 MpsMaxClientsReached = runtime::cudaError_t::CUDA_ERROR_MPS_MAX_CLIENTS_REACHED as _,
145 MpsMaxConnectionsReached = runtime::cudaError_t::CUDA_ERROR_MPS_MAX_CONNECTIONS_REACHED as _,
146 MpsClientTerminated = runtime::cudaError_t::CUDA_ERROR_MPS_CLIENT_TERMINATED as _,
147 CdpNotSupported = runtime::cudaError_t::CUDA_ERROR_CDP_NOT_SUPPORTED as _,
148 CdpVersionMismatch = runtime::cudaError_t::CUDA_ERROR_CDP_VERSION_MISMATCH as _,
149 StreamCaptureUnsupported = runtime::cudaError_t::CUDA_ERROR_STREAM_CAPTURE_UNSUPPORTED as _,
150 StreamCaptureInvalidated = runtime::cudaError_t::CUDA_ERROR_STREAM_CAPTURE_INVALIDATED as _,
151 StreamCaptureMerge = runtime::cudaError_t::CUDA_ERROR_STREAM_CAPTURE_MERGE as _,
152 StreamCaptureUnmatched = runtime::cudaError_t::CUDA_ERROR_STREAM_CAPTURE_UNMATCHED as _,
153 StreamCaptureUnjoined = runtime::cudaError_t::CUDA_ERROR_STREAM_CAPTURE_UNJOINED as _,
154 StreamCaptureIsolation = runtime::cudaError_t::CUDA_ERROR_STREAM_CAPTURE_ISOLATION as _,
155 StreamCaptureImplicit = runtime::cudaError_t::CUDA_ERROR_STREAM_CAPTURE_IMPLICIT as _,
156 CapturedEvent = runtime::cudaError_t::CUDA_ERROR_CAPTURED_EVENT as _,
157 StreamCaptureWrongThread = runtime::cudaError_t::CUDA_ERROR_STREAM_CAPTURE_WRONG_THREAD as _,
158 Timeout = runtime::cudaError_t::CUDA_ERROR_TIMEOUT as _,
159 GraphExecUpdateFailure = runtime::cudaError_t::CUDA_ERROR_GRAPH_EXEC_UPDATE_FAILURE as _,
160 ExternalDevice = runtime::cudaError_t::CUDA_ERROR_EXTERNAL_DEVICE as _,
161 InvalidClusterSize = runtime::cudaError_t::CUDA_ERROR_INVALID_CLUSTER_SIZE as _,
162 FunctionNotLoaded = runtime::cudaError_t::CUDA_ERROR_FUNCTION_NOT_LOADED as _,
163 InvalidResourceType = runtime::cudaError_t::CUDA_ERROR_INVALID_RESOURCE_TYPE as _,
164 InvalidResourceConfiguration =
165 runtime::cudaError_t::CUDA_ERROR_INVALID_RESOURCE_CONFIGURATION as _,
166 KeyRotation = runtime::cudaError_t::CUDA_ERROR_KEY_ROTATION as _,
167 StreamDetached = runtime::cudaError_t::CUDA_ERROR_STREAM_DETACHED as _,
168 Unknown = runtime::cudaError_t::CUDA_ERROR_UNKNOWN as _,
169}
170
171impl_enum_conversion!(runtime::cudaError_t, Status);
172
173impl Status {
174 pub fn description(self) -> String {
175 unsafe {
176 let ptr = runtime::cudaGetErrorString(self.into());
177 if ptr.is_null() {
178 String::from("unknown cuda error")
179 } else {
180 CStr::from_ptr(ptr).to_string_lossy().into_owned()
181 }
182 }
183 }
184}
185
186impl Display for Status {
187 fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
188 match self {
189 Self::Success => write!(f, "CUDA_SUCCESS"),
190 Self::InvalidValue => write!(f, "CUDA_ERROR_INVALID_VALUE"),
191 Self::OutOfMemory => write!(f, "CUDA_ERROR_OUT_OF_MEMORY"),
192 Self::NotInitialized => write!(f, "CUDA_ERROR_NOT_INITIALIZED"),
193 Self::Deinitialized => write!(f, "CUDA_ERROR_DEINITIALIZED"),
194 Self::ProfilerDisabled => write!(f, "CUDA_ERROR_PROFILER_DISABLED"),
195 Self::ProfilerNotInitialized => write!(f, "CUDA_ERROR_PROFILER_NOT_INITIALIZED"),
196 Self::ProfilerAlreadyStarted => write!(f, "CUDA_ERROR_PROFILER_ALREADY_STARTED"),
197 Self::ProfilerAlreadyStopped => write!(f, "CUDA_ERROR_PROFILER_ALREADY_STOPPED"),
198 Self::StubLibrary => write!(f, "CUDA_ERROR_STUB_LIBRARY"),
199 Self::CallRequiresNewerDriver => {
200 write!(f, "CUDA_ERROR_CALL_REQUIRES_NEWER_DRIVER")
201 }
202 Self::DeviceUnavailable => write!(f, "CUDA_ERROR_DEVICE_UNAVAILABLE"),
203 Self::NoDevice => write!(f, "CUDA_ERROR_NO_DEVICE"),
204 Self::InvalidDevice => write!(f, "CUDA_ERROR_INVALID_DEVICE"),
205 Self::DeviceNotLicensed => write!(f, "CUDA_ERROR_DEVICE_NOT_LICENSED"),
206 Self::InvalidImage => write!(f, "CUDA_ERROR_INVALID_IMAGE"),
207 Self::InvalidContext => write!(f, "CUDA_ERROR_INVALID_CONTEXT"),
208 Self::ContextAlreadyCurrent => write!(f, "CUDA_ERROR_CONTEXT_ALREADY_CURRENT"),
209 Self::MapFailed => write!(f, "CUDA_ERROR_MAP_FAILED"),
210 Self::UnmapFailed => write!(f, "CUDA_ERROR_UNMAP_FAILED"),
211 Self::ArrayIsMapped => write!(f, "CUDA_ERROR_ARRAY_IS_MAPPED"),
212 Self::AlreadyMapped => write!(f, "CUDA_ERROR_ALREADY_MAPPED"),
213 Self::NoBinaryForGpu => write!(f, "CUDA_ERROR_NO_BINARY_FOR_GPU"),
214 Self::AlreadyAcquired => write!(f, "CUDA_ERROR_ALREADY_ACQUIRED"),
215 Self::NotMapped => write!(f, "CUDA_ERROR_NOT_MAPPED"),
216 Self::NotMappedAsArray => write!(f, "CUDA_ERROR_NOT_MAPPED_AS_ARRAY"),
217 Self::NotMappedAsPointer => write!(f, "CUDA_ERROR_NOT_MAPPED_AS_POINTER"),
218 Self::EccUncorrectable => write!(f, "CUDA_ERROR_ECC_UNCORRECTABLE"),
219 Self::UnsupportedLimit => write!(f, "CUDA_ERROR_UNSUPPORTED_LIMIT"),
220 Self::ContextAlreadyInUse => write!(f, "CUDA_ERROR_CONTEXT_ALREADY_IN_USE"),
221 Self::PeerAccessUnsupported => write!(f, "CUDA_ERROR_PEER_ACCESS_UNSUPPORTED"),
222 Self::InvalidPtx => write!(f, "CUDA_ERROR_INVALID_PTX"),
223 Self::InvalidGraphicsContext => {
224 write!(f, "CUDA_ERROR_INVALID_GRAPHICS_CONTEXT")
225 }
226 Self::NvlinkUncorrectable => write!(f, "CUDA_ERROR_NVLINK_UNCORRECTABLE"),
227 Self::JitCompilerNotFound => write!(f, "CUDA_ERROR_JIT_COMPILER_NOT_FOUND"),
228 Self::UnsupportedPtxVersion => write!(f, "CUDA_ERROR_UNSUPPORTED_PTX_VERSION"),
229 Self::JitCompilationDisabled => write!(f, "CUDA_ERROR_JIT_COMPILATION_DISABLED"),
230 Self::UnsupportedExecAffinity => write!(f, "CUDA_ERROR_UNSUPPORTED_EXEC_AFFINITY"),
231 Self::UnsupportedDevsideSync => write!(f, "CUDA_ERROR_UNSUPPORTED_DEVSIDE_SYNC"),
232 Self::Contained => write!(f, "CUDA_ERROR_CONTAINED"),
233 Self::InvalidSource => write!(f, "CUDA_ERROR_INVALID_SOURCE"),
234 Self::FileNotFound => write!(f, "CUDA_ERROR_FILE_NOT_FOUND"),
235 Self::SharedObjectSymbolNotFound => {
236 write!(f, "CUDA_ERROR_SHARED_OBJECT_SYMBOL_NOT_FOUND")
237 }
238 Self::SharedObjectInitFailed => write!(f, "CUDA_ERROR_SHARED_OBJECT_INIT_FAILED"),
239 Self::OperatingSystem => write!(f, "CUDA_ERROR_OPERATING_SYSTEM"),
240 Self::InvalidHandle => write!(f, "CUDA_ERROR_INVALID_HANDLE"),
241 Self::IllegalState => write!(f, "CUDA_ERROR_ILLEGAL_STATE"),
242 Self::LossyQuery => write!(f, "CUDA_ERROR_LOSSY_QUERY"),
243 Self::NotFound => write!(f, "CUDA_ERROR_NOT_FOUND"),
244 Self::NotReady => write!(f, "CUDA_ERROR_NOT_READY"),
245 Self::IllegalAddress => write!(f, "CUDA_ERROR_ILLEGAL_ADDRESS"),
246 Self::LaunchOutOfResources => write!(f, "CUDA_ERROR_LAUNCH_OUT_OF_RESOURCES"),
247 Self::LaunchTimeout => write!(f, "CUDA_ERROR_LAUNCH_TIMEOUT"),
248 Self::LaunchIncompatibleTexturing => {
249 write!(f, "CUDA_ERROR_LAUNCH_INCOMPATIBLE_TEXTURING")
250 }
251 Self::PeerAccessAlreadyEnabled => {
252 write!(f, "CUDA_ERROR_PEER_ACCESS_ALREADY_ENABLED")
253 }
254 Self::PeerAccessNotEnabled => write!(f, "CUDA_ERROR_PEER_ACCESS_NOT_ENABLED"),
255 Self::PrimaryContextActive => write!(f, "CUDA_ERROR_PRIMARY_CONTEXT_ACTIVE"),
256 Self::ContextIsDestroyed => write!(f, "CUDA_ERROR_CONTEXT_IS_DESTROYED"),
257 Self::Assert => write!(f, "CUDA_ERROR_ASSERT"),
258 Self::TooManyPeers => write!(f, "CUDA_ERROR_TOO_MANY_PEERS"),
259 Self::HostMemoryAlreadyRegistered => {
260 write!(f, "CUDA_ERROR_HOST_MEMORY_ALREADY_REGISTERED")
261 }
262 Self::HostMemoryNotRegistered => {
263 write!(f, "CUDA_ERROR_HOST_MEMORY_NOT_REGISTERED")
264 }
265 Self::HardwareStackError => write!(f, "CUDA_ERROR_HARDWARE_STACK_ERROR"),
266 Self::IllegalInstruction => write!(f, "CUDA_ERROR_ILLEGAL_INSTRUCTION"),
267 Self::MisalignedAddress => write!(f, "CUDA_ERROR_MISALIGNED_ADDRESS"),
268 Self::InvalidAddressSpace => write!(f, "CUDA_ERROR_INVALID_ADDRESS_SPACE"),
269 Self::InvalidPc => write!(f, "CUDA_ERROR_INVALID_PC"),
270 Self::LaunchFailed => write!(f, "CUDA_ERROR_LAUNCH_FAILED"),
271 Self::CooperativeLaunchTooLarge => {
272 write!(f, "CUDA_ERROR_COOPERATIVE_LAUNCH_TOO_LARGE")
273 }
274 Self::TensorMemoryLeak => write!(f, "CUDA_ERROR_TENSOR_MEMORY_LEAK"),
275 Self::NotPermitted => write!(f, "CUDA_ERROR_NOT_PERMITTED"),
276 Self::NotSupported => write!(f, "CUDA_ERROR_NOT_SUPPORTED"),
277 Self::SystemNotReady => write!(f, "CUDA_ERROR_SYSTEM_NOT_READY"),
278 Self::SystemDriverMismatch => write!(f, "CUDA_ERROR_SYSTEM_DRIVER_MISMATCH"),
279 Self::CompatNotSupportedOnDevice => {
280 write!(f, "CUDA_ERROR_COMPAT_NOT_SUPPORTED_ON_DEVICE")
281 }
282 Self::MpsConnectionFailed => write!(f, "CUDA_ERROR_MPS_CONNECTION_FAILED"),
283 Self::MpsRpcFailure => write!(f, "CUDA_ERROR_MPS_RPC_FAILURE"),
284 Self::MpsServerNotReady => write!(f, "CUDA_ERROR_MPS_SERVER_NOT_READY"),
285 Self::MpsMaxClientsReached => write!(f, "CUDA_ERROR_MPS_MAX_CLIENTS_REACHED"),
286 Self::MpsMaxConnectionsReached => {
287 write!(f, "CUDA_ERROR_MPS_MAX_CONNECTIONS_REACHED")
288 }
289 Self::MpsClientTerminated => write!(f, "CUDA_ERROR_MPS_CLIENT_TERMINATED"),
290 Self::CdpNotSupported => write!(f, "CUDA_ERROR_CDP_NOT_SUPPORTED"),
291 Self::CdpVersionMismatch => write!(f, "CUDA_ERROR_CDP_VERSION_MISMATCH"),
292 Self::StreamCaptureUnsupported => {
293 write!(f, "CUDA_ERROR_STREAM_CAPTURE_UNSUPPORTED")
294 }
295 Self::StreamCaptureInvalidated => {
296 write!(f, "CUDA_ERROR_STREAM_CAPTURE_INVALIDATED")
297 }
298 Self::StreamCaptureMerge => write!(f, "CUDA_ERROR_STREAM_CAPTURE_MERGE"),
299 Self::StreamCaptureUnmatched => write!(f, "CUDA_ERROR_STREAM_CAPTURE_UNMATCHED"),
300 Self::StreamCaptureUnjoined => write!(f, "CUDA_ERROR_STREAM_CAPTURE_UNJOINED"),
301 Self::StreamCaptureIsolation => write!(f, "CUDA_ERROR_STREAM_CAPTURE_ISOLATION"),
302 Self::StreamCaptureImplicit => write!(f, "CUDA_ERROR_STREAM_CAPTURE_IMPLICIT"),
303 Self::CapturedEvent => write!(f, "CUDA_ERROR_CAPTURED_EVENT"),
304 Self::StreamCaptureWrongThread => {
305 write!(f, "CUDA_ERROR_STREAM_CAPTURE_WRONG_THREAD")
306 }
307 Self::Timeout => write!(f, "CUDA_ERROR_TIMEOUT"),
308 Self::GraphExecUpdateFailure => write!(f, "CUDA_ERROR_GRAPH_EXEC_UPDATE_FAILURE"),
309 Self::ExternalDevice => write!(f, "CUDA_ERROR_EXTERNAL_DEVICE"),
310 Self::InvalidClusterSize => write!(f, "CUDA_ERROR_INVALID_CLUSTER_SIZE"),
311 Self::FunctionNotLoaded => write!(f, "CUDA_ERROR_FUNCTION_NOT_LOADED"),
312 Self::InvalidResourceType => write!(f, "CUDA_ERROR_INVALID_RESOURCE_TYPE"),
313 Self::InvalidResourceConfiguration => {
314 write!(f, "CUDA_ERROR_INVALID_RESOURCE_CONFIGURATION")
315 }
316 Self::KeyRotation => write!(f, "CUDA_ERROR_KEY_ROTATION"),
317 Self::StreamDetached => write!(f, "CUDA_ERROR_STREAM_DETACHED"),
318 Self::Unknown => write!(f, "CUDA_ERROR_UNKNOWN"),
319 }
320 }
321}
322
323impl From<runtime::cudaError_t> for Error {
324 fn from(code: runtime::cudaError_t) -> Self {
325 let message = unsafe {
326 let c_ptr = runtime::cudaGetErrorString(code);
327 if c_ptr.is_null() {
328 String::from("unknown cuda error")
329 } else {
330 CStr::from_ptr(c_ptr).to_string_lossy().into_owned()
331 }
332 };
333
334 Self::Cuda {
335 code: code.into(),
336 message,
337 }
338 }
339}
340
341impl From<Status> for Error {
342 fn from(code: Status) -> Self {
343 runtime::cudaError_t::from(code).into()
344 }
345}
346
347impl From<NulError> for Error {
348 fn from(_: NulError) -> Self {
349 Self::InteriorNul
350 }
351}
352
353impl From<nvrtc::nvrtcResult> for Error {
354 fn from(code: nvrtc::nvrtcResult) -> Self {
355 let message = unsafe {
356 let c_ptr = nvrtc::nvrtcGetErrorString(code);
357 if c_ptr.is_null() {
358 String::from("unknown nvrtc error")
359 } else {
360 CStr::from_ptr(c_ptr).to_string_lossy().into_owned()
361 }
362 };
363
364 Self::Nvrtc {
365 code: code.into(),
366 message,
367 }
368 }
369}
370
371impl From<nvvm::nvvmResult> for Error {
372 fn from(code: nvvm::nvvmResult) -> Self {
373 let message = unsafe {
374 let c_ptr = nvvm::nvvmGetErrorString(code);
375 if c_ptr.is_null() {
376 String::from("unknown nvvm error")
377 } else {
378 CStr::from_ptr(c_ptr).to_string_lossy().into_owned()
379 }
380 };
381
382 Self::Nvvm {
383 code: code.into(),
384 message,
385 }
386 }
387}
388
389#[macro_export]
390macro_rules! try_ffi {
391 ($expr:expr) => {{
392 let err = { $expr };
393 if err != singe_cuda_sys::runtime::cudaError_t::CUDA_SUCCESS {
394 Err($crate::error::Error::from(err))
395 } else {
396 Ok(())
397 }
398 }};
399}
400
401#[macro_export]
402macro_rules! try_nvrtc {
403 ($expr:expr) => {{
404 let err = { $expr };
405 if err != singe_cuda_sys::nvrtc::nvrtcResult::NVRTC_SUCCESS {
406 Err($crate::error::Error::from(err))
407 } else {
408 Ok(())
409 }
410 }};
411}
412
413#[macro_export]
414macro_rules! try_nvvm {
415 ($expr:expr) => {{
416 let err = { $expr };
417 if err != singe_cuda_sys::nvvm::nvvmResult::NVVM_SUCCESS {
418 Err($crate::error::Error::from(err))
419 } else {
420 Ok(())
421 }
422 }};
423}