Skip to content

统一内存:从 Windows 的失望到 Linux 的实践

我在我的 AMD Ryzen 7 8845H w/ Radeon 780M Graphics + 32GB DDR5 7500 MT/s 电脑上部署 本地大语言模型(就是玩)过程中,发现使用 Vulkan backend 进行 offload 时, --num-gpu-layer 的值越大,使用的内存越多,怀疑模型参数被额外拷贝到了 GPU 管理的内存上,统一内存应该是这个问题的正解。我阅读 CUDA 和 ROCm 的统一内存文档,用 ROCm 的接口在 Windows 上用 hipDeviceGetAttribute() 查了一下统一内存支持情况,结果全是不支持。一台 2023 年的 UMA 架构电脑不该是这个待遇。后来转到 Linux,实现了我最开始的需求。

统一内存是什么?

Apple M 系列 SoC、AMD Ryzen AI 系列 APU, NVIDIA RTX Spark 都宣传其使用统一内存,这里的统一内存是指 Unified Memory Architecture 硬件架构:GPU 没有专用的 GDDR 显存芯片,和 CPU 共享 DDR 内存。

在 CUDA 中,统一内存是种功能。它允许 NVIDIA 驱动程序管理主机和设备之间的数据传输[1],根据不同显卡和操作系统,有从有限到完全的多种级别,主要在于 GPU 是否有缺页中断机制,使用软件还是硬件一致性机制,使用的操作系统。

糟糕的 Windows 平台支持

CUDA 在 Windows 平台只有有限的统一内存支持,当GPU内核启动时,所有托管内存通常都必须转移到 GPU 内存[2],浪费了内存。

ROCm 统一内存管理文档[3] 没有提到 Windows 支持,调用 hipDeviceGetAttribute() 查询支持属性全部得到了不支持。

这完全不符合对一个 2023 年推出的 GPU 能提供的特性的预期。理想上,现代的 UMA 架构的电脑应当能支持 Full support for all allocations with hardware coherence;退一步从需求上来说,也要达到 Full support for explicit managed memory allocations 按需将托管数据细粒度地移动到 GPU 减少对内存的需要 [4]

聪明如 NVIDIA 工程师也没有在 Windows 上提供任何完整的统一内存支持,但是最近 RTX Spark 官宣,号称重塑 Windows PC,引领个人 AI 时代,随之则带来了新的疑问:除了 Agent 安全性改进以外,微软和 NVIDIA 是否正在神秘的 Windows 11 26H1 中悄悄打造完整的统一内存支持?

对于 Windows 上的 Strix Halo 上部署大模型,解决方法则是令人哭笑不得:引入了一项BIOS级功能,允许用户将一定比例的系统内存重新分配给集成显卡。在 128GB 内存电脑上,最高可将 96GB 内存划为 GPU 专用内存。当然这也意味着可用的 CPU 内存减少了。

https://www.amd.com/en/blogs/2025/faqs-amd-variable-graphics-memory-vram-ai-model-sizes-quantization-mcp-more.html

转战 Linux

在 Linux 调用 hipDeviceGetAttribute() 查询支持属性得到了以下结果:

hipDeviceAttributeManagedMemory: 1
hipDeviceAttributeConcurrentManagedAccess: 1
hipDeviceAttributePageableMemoryAccess: 0

hipDeviceAttributeConcurrentManagedAccess: 1 表明完全支持统一内存,最开始的需求算是满足了。

接下来我又接连踩坑:llama.cpp 的 HIP Linux release 缺少 gfx1103 target[5],用仓库里的 ROCm 7.2 从源码编译又遇到 rms_norm_mul_f32 kernel 报错。最终我改用 therock nightly 构建的 llama.cpp,用约 24 GB 内存成功跑起了满上下文窗口的 Qwen3.6 35B A3B,生成速度达到 9 token/s。


  1. https://docs.nvidia.com/cuda/cuda-programming-guide/02-basics/intro-to-cuda-cpp.html#unified-memory ↩︎

  2. https://docs.nvidia.com/cuda/cuda-programming-guide/04-special-topics/unified-memory.html#um-legacy-devices ↩︎

  3. https://rocm.docs.amd.com/projects/HIP/en/latest/how-to/hip_runtime_api/memory_management/unified_memory.html#system-requirements-for-managed-memory ↩︎

  4. Overview of Unified Memory Paradigms https://docs.nvidia.com/cuda/cuda-programming-guide/02-basics/understanding-memory.html#table-unified-memory-levels ↩︎

  5. https://github.com/ggml-org/llama.cpp/issues/20839 ↩︎