统一的存储器编程:
统一内存简介:
Unified Memory是CUDA编程模型的一个组件,首次在CUDA 6.0中引入,该模型定义了一个托管内存空间,其中所有处理器都可以看到具有公共地址空间的单个一致内存映像。
(处理器是指具有专用MMU的任何独立执行单元。 这包括任何类型和架构的CPU和GPU。)
底层系统管理CUDA程序中的数据访问和位置,而不需要显式的内存拷贝调用。 这有利于两种主要方式的GPU编程:
- GPU编程通过统一系统中所有GPU和CPU的内存空间并通过为CUDA程序员提供更紧密和更直接的语言集成而得到简化。
- 通过将数据透明地迁移到使用它的处理器,可以最大限度地提高数据访问速度。
简而言之,统一内存不需要通过cudaMemcpy *()例程进行显式数据移动,而且不会因将所有数据放入零拷贝内存而导致性能损失。 数据移动当然仍然会发生,所以程序的运行时间通常不会减少; 统一内存改为可以编写更简单,更易维护的代码。
Unified Memory提供了一个“单指针到数据”模型,它在概念上类似于CUDA的零拷贝内存。 两者之间的一个关键区别在于,使用零拷贝分配时,内存的物理位置被固定在CPU系统内存中,使得程序可能对其进行快速访问或缓慢访问,具体取决于访问的位置。 另一方面,统一内存将内存和执行空间分开,以便所有数据访问都很快。
统一内存这个术语描述了一个系统,它提供内存管理服务给各种各样的程序,从定位运行时API到使用虚拟ISA(PTX)的程序。 该系统的一部分定义了选择统一内存服务的托管内存空间。
托管内存可与设备特定的分配互操作并互换,例如使用cudaMalloc()例程创建的分配。 所有在设备内存上有效的CUDA操作在托管内存上也是有效的; 主要区别在于程序的主机部分也能够引用和访问内存。
系统要求:
统一内存有两个基本要求:
- SM体系结构3.0或更高版本的GPU(开普勒架构或更新)
- 一个64位主机应用程序和非嵌入式操作系统(Linux,Windows,MacOS)
SM体系结构6.x或更高版本(Pascal或更新版本)的GPU可提供额外的统一内存功能,如本文档中概述的按需页面迁移和GPU内存超额认购。 请注意,目前这些功能仅在Linux操作系统上受支持。 运行在Windows上的应用程序(无论是TCC还是WDDM模式)还是macOS,都将使用基本统一内存模型,与6.x之前的体系结构一样,即使它们在计算能力为6.x或更高的硬件上运行。