6.14. 虚拟内存管理

本节介绍低级 CUDA 驱动程序应用程序编程接口的虚拟内存管理功能。

函数

CUresult cuMemAddressFree ( CUdeviceptr ptr, size_t size )
释放地址范围预留。
CUresult cuMemAddressReserve ( CUdeviceptr* ptr, size_t size, size_t alignment, CUdeviceptr addr, unsigned long long flags )
分配地址范围预留。
CUresult cuMemCreate ( CUmemGenericAllocationHandle* handle, size_t size, const CUmemAllocationProp* prop, unsigned long long flags )
创建一个 CUDA 内存句柄,表示给定大小的内存分配,由给定属性描述。
CUresult cuMemExportToShareableHandle ( void* shareableHandle, CUmemGenericAllocationHandle handle, CUmemAllocationHandleType handleType, unsigned long long flags )
将分配导出到请求的可共享句柄类型。
CUresult cuMemGetAccess ( unsigned long long* flags, const CUmemLocation* location, CUdeviceptr ptr )
获取为给定 locationptr 设置的访问 flags
CUresult cuMemGetAllocationGranularity ( size_t* granularity, const CUmemAllocationProp* prop, CUmemAllocationGranularity_flags option )
计算最小或建议的粒度。
CUresult cuMemGetAllocationPropertiesFromHandle ( CUmemAllocationProp* prop, CUmemGenericAllocationHandle handle )
检索定义此句柄属性的属性结构的内容。
CUresult cuMemImportFromShareableHandle ( CUmemGenericAllocationHandle* handle, void* osHandle, CUmemAllocationHandleType shHandleType )
从请求的可共享句柄类型导入分配。
CUresult cuMemMap ( CUdeviceptr ptr, size_t size, size_t offset, CUmemGenericAllocationHandle handle, unsigned long long flags )
将分配句柄映射到保留的虚拟地址范围。
CUresult cuMemMapArrayAsync ( CUarrayMapInfo* mapInfoList, unsigned int  count, CUstream hStream )
映射或取消映射稀疏 CUDA 数组和稀疏 CUDA mipmapped 数组的子区域。
CUresult cuMemRelease ( CUmemGenericAllocationHandle handle )
释放表示内存分配的内存句柄,该内存分配先前通过 cuMemCreate 分配。
CUresult cuMemRetainAllocationHandle ( CUmemGenericAllocationHandle* handle, void* addr )
给定地址 addr,返回后备内存分配的分配句柄。
CUresult cuMemSetAccess ( CUdeviceptr ptr, size_t size, const CUmemAccessDesc* desc, size_t count )
desc 中指定的每个位置设置给定虚拟地址范围的访问标志。
CUresult cuMemUnmap ( CUdeviceptr ptr, size_t size )
取消映射给定地址范围的后备内存。

函数

CUresult cuMemAddressFree ( CUdeviceptr ptr, size_t size )
释放地址范围预留。
参数
ptr
- 要释放的虚拟地址范围的起始地址
size
- 要释放的虚拟地址区域的大小
描述

释放由 cuMemAddressReserve 预留的虚拟地址范围。大小必须与提供给 memAddressReserve 的大小匹配,并且给定的 ptr 必须与从 memAddressReserve 返回的 ptr 匹配。

另请参阅

cuMemAddressReserve

CUresult cuMemAddressReserve ( CUdeviceptr* ptr, size_t size, size_t alignment, CUdeviceptr addr, unsigned long long flags )
分配地址范围预留。
参数
ptr
- 指向分配的虚拟地址范围起点的结果指针
size
- 请求的保留虚拟地址范围的大小
alignment
- 请求的保留虚拟地址范围的对齐方式
addr
- 请求的固定起始地址范围
flags
- 当前未使用,必须为零
描述

根据给定的参数保留虚拟地址范围,在ptr中给出范围的起始地址。此 API 需要支持 UVA 的系统。大小和地址参数必须是主机页面大小的倍数,并且对齐方式必须是 2 的幂或零(用于默认对齐)。

另请参阅

cuMemAddressFree

CUresult cuMemCreate ( CUmemGenericAllocationHandle* handle, size_t size, const CUmemAllocationProp* prop, unsigned long long flags )
创建一个 CUDA 内存句柄,表示给定大小的内存分配,由给定属性描述。
参数
handle
- 返回的句柄值。对此分配的所有操作都将使用此句柄执行。
size
- 请求的分配大小
prop
- 要创建的分配的属性。
flags
- 供将来使用的标志,现在必须为零。
描述

这将在通过prop结构指定的target设备上创建内存分配。创建的分配将没有任何设备或主机映射。分配的通用内存handle可以通过 cuMemMap 映射到调用进程的地址空间。此句柄不能直接传输到其他进程(请参阅 cuMemExportToShareableHandle)。在 Windows 上,调用者还必须在prop中传递 LPSECURITYATTRIBUTE 以与此句柄关联,这将限制或允许接收进程访问此句柄(有关详细信息,请参阅 CUmemAllocationProp::win32HandleMetaData)。此分配的size的大小必须是值 cuMemGetAllocationGranularityCU_MEM_ALLOC_GRANULARITY_MINIMUM 标志给出的值的倍数。要创建针对特定主机 NUMA 节点的 CPU 分配,应用程序必须将 CUmemAllocationProp::CUmemLocation::type 设置为 CU_MEM_LOCATION_TYPE_HOST_NUMA,并且 CUmemAllocationProp::CUmemLocation::id 必须指定 CPU 的 NUMA ID。在 NUMA 不可用的系统上,CUmemAllocationProp::CUmemLocation::id 必须设置为 0。将 CU_MEM_LOCATION_TYPE_HOST_NUMA_CURRENTCU_MEM_LOCATION_TYPE_HOST 指定为 CUmemLocation::type 将导致 CUDA_ERROR_INVALID_VALUE

打算使用基于 CU_MEM_HANDLE_TYPE_FABRIC 的内存共享的应用程序必须确保:(1) `nvidia-caps-imex-channels` 字符设备由驱动程序创建,并且在 /proc/devices 下列出 (2) 至少有一个 IMEX 通道文件可供启动应用程序的用户访问。

当导出器和导入器 CUDA 进程已被授予访问同一 IMEX 通道的权限时,它们可以安全地共享内存。

IMEX 通道安全模型基于每个用户。这意味着如果用户有权访问有效的 IMEX 通道,则该用户下的所有进程都可以共享内存。当需要多用户隔离时,每个用户都需要单独的 IMEX 通道。

这些通道文件存在于 /dev/nvidia-caps-imex-channels/channel* 中,并且可以使用标准的 OS 本机调用(如 Linux 上的 mknod)创建。例如:要使用 /proc/devices 中的主编号创建 channel0,用户可以执行以下命令:`mknod /dev/nvidia-caps-imex-channels/channel0 c <major number>=""> 0`

如果 CUmemAllocationProp::allocFlags::usage 包含 CU_MEM_CREATE_USAGE_TILE_POOL 标志,则内存分配仅旨在用作稀疏 CUDA 数组和稀疏 CUDA mipmapped 数组的后备平铺池。(请参阅 cuMemMapArrayAsync)。

注意

请注意,此函数也可能返回来自先前异步启动的错误代码。

另请参阅

cuMemRelease, cuMemExportToShareableHandle, cuMemImportFromShareableHandle

CUresult cuMemExportToShareableHandle ( void* shareableHandle, CUmemGenericAllocationHandle handle, CUmemAllocationHandleType handleType, unsigned long long flags )
将分配导出到请求的可共享句柄类型。
参数
shareableHandle
- 指向存储请求的句柄类型的位置的指针
handle
- 内存分配的 CUDA 句柄
handleType
- 请求的可共享句柄类型(定义了shareableHandle输出参数的类型和大小)
flags
- 保留,必须为零
描述

给定 CUDA 内存句柄,创建可共享内存分配句柄,该句柄可用于与其他进程共享内存。接收进程可以使用 cuMemImportFromShareableHandle 将可共享句柄转换回 CUDA 内存句柄,并使用 cuMemMap 进行映射。此句柄是什么以及如何传输它的实现由handleType

中请求的句柄类型定义。一旦所有可共享句柄都关闭并且分配被释放,引用的已分配内存将被释放回操作系统,并且之后使用 CUDA 句柄将导致未定义的行为。

此 API 还可以与其他 API(例如 Vulkan、OpenGL)结合使用,这些 API 支持从可共享类型

另请参阅

导入内存 cuMemImportFromShareableHandle

CUresult cuMemGetAccess ( unsigned long long* flags, const CUmemLocation* location, CUdeviceptr ptr )
获取访问权限flags为给定locationptr.
参数
flags
- 为此位置设置的标志
location
- 要在其中检查标志的位置
ptr
- 要在其中检查访问标志的地址
描述

另请参阅

cuMemSetAccess

CUresult cuMemGetAllocationGranularity ( size_t* granularity, const CUmemAllocationProp* prop, CUmemAllocationGranularity_flags option )
计算最小或建议的粒度。
参数
granularity
返回的粒度。
prop
为其确定粒度的属性
option
确定要返回的粒度
描述

计算给定分配规范的最小或建议粒度,并在粒度中返回它。此粒度可用作对齐、大小或地址映射的倍数。

另请参阅

cuMemCreate, cuMemMap

CUresult cuMemGetAllocationPropertiesFromHandle ( CUmemAllocationProp* prop, CUmemGenericAllocationHandle handle )
检索定义此句柄属性的属性结构的内容。
参数
prop
- 指向属性结构的指针,该结构将保存有关此句柄的信息
handle
- 要在其上执行查询的句柄
CUresult cuMemImportFromShareableHandle ( CUmemGenericAllocationHandle* handle, void* osHandle, CUmemAllocationHandleType shHandleType )
从请求的可共享句柄类型导入分配。
参数
handle
- 内存分配的 CUDA 内存句柄。
osHandle
- 表示要导入的内存分配的可共享句柄。
shHandleType
- 导出的句柄的句柄类型 CUmemAllocationHandleType
描述

如果当前进程无法支持由此可共享句柄描述的内存,则此 API 将错误显示为 CUDA_ERROR_NOT_SUPPORTED

如果shHandleType如果 CU_MEM_HANDLE_TYPE_FABRIC 并且导入器进程未被授予与导出器进程相同的 IMEX 通道的访问权限,则此 API 将报错 CUDA_ERROR_NOT_PERMITTED

注意

导入从某些图形 API(Vulkan、OpenGL 等)导出的、在 SLI 组下的设备上创建的可共享句柄可能不受支持,因此该 API 将返回 CUDA_ERROR_NOT_SUPPORTED。 不保证以下内容handle对于同一个给定的 OS 可共享句柄或相同的底层分配,将是相同的 CUDA 内存句柄。

另请参阅

cuMemExportToShareableHandle, cuMemMap, cuMemRelease

CUresult cuMemMap ( CUdeviceptr ptr, size_t size, size_t offset, CUmemGenericAllocationHandle handle, unsigned long long flags )
将分配句柄映射到保留的虚拟地址范围。
参数
ptr
- 内存将被映射到的地址。
size
- 内存映射的大小。
offset
- 由以下项表示的内存的偏移量
  • handle从中开始映射
  • 注意:目前必须为零。
handle
- 可共享内存的句柄
flags
- 供将来使用的标志,现在必须为零。
描述

映射由以下项表示的内存的字节handle从字节开始offsetsize到地址范围 [addr, addr + size]。此范围必须是先前使用 cuMemAddressReserve 保留的地址预留,并且offset + size必须小于内存分配的大小。两者ptr, size,以及offset必须是使用 cuMemGetAllocationGranularityCU_MEM_ALLOC_GRANULARITY_MINIMUM 标志给出的值的倍数。如果handle表示多播对象,ptr, sizeoffset必须与 cuMulticastGetGranularity 使用标志 CU_MULTICAST_MINIMUM_GRANULARITY 返回的值对齐。但是,为了获得最佳性能,建议ptr, sizeoffsetcuMulticastGetGranularity 使用标志 CU_MULTICAST_RECOMMENDED_GRANULARITY 返回的值对齐。

请注意,调用 cuMemMap 不会使地址可访问,调用者需要通过调用 cuMemSetAccess 来更新连续映射的 VA 范围的可访问性。

一旦接收进程从 cuMemImportFromShareableHandle 获取可共享内存句柄后,该进程必须使用 cuMemMap 将内存映射到其地址范围,然后再使用 cuMemSetAccess 设置可访问性。

cuMemMap 只能在当前未映射的 VA 范围预留上创建映射。

注意

请注意,此函数也可能返回来自先前异步启动的错误代码。

另请参阅

cuMemUnmap, cuMemSetAccess, cuMemCreate, cuMemAddressReserve, cuMemImportFromShareableHandle

CUresult cuMemMapArrayAsync ( CUarrayMapInfo* mapInfoList, unsigned int  count, CUstream hStream )
映射或取消映射稀疏 CUDA 数组和稀疏 CUDA mipmapped 数组的子区域。
参数
mapInfoList
- CUarrayMapInfo 列表
count
- <0xC2><0xA0>中的 CUarrayMapInfo 计数mapInfoList
hStream
- 用于映射或取消映射操作的流的流标识符
描述

对稀疏 CUDA 数组和稀疏 CUDA mipmapped 数组的子区域执行映射或取消映射操作。每个操作由 <0xC2><0xA0>中的 CUarrayMapInfo 条目指定mapInfoList大小的数组count。结构 CUarrayMapInfo 定义如下

‎     typedef struct CUarrayMapInfo_st {
              CUresourcetype resourceType;                   
              union {
                  CUmipmappedArray mipmap;
                  CUarray array;
              } resource;
      
              CUarraySparseSubresourceType subresourceType;   
              union {
                  struct {
                      unsigned int level;                     
                      unsigned int layer;                     
                      unsigned int offsetX;                   
                      unsigned int offsetY;                   
                      unsigned int offsetZ;                   
                      unsigned int extentWidth;               
                      unsigned int extentHeight;              
                      unsigned int extentDepth;               
                  } sparseLevel;
                  struct {
                      unsigned int layer;
                      unsigned long long offset;              
                      unsigned long long size;                
                  } miptail;
              } subresource;
      
              CUmemOperationType memOperationType;
              
              CUmemHandleType memHandleType;                  
              union {
                  CUmemGenericAllocationHandle memHandle;
              } memHandle;
      
              unsigned long long offset;                      
              unsigned int deviceBitMask;                     
              unsigned int flags;                             
              unsigned int reserved[2];                       
          } CUarrayMapInfo;

其中 CUarrayMapInfo::resourceType 指定要操作的资源类型。如果 CUarrayMapInfo::resourceType 设置为 CUresourcetype::CU_RESOURCE_TYPE_ARRAY,则 CUarrayMapInfo::resource::array 必须设置为有效的稀疏 CUDA 数组句柄。 CUDA 数组必须是 2D、2D 分层或 3D CUDA 数组,并且必须已使用 cuArrayCreatecuArray3DCreate 以及标志 CUDA_ARRAY3D_SPARSECUDA_ARRAY3D_DEFERRED_MAPPING 分配。 对于使用 cuMipmappedArrayGetLevel 获取的 CUDA 数组,将返回 CUDA_ERROR_INVALID_VALUE。如果 CUarrayMapInfo::resourceType 设置为 CUresourcetype::CU_RESOURCE_TYPE_MIPMAPPED_ARRAY,则 CUarrayMapInfo::resource::mipmap 必须设置为有效的稀疏 CUDA mipmapped 数组句柄。 CUDA mipmapped 数组必须是 2D、2D 分层或 3D CUDA mipmapped 数组,并且必须已使用 cuMipmappedArrayCreate 以及标志 CUDA_ARRAY3D_SPARSECUDA_ARRAY3D_DEFERRED_MAPPING 分配。

CUarrayMapInfo::subresourceType 指定资源内子资源的类型。 CUarraySparseSubresourceType_enum 定义为

‎    typedef enum CUarraySparseSubresourceType_enum {
              CU_ARRAY_SPARSE_SUBRESOURCE_TYPE_SPARSE_LEVEL = 0,
              CU_ARRAY_SPARSE_SUBRESOURCE_TYPE_MIPTAIL = 1
          } CUarraySparseSubresourceType;

其中 CUarraySparseSubresourceType::CU_ARRAY_SPARSE_SUBRESOURCE_TYPE_SPARSE_LEVEL 指示一个稀疏 mipmap 层级,该层级在每个维度上跨越至少一个瓦片。 其余的 mipmap 层级太小,无法在任何维度上跨越至少一个瓦片,构成了 mip 尾部区域,如 CUarraySparseSubresourceType::CU_ARRAY_SPARSE_SUBRESOURCE_TYPE_MIPTAIL 子资源类型所示。

如果 CUarrayMapInfo::subresourceType 设置为 CUarraySparseSubresourceType::CU_ARRAY_SPARSE_SUBRESOURCE_TYPE_SPARSE_LEVEL,则 CUarrayMapInfo::subresource::sparseLevel 结构必须包含有效的数组子区域偏移量和范围。 CUarrayMapInfo::subresource::sparseLevel::offsetX、CUarrayMapInfo::subresource::sparseLevel::offsetY 和 CUarrayMapInfo::subresource::sparseLevel::offsetZ 必须分别指定有效的 X、Y 和 Z 偏移量。 CUarrayMapInfo::subresource::sparseLevel::extentWidth、CUarrayMapInfo::subresource::sparseLevel::extentHeight 和 CUarrayMapInfo::subresource::sparseLevel::extentDepth 必须分别指定有效的宽度、高度和深度范围。 这些偏移量和范围必须与相应的瓦片尺寸对齐。 对于 CUDA mipmapped 数组,CUarrayMapInfo::subresource::sparseLevel::level 必须指定有效的 mipmap 层级索引。 否则,必须为零。 对于分层 CUDA 数组和分层 CUDA mipmapped 数组,CUarrayMapInfo::subresource::sparseLevel::layer 必须指定有效图层索引。 否则,必须为零。 对于 2D 和 2D 分层 CUDA 数组以及 CUDA mipmapped 数组,CUarrayMapInfo::subresource::sparseLevel::offsetZ 必须为零,CUarrayMapInfo::subresource::sparseLevel::extentDepth 必须设置为 1。 瓦片范围可以通过调用 cuArrayGetSparsePropertiescuMipmappedArrayGetSparseProperties 获得

如果 CUarrayMapInfo::subresourceType 设置为 CUarraySparseSubresourceType::CU_ARRAY_SPARSE_SUBRESOURCE_TYPE_MIPTAIL,则 CUarrayMapInfo::subresource::miptail 结构必须包含有效的 mip 尾部偏移量(在 CUarrayMapInfo::subresource::miptail::offset 中)和大小(在 CUarrayMapInfo::subresource::miptail::size 中)。 mip 尾部偏移量和 mip 尾部大小都必须与瓦片大小对齐。 对于未在 CUDA_ARRAY_SPARSE_PROPERTIES::flags 中设置标志 CU_ARRAY_SPARSE_PROPERTIES_SINGLE_MIPTAIL 的分层 CUDA mipmapped 数组(由 cuMipmappedArrayGetSparseProperties 返回),CUarrayMapInfo::subresource::miptail::layer 必须指定有效的图层索引。 否则,必须为零。

如果 CUarrayMapInfo::resource::array 或 CUarrayMapInfo::resource::mipmap 是使用 CUDA_ARRAY3D_DEFERRED_MAPPING 标志创建的,则 CUarrayMapInfo::subresourceType 和 CUarrayMapInfo::subresource 的内容将被忽略。

CUarrayMapInfo::memOperationType 指定操作类型。 CUmemOperationType 定义为

‎    typedef enum CUmemOperationType_enum {
              CU_MEM_OPERATION_TYPE_MAP = 1,
              CU_MEM_OPERATION_TYPE_UNMAP = 2
          } CUmemOperationType;
如果 CUarrayMapInfo::memOperationType 设置为 CUmemOperationType::CU_MEM_OPERATION_TYPE_MAP,则子资源将被映射到由 CUarrayMapInfo::memHandle 指定的瓦片池内存,偏移量为 CUarrayMapInfo::offset。 瓦片池分配必须通过在调用 cuMemCreate 时指定 CU_MEM_CREATE_USAGE_TILE_POOL 标志来创建。 此外,CUarrayMapInfo::memHandleType 必须设置为 CUmemHandleType::CU_MEM_HANDLE_TYPE_GENERIC。

如果 CUarrayMapInfo::memOperationType 设置为 CUmemOperationType::CU_MEM_OPERATION_TYPE_UNMAP,则执行取消映射操作。 CUarrayMapInfo::memHandle 必须为 NULL。

CUarrayMapInfo::deviceBitMask 指定必须映射或取消映射物理内存的设备列表。 目前,此掩码必须正好设置一位,并且相应的设备必须与流关联的设备匹配。 如果 CUarrayMapInfo::memOperationType 设置为 CUmemOperationType::CU_MEM_OPERATION_TYPE_MAP,则设备还必须与 CUarrayMapInfo::memHandle 指定的瓦片池内存分配关联的设备匹配。

CUarrayMapInfo::flagsCUarrayMapInfo::reserved[] 未使用,必须设置为零。

另请参阅

cuMipmappedArrayCreate, cuArrayCreate, cuArray3DCreate, cuMemCreate, cuArrayGetSparseProperties, cuMipmappedArrayGetSparseProperties

CUresult cuMemRelease ( CUmemGenericAllocationHandle handle )
释放表示先前通过 cuMemCreate 分配的内存分配的内存句柄。
参数
handle
先前由 cuMemCreate 返回的句柄值。
描述

释放通过 cuMemCreate 在设备上分配的内存。

当所有未完成的内存映射都已取消映射,并且所有未完成的句柄引用(包括其可共享的副本)也都已释放时,内存分配将被释放。 当仍有使用此句柄进行的未完成映射时,可以释放通用内存句柄。 每次接收进程导入可共享句柄时,都需要将其与 cuMemRelease 配对,以便释放该句柄。 如果handle不是有效的句柄,则行为未定义。

注意

请注意,此函数也可能返回来自先前异步启动的错误代码。

另请参阅

cuMemCreate

CUresult cuMemRetainAllocationHandle ( CUmemGenericAllocationHandle* handle, void* addr )
给定地址addr,返回后备内存分配的分配句柄。
参数
handle
后备内存分配的 CUDA 内存句柄。
addr
要查询的内存地址,该地址先前已被映射。
描述

该句柄保证是用于映射内存的相同句柄值。 如果请求的地址未映射,则该函数将失败。 返回的句柄必须通过相应次数的 cuMemRelease 调用来释放。

注意

地址addr,可以是先前由 cuMemMap 映射的范围内的任何地址,而不一定是起始地址。

另请参阅

cuMemCreate, cuMemRelease, cuMemMap

CUresult cuMemSetAccess ( CUdeviceptr ptr, size_t size, const CUmemAccessDesc* desc, size_t count )
为 <0xC2><0xA0>中指定的每个位置设置访问标志desc对于给定的虚拟地址范围。
参数
ptr
- 虚拟地址范围的起始地址
size
- 虚拟地址范围的长度
desc
- CUmemAccessDesc 数组,描述如何更改
  • 为每个指定的位置进行映射
count
- <0xC2><0xA0>中的 CUmemAccessDesc 数量desc
描述

给定通过 <0xC2><0xA0>的虚拟地址范围ptrsize,以及由 <0xC2><0xA0>给出的数组中的位置desccount,为目标位置设置访问标志。 该范围必须是完全映射的地址范围,其中包含由 cuMemMap / cuMemCreate 创建的所有分配。 用户不能为使用其他位置类型创建的分配指定 CU_MEM_LOCATION_TYPE_HOST_NUMA 可访问性。 注意:当 CUmemAccessDesc::CUmemLocation::type 为 CU_MEM_LOCATION_TYPE_HOST_NUMA 时,CUmemAccessDesc::CUmemLocation::id 将被忽略。 当为映射多播对象的虚拟地址范围设置访问标志时,ptrsize必须与 cuMulticastGetGranularity 使用标志 CU_MULTICAST_MINIMUM_GRANULARITY 返回的值对齐。但是,为了获得最佳性能,建议ptrsizecuMulticastGetGranularity 使用标志 CU_MULTICAST_RECOMMENDED_GRANULARITY 返回的值对齐。

注意
  • 请注意,此函数也可能返回来自先前异步启动的错误代码。

  • 对于大多数用例,此函数表现出 同步 行为。

另请参阅

cuMemSetAccess, cuMemCreate, :cuMemMap

CUresult cuMemUnmap ( CUdeviceptr ptr, size_t size )
取消映射给定地址范围的后备内存。
参数
ptr
- 要取消映射的虚拟地址范围的起始地址
size
- 要取消映射的虚拟地址范围的大小
描述

该范围必须是映射到的整个连续地址范围。 换句话说,cuMemUnmap 无法取消映射由 cuMemCreate / cuMemMap 映射的地址范围的子范围。 如果没有现有映射且没有未释放的内存句柄,则将释放任何后备内存分配。

cuMemUnmap 成功返回时,地址范围将转换为地址预留,并且可以用于将来调用 cuMemMap。 对此虚拟地址的任何新映射都需要通过 cuMemSetAccess 授予访问权限,因为所有映射都以未设置可访问性开始。

注意
  • 请注意,此函数也可能返回来自先前异步启动的错误代码。

  • 对于大多数用例,此函数表现出 同步 行为。

另请参阅

cuMemCreate, cuMemAddressReserve