Memory Types of Discrete GPUs

Memory types of discrete GPUs – RasterGrid | Software Consultancy

一、带宽:VRAM 与系统内存的根本差异

1.1 为什么独立 GPU 需要专用显存

  • 独立 GPU 拥有自己的 专用显存(VRAM) ,显存本身以及它与 GPU 之间的连接都针对 最大带宽 进行了优化
  • 这是独立 GPU 相比集成 GPU 性能显著更高的根本原因——额外的带宽使 GPU 能够 扩展到更高的核心数量
  • 与 CPU 形成对比:CPU 核心数较少,更优先考虑 低延迟 而非纯带宽;GPU 核心数众多,需要用 高带宽 持续喂数据

1.2 各类内存带宽对比

内存类型每引脚事务率总线宽度带宽
DDR4 (系统内存)~3.2 GT/s64-bit(单通道)/ 128-bit(双通道)~25.6 / ~51.2 GB/s
GDDR5~8 GT/s128 / 256 / 384-bit~128 / ~256 / ~384 GB/s
GDDR6~16 GT/s128 / 192 / 256-bit~256 / ~384 / ~512 GB/s
HBM~1 GT/s2048 / 3072 / 4096-bit~256 / ~384 / ~512 GB/s
HBM2~2 GT/s2048 / 3072 / 4096-bit~512 / ~768 / ~1024 GB/s

核心要点: GPU 使用 更宽的总线带宽优化的显存芯片 ,有效带宽比系统内存高 约一个数量级

1.3 PCIe 总线带宽——跨设备通信的瓶颈

GPU 通常通过 PCIe x16 连接器连接到主板,但实际可用的 PCIe 版本和通道数取决于 CPU、主板、PCIe 插槽和 GPU 四者的 最小公倍数

PCIe 版本每通道事务率通道数带宽(单向)
PCIe 3.08 GT/sx4 / x8 / x16~4 / ~8 / ~16 GB/s
PCIe 4.016 GT/sx4 / x8 / x16~8 / ~16 / ~32 GB/s

注:每条通道支持 双向通信 ;实际有效速率因 128b/130b 编码 开销而略低。

关键结论: PCIe 带宽远低于 GPU 访问本地 VRAM 的带宽(如 PCIe 4.0 x16 约 32 GB/s vs GDDR6 256-bit 约 512 GB/s),因此 数据放置位置 对性能有巨大影响。


二、内存访问模型:四种图形内存类型

2.1 系统整体内存拓扑

在独立 GPU 系统中,CPU 和 GPU 各自有本地内存,同时可以通过 PCIe 总线 双向访问 对方的内存:

  • GPU 可访问的内存:
    • 本地内存(Local Memory / VRAM) :通过 GPU 自身的宽总线访问
    • 远程内存(Remote Memory / GPU 可见的系统 RAM) :通过 PCIe 总线访问
  • CPU 可访问的内存:
    • 系统 RAM(本地)
    • CPU 可见的 VRAM 部分 :通过 PCIe 总线访问(这正是 Smart Access Memory 的关键所在)

2.2 缓存行为的关键差异

  • GPU 遵循 更宽松的缓存一致性规则 ,追求更高性能,通常 缓存所有内存访问
  • CPU 对 GPU 内存的访问通常 不缓存 ,只有远程缓存内存(Remote Cached Memory)例外

2.3 四种图形内存类型

内存类型说明GPU 是否缓存CPU 是否缓存
Local Visible MemoryCPU 可直接访问的 VRAM
Local Invisible MemoryCPU 不可直接访问的 VRAM
Remote Cached MemoryGPU 可访问、CPU 会缓存的系统内存
Remote Uncached MemoryGPU 可访问、CPU 不缓存的系统内存

重要影响:

  • CPU 从 非缓存内存 读取显著更慢
  • CPU 缓存的内存(Remote Cached)与 GPU 之间可能需要 CPU 缓存刷新/失效操作嗅探协议 来维持一致性

三、延迟:各内存类型的读取延迟

3.1 实测数据(Ryzen 5 3600X + Radeon RX 580,PCIe 3.0 x16)

内存类型CPU 读取延迟GPU 读取延迟
GPU 本地(VRAM)~1200 ns(最高可达 ~1900 ns)~340 ns(L2 命中 ~150 ns)
远程缓存(Remote Cached)~100 ns(L1/L2/L3 命中时 ~1/3/9 ns)~1100 ns(L2 命中 ~150 ns)
远程非缓存(Remote Uncached)~115 ns~1100 ns(L2 命中 ~150 ns)

3.2 两个关键结论

  1. VRAM 延迟高于系统内存 :这与 GPU 内存系统 优化吞吐量、牺牲延迟 的设计一致
  2. 通过 PCIe 总线访问显著增加延迟 :无论是 CPU 读 VRAM 还是 GPU 读系统内存,跨总线延迟都大幅增加

四、可调整 BAR(Resizable BAR)与 AMD Smart Access Memory

4.1 BAR 是什么

  • PCIe 设备需要通过 基地址寄存器(Base Address Registers,BAR) 映射到系统的 I/O 端口或 内存地址空间 ,驱动程序才能与硬件通信
  • Local Visible Memory 的大小由 BAR 配置决定

4.2 传统限制:256MB 窗口

  • 传统上,GPU 的显存 BAR 被限制在 256MB ——无论显卡有多少 VRAM,CPU 只能看到其中 256MB 的窗口
  • 早期 API(如 OpenGL)甚至不让应用程序显式选择内存类型,完全由驱动决定
  • Vulkan 等新 API 暴露了各个内存类型,给开发者完全控制权
    • AMD 从一开始就暴露了 Local Visible Memory
    • NVIDIA 直到 2020 年才跟进

4.3 为什么等了这么久

  • Resizable BAR2008 年 就是 PCIe 规范的一部分
  • 当时 32 位操作系统仍然普遍,从 4GB 地址空间中拿出超过 256MB 给显存不现实
  • 更主要的原因:硬件/固件/软件栈各层缺乏适当支持(如 Windows 支持直到最近才到来)

4.4 Smart Access Memory 的本质

  • AMD 率先启用了 Resizable BAR 支持(初期仅限最新显卡系列)
  • 技术本身 没有专有性 ,只是在 BIOS、操作系统、驱动等各层启用已有功能
  • NVIDIA 也计划推出自己的版本
  • 未来趋势 :所有厂商、所有平台的独立 GPU 都将在 Vulkan 等 API 中暴露 整个 VRAM 作为 Local Visible Memory

"Local Invisible Memory 的时代即将终结"


五、性能收益分析

5.1 核心问题:CPU 每帧动态生成大量数据

游戏/图形应用中,大量输入数据由 CPU 每帧动态生成

  • 逐帧/逐对象常量数据 (变换矩阵等)
  • 动态几何数据
  • 流式资源
  • 其他需要写入 GPU 可访问内存的数据

理想选择 :直接写入 Local Visible Memory ——写操作不太关心延迟,且数据立即在 VRAM 中可用,GPU 后续读取性能最佳。

5.2 当 256MB 窗口耗尽时的两种降级方案

方案一:使用远程内存(通常是 Remote Uncached)

  • 缺点 :GPU 每次读取都受 PCIe 总线 带宽和延迟 限制
  • 对小数据(如逐帧常量)可接受
    • PCIe 带宽不是瓶颈
    • 数据足够小且频繁使用时会留在 GPU 缓存中,延迟可以被众多线程分摊
    • 但首次访问时可能有 数千线程阻塞等待数据到达 ,且数据可能在帧处理过程中被 多次驱逐出缓存

方案二:先写入远程内存,再用 GPU DMA 拷贝到 Local Invisible Memory

  • 缺点
    • 需要 额外拷贝 操作
    • 即使使用 GPU 内置 DMA 引擎不占用 GPU 核心时间,仍需等待完成
    • 可能需要 额外同步操作
    • 内存需求至少临时翻倍
  • 对大数据集更优
    • DMA 传输连续数据流能更好利用 PCIe 带宽
    • 等待期间依赖线程不占用 GPU 核心的 宝贵寄存器空间 ,允许更多无依赖工作执行

5.3 驱动内部资源同样受益

不仅应用程序分配的内存,图形驱动自身 也有资源需要存储在 GPU 可访问内存中:

  • 内部资源
  • 描述符表/池 (通常直接从显存读取)
  • 命令缓冲区内存 (重中之重)

如果驱动使用 Local Visible Memory 存放这些资源,256MB 窗口会更快耗尽;如果窗口已满,驱动也必须使用上述降级方案。Resizable BAR 同样惠及这些驱动内部资源。


六、例外情况:什么时候不应该用 VRAM

6.1 超大数据集

  • VRAM 装不下时,远程内存作为 后备存储
  • 更好的做法:把 VRAM 当作活跃(或性能关键)数据集的 缓存 使用

6.2 纹理上传的暂存缓冲区(Staging Buffer)

  • 纹理数据通常需要从设备无关格式转换为 GPU 支持的 最优平铺格式(Tiling)
  • 推荐做法
    1. CPU 将 Pitch-Linear 暂存纹理数据写入 Remote Uncached Memory
    2. 用显卡 DMA 引擎执行 线性到平铺拷贝(Linear-to-Tiled Copy) 上传到 VRAM
  • 原因 :数据无论如何需过 PCIe 一次,DMA 引擎可以更高效地完成转换,且 不消耗 CPU/GPU 处理核心时间

6.3 数据回读(Read-back)

  • 非平凡的数据回读 (纹理或缓冲区):使用 Remote Cached Memory
    • 利用 CPU 缓存可比非缓存快 数个数量级
  • 小数据回读 (计数器值、查询结果):使用 Uncached Memory 更优
    • 可以 避免 CPU 缓存失效操作 的开销

七、总结与关键要点

要点说明
VRAM 带宽远超系统内存约一个数量级的差距
PCIe 是跨设备访问的瓶颈PCIe 4.0 x16 ~32 GB/s vs GDDR6 ~512 GB/s
四种图形内存类型Local Visible / Invisible + Remote Cached / Uncached
GPU 缓存一切,CPU 仅缓存 Remote Cached缓存行为差异影响使用策略
Resizable BAR(Smart Access Memory)让 CPU 看到整个 VRAM,消除 256MB 窗口限制
核心收益消除降级方案带来的额外拷贝/同步/带宽/延迟开销
不是万能药纹理上传用 staging buffer、数据回读用 Remote Cached 等场景仍需合理选择

最终结论 :Resizable BAR 虽不是独立 GPU 技术的"圣杯",但对应用开发者而言是 真正的游戏规则改变者 ——开发者现在拥有了更大的自由度来将数据放置在合适的内存池中,同时消除了以往为实现这一目标所需的不必要拷贝。