数据迁移和一致性:
统一内存通过将数据迁移到正在访问的设备(即将数据移动到主机内存(如果CPU正在访问它,并将数据移动到设备内存,如果GPU将访问它),来尝试优化内存性能)。 数据迁移是统一内存的基础,但对于程序而言是透明的。 系统会尝试将数据放置在最有效访问的位置,而不会违反一致性。
数据的物理位置对于程序是不可见的,并且可以随时更改,但访问数据的虚拟地址将保持任何处理器的有效性和连贯性,而不管本地是什么。 请注意,保持一致性是主要要求,在性能之前; 在主机操作系统的限制下,系统被允许无法访问或移动数据,以保持处理器之间的全局一致性。
计算能力低于6.x的GPU架构不支持托管数据向GPU按需细粒度移动。无论何时启动GPU内核,通常都必须将所有托管内存传输到GPU内存,以避免内存访问出现故障。通过计算能力6.x,引入了新的GPU页面错误机制,可提供更加无缝的统一内存功能。结合系统范围的虚拟地址空间,页面错误提供了几个好处。首先,页面错误意味着CUDA系统软件在每次内核启动之前不需要将所有托管的内存分配同步到GPU。如果在GPU上运行的内核访问不在其内存中的页面,则它会发生故障,从而允许页面按需自动迁移到GPU内存。或者,页面可能映射到GPU地址空间,以便通过PCIe或NVLink互连进行访问(访问映射有时可能比迁移快)。请注意,统一内存是系统范围内的:GPU(和CPU)可能会在CPU内存或系统中其他GPU的内存上发生故障并迁移内存页面。
GPU内存Oversubscription:
计算能力低于6.x的设备无法分配比GPU内存的物理大小更多的托管内存。
计算能力6.x的设备扩展寻址模式以支持49位虚拟寻址。 这足以覆盖现代CPU的48位虚拟地址空间以及GPU自己的内存。 大型虚拟地址空间和页面错误功能使应用程序能够访问整个系统虚拟内存,而不受任何一个处理器的物理内存大小的限制。 这意味着应用程序可以超额订阅内存系统:换句话说,它们可以分配,访问和共享比系统总物理容量更大的阵列,从而可以对超大型数据集进行非核心处理。 只要有足够的系统内存可用于分配,cudaMallocManaged就不会耗尽内存
多GPU支持:
对于计算能力低于6.x的设备,托管内存分配的行为与使用cudaMalloc()分配的非托管内存的行为相同:当前活动设备是物理分配的归属,所有其他GPU都接收对等映射
到内存。 这意味着系统中的其他GPU将通过PCIe总线以更低的带宽访问内存。 请注意,如果系统中的GPU之间不支持对等映射,则托管内存页将放置在CPU系统内存(“零拷贝”内存)中,并且所有GPU都会遇到PCIe带宽限制。 有关详细信息,请参阅6.x之前的架构下的带有多GPU程序的托管内存。
具有计算能力6.x的设备的系统上的托管分配对所有GPU均可见,并可按需迁移到任何处理器。