#define HANDLE_ERROR(err) __handle_error(err, __LINE__)
inline void __handle_error(cudaError_t const& err, int line) {
if(err != cudaSuccess) {
std::cout << line << ": " << cudaGetErrorName(err) << std::endl;
exit(EXIT_FAILURE);
}
}
错误定义
错误字符串 | 错误代码 | 错误含义 |
cudaSuccess | 0 | API调用返回没有错误。对于查询调用,这还意味着要查询的操作已完成(请参阅cudaEventQuery()和cudaStreamQuery())。 |
cudaErrorInvalidValue | 1 | 这表明传递给API调用的一个或多个参数不在可接受的值范围内。 |
cudaErrorMemoryAllocation | 2 | API调用失败,因为它无法分配足够的内存来执行请求的操作。 |
cudaErrorInitializationError | 3 | API调用失败,因为无法初始化CUDA驱动程序和运行时。 |
cudaErrorCudartUnloading | 4 | 这表明无法执行CUDA运行时API调用,因为它是在进程关闭期间(在卸载CUDA驱动程序后的某个时间)调用的。 |
cudaErrorProfilerDisabled | 5 | 这表明没有为此运行初始化探查器。当应用程序使用外部概要分析工具(如可视化探查器)运行时,可能会发生这种情况。 |
cudaErrorProfilerNotInitialized | 6 | 不推荐使用。从CUDA 5.0开始不推荐使用此错误返回。尝试通过cudaProfilerStart或cudaProfilerStop启用/禁用概要分析而无需初始化不再是错误。 |
cudaErrorProfilerAlreadyStarted | 7 | 不推荐使用。从CUDA 5.0开始不推荐使用此错误返回。已经启用概要分析时,调用cudaProfilerStart()不再是错误。 |
cudaErrorProfilerAlreadyStopped | 8 | 不推荐使用。从CUDA 5.0开始不推荐使用此错误返回。在已禁用分析的情况下,调用cudaProfilerStop()不再是错误。 |
cudaErrorInvalidConfiguration | 9 | 这表明内核启动正在请求当前设备永远无法满足的资源。每个块请求的共享内存比设备支持的更多,将触发此错误,因为请求过多的线程或块。有关更多设备限制,请参见cudaDeviceProp。 |
cudaErrorInvalidPitchValue | 12 | 这表明传递给API调用的一个或多个与音调相关的参数不在音调的可接受范围内。 |
cudaErrorInvalidSymbol | 13 | 这表明传递给API调用的符号名称/标识符不是有效的名称或标识符。 |
cudaErrorInvalidHostPointer | 16 | 不推荐使用。从CUDA 10.1开始不推荐使用此错误返回。这表明传递给API调用的至少一个主机指针不是有效的主机指针。 |
cudaErrorInvalidDevicePointer | 17 | 不推荐使用。从CUDA 10.1开始不推荐使用此错误返回。这表明传递给API调用的至少一个设备指针不是有效的设备指针。 |
cudaErrorInvalidTexture | 18 | 这表明传递给API调用的纹理不是有效的纹理。 |
cudaErrorInvalidTextureBinding | 19 | 这表明纹理绑定无效。如果您使用未绑定的纹理调用cudaGetTextureAlignmentOffset(),则会发生这种情况。 |
cudaErrorInvalidChannelDescriptor | 20 | 这表明传递给API调用的通道描述符无效。如果格式不是cudaChannelFormatKind指定的格式之一,或者尺寸之一无效,则会发生这种情况。 |
cudaErrorInvalidMemcpyDirection | 21 | 这表明传递给API调用的memcpy的方向不是cudaMemcpyKind指定的类型之一。 |
cudaErrorAddressOfConstant | 22 | 不推荐使用。从CUDA 3.1开始不推荐使用此错误返回。现在,常量内存中的变量现在可以通过cudaGetSymbolAddress()由运行时获取其地址。这表明用户使用了常量变量的地址,直到CUDA 3.1发行版才禁止使用该地址。 |
cudaErrorTextureFetchFailed | 23 | 不推荐使用。从CUDA 3.1开始不推荐使用此错误返回。 CUDA 3.1发行版删除了设备仿真模式。这表明无法执行纹理获取。以前用于纹理操作的设备仿真。 |
cudaErrorTextureNotBound | 24 | 不推荐使用。从CUDA 3.1开始不推荐使用此错误返回。 CUDA 3.1发行版删除了设备仿真模式。这表明纹理未绑定访问。以前用于纹理操作的设备仿真。 |
cudaErrorSynchronizationError | 25 | 不推荐使用。从CUDA 3.1开始不推荐使用此错误返回。 CUDA 3.1发行版删除了设备仿真模式。这表明同步操作已失败。以前将其用于某些设备仿真功能。 |
cudaErrorInvalidFilterSetting | 26 | 这表明正在使用线性过滤访问非浮动纹理。 CUDA不支持此功能。 |
cudaErrorInvalidNormSetting | 27 | 这表明试图读取非浮动纹理作为规范化的浮动。 CUDA不支持此功能。 |
cudaErrorMixedDeviceExecution | 28 | 不推荐使用。从CUDA 3.1开始不推荐使用此错误返回。 CUDA 3.1发行版删除了设备仿真模式。不允许混用设备和设备仿真代码。 |
cudaErrorNotYetImplemented | 31 | 不推荐使用。从CUDA 4.1开始不推荐使用此错误返回。这表明该API调用尚未实现。 CUDA的生产版本永远不会返回此错误。 |
cudaErrorMemoryValueTooLarge | 32 | 不推荐使用。从CUDA 3.1开始不推荐使用此错误返回。 CUDA 3.1发行版删除了设备仿真模式。这表明仿真的设备指针超出了32位地址范围。 |
cudaErrorStubLibrary | 34 | 这表明应用程序已加载的CUDA驱动程序是存根库。使用存根而不是实际驱动程序运行的应用程序将导致CUDA API返回此错误。 |
cudaErrorInsufficientDriver | 35 | 这表明已安装的NVIDIA CUDA驱动程序早于CUDA运行时库。这不是受支持的配置。用户应安装更新的NVIDIA显示驱动程序以允许应用程序运行。 |
cudaErrorCallRequiresNewerDriver | 36 | 这表明API调用需要比当前安装的更新的CUDA驱动程序。用户应安装更新的NVIDIA CUDA驱动程序,以允许API调用成功。 |
cudaErrorInvalidSurface | 37 | 这表明传递给API调用的表面不是有效表面。 |
cudaErrorDuplicateVariableName | 43 | 这表明多个全局或常量变量(跨应用程序中的单独CUDA源文件)共享相同的字符串名称。 |
cudaErrorDuplicateTextureName | 44 | 这表明多个纹理(跨应用程序中的单独CUDA源文件)共享相同的字符串名称。 |
cudaErrorDuplicateSurfaceName | 45 | 这表明多个表面(跨应用程序中的单独CUDA源文件)共享相同的字符串名称。 |
cudaErrorDevicesUnavailable | 46 | 这表明当前所有CUDA设备正忙或不可用。由于使用cudaComputeModeExclusive,cudaComputeModeProhibited或长时间运行的CUDA内核填满了GPU并阻止了新工作的启动,设备通常很忙/不可用。由于已经执行了活动CUDA工作的设备上的内存限制,它们也可能不可用。 |
cudaErrorIncompatibleDriverContext | 49 | 这表明当前上下文与此CUDA运行时不兼容。仅当您使用CUDA运行时/驱动程序互操作性并且已使用驱动程序API创建了现有的驱动程序上下文时,才会发生这种情况。驱动程序上下文可能是不兼容的,或者是由于驱动程序上下文是使用较旧版本的API创建的,或者是因为运行时API调用期望使用主驱动程序上下文,而驱动程序上下文不是主要的,或者是因为驱动程序上下文已被破坏。请参阅与CUDA驱动程序API的交互”以了解更多信息。 |
cudaErrorMissingConfiguration | 52 | 先前未通过cudaConfigureCall()函数配置正在调用的设备功能(通常是通过cudaLaunchKernel())。 |
cudaErrorPriorLaunchFailure | 53 | 不推荐使用。从CUDA 3.1开始不推荐使用此错误返回。 CUDA 3.1发行版删除了设备仿真模式。这表明先前的内核启动失败。以前用于内核启动的设备仿真。 |
cudaErrorLaunchMaxDepthExceeded | 65 | 此错误表明未发生设备运行时网格启动,因为子网格的深度将超过嵌套网格启动的最大支持数量。 |
cudaErrorLaunchFileScopedTex | 66 | 此错误表明未发生网格启动,因为内核使用了设备运行时不支持的文件作用域纹理。通过设备运行时启动的内核仅支持使用Texture Object API创建的纹理。 |
cudaErrorLaunchFileScopedSurf | 67 | 此错误表明未发生网格启动,因为内核使用了设备运行时不支持的文件范围的表面。通过设备运行时启动的内核仅支持使用Surface Object API创建的曲面。 |
cudaErrorSyncDepthExceeded | 68 | 此错误表示从设备运行时进行的对cudaDeviceSynchronize的调用失败,因为该调用是在大于默认深度(2个网格级别)或用户指定的设备限制cudaLimitDevRuntimeSyncDepth的网格深度进行的。为了能够在更大的深度上成功地在已启动的网格上进行同步,在使用设备运行时在主机端启动内核之前,必须使用对cudaDeviceSetLimit api的cudaLimitDevRuntimeSyncDepth限制来指定将调用cudaDeviceSynchronize的最大嵌套深度。请记住,同步深度的其他级别要求运行时保留不能用于用户分配的大量设备内存。 |
cudaErrorLaunchPendingCountExceeded | 69 | 此错误表明设备运行时网格启动失败,因为启动将超出限制cudaLimitDevRuntimePendingLaunchCount。为了使启动成功进行,必须调用cudaDeviceSetLimit才能将cudaLimitDevRuntimePendingLaunchCount设置为高于可以发布给设备运行时的未完成启动的上限。请记住,提高挂起的设备运行时启动的限制将要求运行时保留不能用于用户分配的设备内存。 |
cudaErrorInvalidDeviceFunction | 98 | 所请求的设备功能不存在或未针对正确的设备体系结构进行编译。 |
cudaErrorNoDevice | 100 | 这表明已安装的CUDA驱动程序未检测到具有CUDA功能的设备。 |
cudaErrorInvalidDevice | 101 | 这表明用户提供的设备序号与有效的CUDA设备不对应。 |
cudaErrorDeviceNotLicensed | 102 | 这表明设备没有有效的网格许可证。 |
cudaErrorSoftwareValidityNotEstablished | 103 | 默认情况下,CUDA运行时可以执行最少的一组自检以及CUDA驱动程序测试,以建立两者的有效性。在CUDA 11.2中引入的此错误返回表明这些测试中至少有一个失败,并且无法确定运行时或驱动程序的有效性。 |
cudaErrorStartupFailure | 127 | 这表明CUDA运行时内部启动失败。 |
cudaErrorInvalidKernelImage | 200 | 这表明设备内核映像无效。 |
cudaErrorDeviceUninitialized | 201 | 这最经常表示没有上下文绑定到当前线程。如果传递给API调用的上下文不是有效的句柄(例如,已对其调用cuCtxDestroy()的上下文),也可以返回此值。如果用户混合使用不同的API版本(即3010上下文和3020 API调用),也可以返回此值。有关更多详细信息,请参见cuCtxGetApiVersion()。 |
cudaErrorMapBufferObjectFailed | 205 | 这表明缓冲区对象无法映射。 |
cudaErrorUnmapBufferObjectFailed | 206 | 这表明不能取消映射缓冲区对象。 |
cudaErrorArrayIsMapped | 207 | 这表明指定的数组当前正在映射,因此无法销毁。 |
cudaErrorAlreadyMapped | 208 | 这表明资源已被映射。 |
cudaErrorNoKernelImageForDevice | 209 | 这表明没有适用于该设备的内核映像。当用户为特定CUDA源文件指定不包括相应设备配置的代码生成选项时,可能会发生这种情况。 |
cudaErrorAlreadyAcquired | 210 | 这表明资源已经被获取。 |
cudaErrorNotMapped | 211 | 这表明资源未映射。 |
cudaErrorNotMappedAsArray | 212 | 这表明映射的资源不可作为数组访问。 |
cudaErrorNotMappedAsPointer | 213 | 这表明映射的资源不可作为指针访问。 |
cudaErrorECCUncorrectable | 214 | 这表明在执行过程中检测到不可纠正的ECC错误。 |
cudaErrorUnsupportedLimit | 215 | 这表明活动设备不支持传递给API调用的cudaLimit。 |
cudaErrorDeviceAlreadyInUse | 216 | 这表明调用试图访问已由其他线程使用的独占线程设备。 |
cudaErrorPeerAccessUnsupported | 217 | 此错误表明在给定的设备上不支持P2P访问。 |
cudaErrorInvalidPtx | 218 | PTX编译失败。如果应用程序不包含适用于当前设备的二进制文件,则运行时可能会退回到编译PTX。 |
cudaErrorInvalidGraphicsContext | 219 | 这表示OpenGL或DirectX上下文错误。 |
cudaErrorNvlinkUncorrectable | 220 | 这表明在执行过程中检测到不可纠正的NVLink错误。 |
cudaErrorJitCompilerNotFound | 221 | 这表明未找到PTX JIT编译器库。 JIT编译器库用于PTX编译。如果应用程序不包含适用于当前设备的二进制文件,则运行时可能会退回到编译PTX。 |
cudaErrorUnsupportedPtxVersion | 222 | 这表明提供的PTX是使用不受支持的工具链编译的。最常见的原因是PTX是由比CUDA驱动程序和PTX JIT编译器支持的编译器更新的编译器生成的。 |
cudaErrorJitCompilationDisabled | 223 | 这表明JIT编译已禁用。 JIT编译将编译PTX。如果应用程序不包含适用于当前设备的二进制文件,则运行时可能会退回到编译PTX。 |
cudaErrorInvalidSource | 300 | 这表明设备内核源无效。 |
cudaErrorFileNotFound | 301 | 这表明找不到指定的文件。 |
cudaErrorSharedObjectSymbolNotFound | 302 | 这表明指向共享库的链接无法解析。 |
cudaErrorSharedObjectInitFailed | 303 | 这表明共享对象的初始化失败。 |
cudaErrorOperatingSystem | 304 | 此错误表明OS调用失败。 |
cudaErrorInvalidResourceHandle | 400 | 这表明传递给API调用的资源句柄无效。资源句柄是不透明的类型,例如cudaStream_t和cudaEvent_t。 |
cudaErrorIllegalState | 401 | 这表明API调用所需的资源未处于有效状态以执行请求的操作。 |
cudaErrorSymbolNotFound | 500 | 这表明未找到命名符号。符号的示例是全局/常量变量名称,纹理名称和表面名称。 |
cudaErrorNotReady | 600 | 这表明先前发出的异步操作尚未完成。该结果实际上不是错误,但是必须与cudaSuccess(指示完成)的显示方式有所不同。可能返回此值的调用包括cudaEventQuery()和cudaStreamQuery()。 |
cudaErrorIllegalAddress | 700 | 设备在无效的存储器地址上遇到了加载或存储指令。这会使进程处于不一致状态,并且任何进一步的CUDA工作都将返回相同的错误。要继续使用CUDA,必须终止该过程并重新启动。 |
cudaErrorLaunchOutOfResources | 701 | 这表明没有启动是因为它没有适当的资源。尽管此错误与- cudaErrorInvalidConfiguration相似,但此错误通常表明用户尝试向设备内核传递太多参数,或者内核启动为内核的寄存器计数指定了太多线程。 |
cudaErrorLaunchTimeout | 702 | 这表明设备内核执行所需的时间太长。仅在启用超时的情况下才会发生这种情况-有关更多信息,请参见设备属性kernelExecTimeoutEnabled。这会使进程处于不一致状态,并且任何进一步的CUDA工作都将返回相同的错误。要继续使用CUDA,必须终止该过程并重新启动。 |
cudaErrorLaunchIncompatibleTexturing | 703 | 该错误表明内核启动使用了不兼容的纹理模式。 |
cudaErrorPeerAccessAlreadyEnabled | 704 | 此错误表明对cudaDeviceEnablePeerAccess()的调用正在尝试从已启用对等寻址的上下文中重新启用对等寻址。 |
cudaErrorPeerAccessNotEnabled | 705 | 此错误表明cudaDeviceDisablePeerAccess()试图禁用尚未通过cudaDeviceEnablePeerAccess()启用的对等寻址。 |
cudaErrorSetOnActiveProcess | 708 | 这表示用户通过调用非设备管理实例初始化CUDA运行时并初始化内核后,已经调用了cudaSetValidDevices(),cudaSetDeviceFlags(),cudaD3D9SetDirect3DDevice(),cudaD3D10SetDirect3DDevice,cudaD3D11SetDirect3DDevice()或cudaVDPAUSetVDPAUDevice()。非设备管理操作)。如果使用运行时/驱动程序互操作性且主机线程上存在现有的CUcontext,则也可以返回此错误。 |
cudaErrorContextIsDestroyed | 709 | 该错误表明调用方线程的当前上下文已使用cuCtxDestroy破坏,或者是尚未初始化的主要上下文。 |
cudaErrorAssert | 710 | 在内核执行期间在设备代码中触发的断言。该设备无法再次使用。所有现有分配均无效。要继续使用CUDA,必须终止该过程并重新启动。 |
cudaErrorTooManyPeers | 711 | 此错误表明,传递给cudaEnablePeerAccess()的一个或多个设备已耗尽了启用对等访问所需的硬件资源。 |
cudaErrorHostMemoryAlreadyRegistered | 712 | 此错误表明传递给cudaHostRegister()的内存范围已被注册。 |
cudaErrorHostMemoryNotRegistered | 713 | 此错误表明传递给cudaHostUnregister()的指针与任何当前注册的内存区域都不对应。 |
cudaErrorHardwareStackError | 714 | 设备在内核执行期间在调用堆栈中遇到错误,可能是由于堆栈损坏或超出堆栈大小限制所致。这会使进程处于不一致状态,并且任何进一步的CUDA工作都将返回相同的错误。要继续使用CUDA,必须终止该过程并重新启动。 |
cudaErrorIllegalInstruction | 715 | 设备在内核执行期间遇到了非法指令,这使进程处于不一致状态,任何进一步的CUDA工作都将返回相同的错误。要继续使用CUDA,必须终止该过程并重新启动。 |
cudaErrorMisalignedAddress | 716 | 设备在未对齐的存储器地址上遇到了加载或存储指令。这会使进程处于不一致状态,并且任何进一步的CUDA工作都将返回相同的错误。要继续使用CUDA,必须终止该过程并重新启动。 |
cudaErrorInvalidAddressSpace | 717 | 在执行内核时,设备遇到一条指令,该指令只能在某些地址空间(全局,共享或本地)中的存储器位置上操作,但被提供了不属于允许的地址空间的存储器地址。这会使进程处于不一致状态,并且任何进一步的CUDA工作都将返回相同的错误。要继续使用CUDA,必须终止该过程并重新启动。 |
cudaErrorInvalidPc | 718 | 设备遇到无效的程序计数器。这会使进程处于不一致状态,并且任何进一步的CUDA工作都将返回相同的错误。要继续使用CUDA,必须终止该过程并重新启动。 |
cudaErrorLaunchFailure | 719 | 执行内核时设备上发生了异常。常见原因包括取消引用无效的设备指针和访问共享内存超出范围。不太常见的情况可能是系统特定的-有关这些情况的更多信息,请参见系统特定的用户指南。这会使进程处于不一致状态,并且任何进一步的CUDA工作都将返回相同的错误。要继续使用CUDA,必须终止该过程并重新启动。 |
cudaErrorCooperativeLaunchTooLarge | 720 | 此错误表示对于通过cudaLaunchCooperativeKernel或cudaLaunchCooperativeKernelMultiDevice启动的内核,每个网格启动的块数超过了cudaOccupancyMaxActiveBlocksPerMultiprocessor或cudaOccupancyMaxActiveBlocksPerMultiprocessorWithFlags所允许的最大块数乘以deviceCountev指定的多处理器数量。 |
cudaErrorNotPermitted | 800 | 该错误表明尝试的操作是不允许的。 |
cudaErrorNotSupported | 801 | 此错误表明当前系统或设备不支持尝试的操作。 |
cudaErrorSystemNotReady | 802 | 此错误表明系统尚未准备好开始任何CUDA工作。要继续使用CUDA,请确认系统配置处于有效状态,并且所有必需的驱动程序守护程序都正在运行。有关此错误的更多信息,请参见系统特定的用户指南。 |
cudaErrorSystemDriverMismatch | 803 | 此错误表明显示驱动程序和CUDA驱动程序的版本不匹配。有关支持的版本,请参阅兼容性文档。 |
cudaErrorCompatNotSupportedOnDevice | 804 | 该错误表明系统已升级为可以向前兼容运行,但是CUDA检测到的可见硬件不支持此配置。有关支持的硬件矩阵,请参阅兼容性文档,或通过CUDA_VISIBLE_DEVICES环境变量确保在初始化期间仅可见支持的硬件。 |
cudaErrorStreamCaptureUnsupported | 900 | 捕获流时,不允许该操作。 |
cudaErrorStreamCaptureInvalidated | 901 | 由于先前的错误,流上的当前捕获序列已无效。 |
cudaErrorStreamCaptureMerge | 902 | 该操作将导致两个独立捕获序列的合并。 |
cudaErrorStreamCaptureUnmatched | 903 | 捕获未在此流中启动。 |
cudaErrorStreamCaptureUnjoined | 904 | 捕获序列包含一个未加入主流的分支。 |
cudaErrorStreamCaptureIsolation | 905 | 将创建一个跨越捕获序列边界的依赖项。仅允许隐式流内顺序依赖项跨越边界。 |
cudaErrorStreamCaptureImplicit | 906 | 该操作将导致对来自cudaStreamLegacy的当前捕获序列的隐式依赖。 |
cudaErrorCapturedEvent | 907 | 对于最后记录在捕获流中的事件,不允许执行该操作。 |
cudaErrorStreamCaptureWrongThread | 908 | 未使用cudaStreamBeginCapture的cudaStreamCaptureModeRelaxed参数启动的流捕获序列已在另一个线程中传递给cudaStreamEndCapture。 |
cudaErrorTimeout | 909 | 这表明等待操作已超时。 |
cudaErrorGraphExecUpdateFailure | 910 | 此错误表示未执行图形更新,因为它包含违反特定于实例化图形更新的约束的更改。 |
cudaErrorUnknown | 999 | 这表明发生了未知的内部错误。 |