Skip to main content

singe_cuda/
error.rs

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}