fil_rustacuda/
error.rs

1//! Types for error handling
2//!
3//! # Error handling in CUDA:
4//!
5//! RustaCUDA uses the [`CudaError`](enum.CudaError.html) enum to represent the errors returned by
6//! the CUDA API. It is important to note that nearly every function in CUDA (and therefore
7//! RustaCUDA) can fail. Even those functions which have no normal failure conditions can return
8//! errors related to previous asynchronous launches.
9
10use 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/// Error enum which represents all the potential errors returned by the CUDA driver API.
20#[repr(u32)]
21#[allow(missing_docs)]
22#[derive(Clone, Copy, Debug, Eq, PartialEq)]
23pub enum CudaError {
24    // CUDA errors
25    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    // RustaCUDA errors
85    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            // This shouldn't happen
107            _ => write!(f, "Unknown error"),
108        }
109    }
110}
111impl Error for CudaError {}
112
113/// Result type for most CUDA functions.
114pub type CudaResult<T> = Result<T, CudaError>;
115
116/// Special result type for `drop` functions which includes the un-dropped value with the error.
117pub 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}