官方网站 :

CUDA Runtime API :: CUDA Toolkit Documentation

cudaFree() 说明

cudaFree() 是 CUDA 中用于释放由 cudaMalloc() 或 cudaMallocManaged() 分配的设备内存的函数。它的参数是一个指向设备内存的指针,用于指示要释放的内存块的起始地址。

用法说明如下:

cudaError_t cudaFree(void *devPtr);

参数 devPtr 是一个指向要释放的设备内存块的指针。这个指针必须是由 cudaMalloc()cudaMallocManaged() 或类似函数返回的指针,指向通过 CUDA 运行时 API 分配的内存。如果 devPtr 是 nullptr,则 cudaFree() 会忽略并返回 cudaSuccess

通常情况下,cudaFree() 应该在不再需要设备内存时被调用,以释放之前通过 CUDA 运行时 API 分配的内存,以便重用或释放给系统。

请注意,调用 cudaFree() 并不会自动将指针 devPtr 设置为 nullptr。因此,在调用 cudaFree() 后,为了避免悬空指针问题,建议将指针显式设置为 nullptr,或者进行适当的指针管理。

另外,cudaFree() 返回一个 cudaError_t 类型的错误码,用于指示函数是否执行成功。

cudaError_t 类型的错误码

一些常见的 cudaError_t 值及其含义:

  1. cudaSuccess:函数调用成功完成。

  2. cudaErrorMemoryAllocation:内存分配失败。

  3. cudaErrorIllegalInstruction:设备执行了非法的指令。

  4. cudaErrorMisalignedAddress:指针未对齐。

  5. cudaErrorInvalidValue:传递给函数的某些参数无效。

  6. cudaErrorLaunchFailure:在设备上执行内核函数时发生错误。

  7. cudaErrorNoDevice:没有可用的 CUDA 设备。

  8. cudaErrorNotInitialized:CUDA 运行时尚未初始化。

  9. cudaErrorInvalidDevice:提供的 CUDA 设备标识符无效。

  10. cudaErrorInvalidConfiguration:内核启动配置无效。

  11. cudaErrorInvalidPitchValue:传递给 cudaMallocPitch() 的 pitch 值无效。

  12. cudaErrorInvalidMemcpyDirectioncudaMemcpy() 方向参数无效。

  13. cudaErrorInvalidSymbol:传递给内核函数的符号无效。

  14. cudaErrorMapBufferObjectFailed:映射缓冲对象到设备地址空间失败。

  15. cudaErrorCudartUnloading:CUDA 运行时库正在卸载。

  16. cudaErrorProfilerDisabled:CUDA 分析器不可用。

cudaErrorCudartUnloading:CUDA 运行时库正在卸载 什么意思?什么情况下会发生? 

cudaErrorCudartUnloading 表示 CUDA 运行时库正在卸载。这个错误码表明当前正在尝试使用 CUDA 运行时 API 的某个函数,但是 CUDA 运行时库正在被卸载的过程中,因此无法正常执行该函数。

这种情况可能发生在以下情况下:

  1. 应用程序结束时:当应用程序退出时,操作系统会清理所有分配的资源,包括 CUDA 运行时库。在清理过程中,如果有 CUDA 函数被调用,就会出现 cudaErrorCudartUnloading 错误。

  2. 显式卸载 CUDA 运行时库:在某些情况下,程序员可能会显式地卸载 CUDA 运行时库。这可能是因为程序的特定需求,或者是为了进行调试或测试。在这种情况下,任何尝试使用 CUDA 运行时 API 的函数都可能导致 cudaErrorCudartUnloading 错误。

当出现 cudaErrorCudartUnloading 错误时,建议检查程序的生命周期和资源管理,确保在尝试使用 CUDA 运行时 API 函数之前,CUDA 运行时库仍然是可用的。此外,确保在应用程序退出之前正确地清理并释放所有的 CUDA 资源。

CUDA 运行时库 是什么?包含哪些东西?

CUDA(Compute Unified Device Architecture)运行时库是 NVIDIA 提供的用于支持 GPU 计算的软件库。它包含了一系列函数和工具,用于在 CUDA 设备(如 NVIDIA GPU)上执行并行计算任务。CUDA 运行时库提供了一种在 CPU 和 GPU 之间交互的框架,使得开发人员能够利用 GPU 的并行计算能力来加速应用程序的运行。

CUDA 运行时库包含了以下主要组件和功能:

  1. CUDA Runtime API:CUDA Runtime API 是一组用于在应用程序中调用的函数,用于管理设备、内存、执行内核函数等。开发人员可以使用 CUDA Runtime API 来编写使用 GPU 加速的并行计算任务。

  2. GPU 设备管理:CUDA 运行时库提供了一系列函数,用于在应用程序中管理 GPU 设备。这些函数包括了设备查询、设备属性获取、设备选择等,使得开发人员能够有效地利用系统中的 GPU 资源。

  3. 内存管理:CUDA 运行时库提供了一套内存管理函数,用于在主机(CPU)和设备(GPU)之间进行数据传输,并在 GPU 上分配和释放内存。这些函数包括了内存分配、内存复制、内存释放等。

  4. 执行模型:CUDA 运行时库定义了一种执行模型,用于描述如何在 GPU 上执行并行计算任务。这个模型包括了线程、线程块、网格等概念,并提供了相应的函数和指令,用于在 GPU 上启动和执行内核函数。

  5. 工具和实用程序:CUDA 运行时库还包含了一些用于开发和调试的实用工具和实用程序,如性能分析工具、调试器等。

总的来说,CUDA 运行时库是一套完整的软件库,用于支持在 NVIDIA GPU 上进行并行计算的开发和执行。它为开发人员提供了丰富的函数和工具,使得利用 GPU 加速的并行计算变得更加容易和高效。

调用什么函数 卸载 CUDA 运行时库?

在常规的应用程序中,通常不需要显式地卸载 CUDA 运行时库。CUDA 运行时库的加载和卸载由操作系统和应用程序的生命周期管理自动处理。当应用程序结束时,操作系统会负责释放应用程序使用的所有资源,包括 CUDA 运行时库。

然而,如果你确实需要在应用程序中显式地卸载 CUDA 运行时库,这通常意味着你需要在程序中调用操作系统相关的函数来结束进程或卸载动态链接库(CUDA 运行时库)。

在类 Unix/Linux 系统中,可以使用 dlclose() 函数来卸载动态链接库。但是,请注意,卸载 CUDA 运行时库可能会导致程序崩溃或不可预测的行为,因为程序可能依赖于 CUDA 运行时库提供的函数和资源。

在 Windows 系统中,可以使用 FreeLibrary() 函数来卸载动态链接库。同样地,这可能会导致程序崩溃或不可预测的行为。

总的来说,除非你有特定的需求,否则不建议在应用程序中显式地卸载 CUDA 运行时库。正常情况下,操作系统会在程序退出时自动清理资源,包括 CUDA 运行时库。

cudaError_t 类型的错误码 官方内容翻译

CUDA Runtime API :: CUDA Toolkit Documentation

枚举 
cudaError
CUDA 错误类型


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 驱动程序更新的 CUDA 驱动程序。用户应安装更新的 NVIDIA CUDA 驱动程序以使 API 调用成功。

cudaErrorInvalidSurface = 37
这表示传递给 API 调用的表面不是有效的表面。

cudaErrorDuplicateVariableName = 43
这表示多个全局或常量变量(在应用程序的不同 CUDA 源文件中)共享相同的字符串名称。

cudaErrorDuplicateTextureName = 44
这表示多个纹理(在应用程序的不同 CUDA 源文件中)共享相同的字符串名称。

cudaErrorDuplicateSurfaceName = 45
这表示多个表面(在应用程序的不同 CUDA 源文件中)共享相同的字符串名称。

cudaErrorDevicesUnavailable = 46
这表示所有 CUDA 设备当前都忙碌或不可用。设备通常因使用 cudaComputeModeProhibited、cudaComputeModeExclusiveProcess 或长时间运行的 CUDA 内核已填满 GPU 并阻止新工作开始而忙碌/不可用。它们也可能因已在执行活动 CUDA 工作的设备上的内存约束而不可用。

cudaErrorIncompatibleDriverContext = 49
这表示当前上下文与 CUDA 运行时不兼容。只有在使用 CUDA 运行时/驱动程序互操作性并使用驱动程序 API 创建了现有驱动程序上下文时,才会出现此错误。驱动程序上下文可能不兼容,因为驱动程序上下文是使用较旧版本的 API 创建的,因为运行时 API 调用期望主驱动程序上下文并且驱动程序上下文不是主要的,或者因为驱动程序上下文已被销毁。有关更多信息,请参阅与 CUDA 驱动程序 API 的交互"。

cudaErrorMissingConfiguration = 52
正在调用的设备函数(通常通过 cudaLaunchKernel())之前未通过 cudaConfigureCall() 函数进行配置。

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 更大的网格深度下进行的。为了能够成功地在启动使用设备运行时的内核之前,在使用设备运行时启动内核的主机端启动 cudaDeviceSynchronize 的最大嵌套深度必须在 cudaDeviceSetLimit api 中通过 cudaLimitDevRuntimeSyncDepth 限制指定。请注意,额外的同步深度级别需要运行时保留大量的设备内存,该内存不能用于用户分配。请注意,设备运行时从设备运行时进行的 cudaDeviceSynchronize 仅受支持小于 9.0 的计算能力设备。

cudaErrorLaunchPendingCountExceeded = 69
此错误表示设备运行时网格启动失败,因为启动将超出限制 cudaLimitDevRuntimePendingLaunchCount。要使此启动成功进行,必须调用 cudaDeviceSetLimit 设置 cudaLimitDevRuntimePendingLaunchCount 以使其高于可以发出到设备运行时的未完成启动的上限。请注意,提高待处理设备运行时启动的限制将要求运行时保留设备内存,该内存不能用于用户分配。

cudaErrorInvalidDeviceFunction = 98
请求的设备函数不存在或未针对正确的设备体系结构编译。

cudaErrorNoDevice = 100
这表示未检测到任何支持 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 编译器支

持的工具链生成的。

cudaErrorInvalidSource = 300
此错误表示提供的参数无效。

cudaErrorFileNotFound = 301
此错误表示指定的文件无法找到。

cudaErrorSharedObjectSymbolNotFound = 302
此错误表示无法找到指定的共享对象符号。

cudaErrorSharedObjectInitFailed = 303
此错误表示无法初始化指定的共享对象。

cudaErrorOperatingSystem = 304
此错误表示操作系统提供的错误。

cudaErrorInvalidHandle = 400
此错误表示提供的句柄无效。

cudaErrorNotFound = 500
此错误表示请求的资源不存在。


cudaErrorNotReady = 600
此错误表示请求的资源未就绪,通常在对异步操作进行轮询时返回。

cudaErrorIllegalAddress = 700
此错误表示尝试访问没有授权访问的内存地址。通常是因为错误地访问了设备内存,比如空指针引用。

cudaErrorLaunchOutOfResources = 701
此错误表示尝试启动内核时设备上已经没有足够的资源了,比如太多的线程块或太多的线程。

cudaErrorLaunchTimeout = 702
此错误表示内核执行超时。这可能是由于内核执行时间太长或内核卡住了而引起的。

cudaErrorLaunchIncompatibleTexturing = 703
此错误表示内核启动失败,因为使用了不兼容的纹理。

cudaErrorPeerAccessAlreadyEnabled = 704
此错误表示对等访问已经启用。

cudaErrorPeerAccessNotEnabled = 705
此错误表示对等访问没有启用。

cudaErrorSetOnActiveProcess = 708
此错误表示无法在 CUDA 驱动程序中更改某些属性,因为当前进程有一个活动的 CUDA 上下文。

cudaErrorContextIsDestroyed = 709
此错误表示上下文已被销毁,通常在上下文销毁后访问 CUDA 对象时返回。

cudaErrorAssert = 710
此错误表示在设备执行期间发生了断言错误。

cudaErrorTooManyPeers = 711
此错误表示在设备上尝试创建太多的对等连接。

cudaErrorHostMemoryAlreadyRegistered = 712
此错误表示尝试重复注册已注册的主机内存地址。

cudaErrorHostMemoryNotRegistered = 713
此错误表示尝试注销未注册的主机内存地址。

cudaErrorHardwareStackError = 714
此错误表示硬件堆栈遇到错误。

cudaErrorIllegalInstruction = 715
此错误表示设备执行了非法指令。

cudaErrorMisalignedAddress = 716
此错误表示尝试访问未对齐的内存地址。

cudaErrorInvalidAddressSpace = 717
此错误表示尝试访问无效地址空间。

cudaErrorInvalidPc = 718
此错误表示尝试读取或写入无效的程序计数器(PC)值。

cudaErrorIllegalAddressSpace = 719
此错误表示尝试在不允许的地址空间中执行操作。

cudaErrorInvalidPtxPointer = 720
此错误表示提供的 PTX 指针无效。

cudaErrorInvalidGraphicsContext = 721
此错误表示上下文与绑定它的图形 API 上下文不兼容。

cudaErrorStartupFailure = 0x7f
此错误表示 CUDA 运行时中的内部启动失败。

cudaErrorApiFailureBase = 10000
这是一个基本错误代码,表示错误在 API 调用中。