NUMA-04 显存迁回内存:AMD/Intel 的 SVM 与Eviction的实现是否考虑了NUMA
前三篇的迁移都在“普通内存 ↔ 普通内存”。但 GPU 显存 CPU 根本访问不到它是怎么被纳入进程地址空间、又怎么在缺页时自动迁回内存以及回迁时怎么选择numa node。这将是本文的主题。0. 本章要回答的问题GPU 显存这种 CPU 不能直接读的内存怎么变成进程页表里的一个页ZONE_DEVICE/ device private pageCPU 去访问一个“其实在显存里”的地址时会发生什么migrate_to_ram缺页回调device→host 迁移时那个“目标 CPU 页”是在哪分配、落在哪个 node 的第 3 问是重点。本文更多的是分析当前的实现是否考虑了NUMA至于怎么优化放在后文分析。1. HMM 与 ZONE_DEVICE把设备内存塞进内存地图1.1 为什么需要它统一内存SVM / HMM的目标是CPU 和 GPU 共享同一套虚拟地址一个指针两边都能用。难点在于——同一个虚拟地址其物理页可能此刻在系统内存、下一刻被迁到了显存。内核需要一种办法把“显存里的页”也表示成一个struct page挂进进程页表这样缺页、迁移、反向映射这些既有机制才能复用。ZONE_DEVICE就是这个办法它为设备内存创建struct page但标记成特殊类型。其中 GPU 显存用的是MEMORY_DEVICE_PRIVATEinclude/linux/memremap.h// include/linux/memremap.henummemory_type{/* 0 is reserved to catch uninitialized type fields */MEMORY_DEVICE_PRIVATE1,// 设备私有内存CPU 不能直接访问// ...};MEMORY_DEVICE_PRIVATE的含义这些页有struct page、能进页表但 CPU 不能直接解引用——CPU 一旦访问就触发缺页由驱动把它迁回真正的系统内存。1.2 显存怎么注册进来devm_memremap_pages驱动在初始化时把一段显存通过devm_memremap_pages()或memremap_pages()注册为ZONE_DEVICE内核为这段显存建立struct page数组并绑定一个struct dev_pagemapinclude/linux/memremap.h// include/linux/memremap.hstructdev_pagemap{// ...conststructdev_pagemap_ops*ops;// 关键设备页的行为回调// ...};structdev_pagemap_ops{void(*page_free)(structpage*page);vm_fault_t(*migrate_to_ram)(structvm_fault*vmf);// CPU 访问设备页时的缺页回调};GPU VRAM 一段物理区间devm_memremap_pages()注册为 ZONE_DEVICE生成 struct page 数组type MEMORY_DEVICE_PRIVATE绑定 dev_pagemap.ops.migrate_to_ram 驱动回调这些 page 可以挂进进程页表2. CPU 访问设备页migrate_to_ram缺页回调当一段 SVM 内存当前在显存页表项指向 device private page而 CPU 代码去读写它时MMU 发现这是特殊页触发缺页异常内核回到dev_pagemap_ops.migrate_to_ram这个回调——把页迁回系统内存再让 CPU 访问继续。KFD 路径的注册drivers/gpu/drm/amd/amdkfd/kfd_migrate.c// drivers/gpu/drm/amd/amdkfd/kfd_migrate.cstaticconststructdev_pagemap_opssvm_migrate_pgmap_ops{.page_freesvm_migrate_page_free,.migrate_to_ramsvm_migrate_to_ram,// CPU 缺页 → 迁回系统内存};svm_migrate_to_ram()最终调用svm_migrate_vram_to_ram()走的正是第 03 章的migrate_vma三段式方向标志选设备页kfd_migrate.c// kfd_migrate.c svm_migrate_vma_to_ram()if(adev-gmc.xgmi.connected_to_cpu)migrate.flagsMIGRATE_VMA_SELECT_DEVICE_COHERENT;elsemigrate.flagsMIGRATE_VMA_SELECT_DEVICE_PRIVATE;// 挑出设备私有页// ...rmigrate_vma_setup(migrate);// 收集源(显存)页// ... 驱动为每个源页分配一个“系统内存页”填进 migrate.dst[]migrate_vma_pages(migrate);migrate_vma_finalize(migrate);整条缺页迁回链路是否就在内存CPU 读写一个 SVM 地址页表项指向device private page?MMU 触发缺页dev_pagemap_ops.migrate_to_ram() svm_migrate_to_rammigrate_vma 三段式flags DEVICE_PRIVATE为每个显存页分配一个系统内存页 → dst[]拷贝、重映射、收尾CPU 访问继续这部分的详细原理可以从参考Linux 内存管理子系统的进化——从 MM 到 HMM。3. 目标 CPU 页在哪分配、落哪个 nodemigrate_vma三段式里“填dst[]”这一步在驱动手里填的时候用哪个 node 分配就决定了页迁回后落在哪个 node。3.1 AMD KFD 路径alloc_page_vma跟随 VMA 策略KFD 用svm_migrate_get_sys_page()分配目标系统页kfd_migrate.c// kfd_migrate.cstaticstructpage*svm_migrate_get_sys_page(structvm_area_struct*vma,unsignedlongaddr){structpage*page;pagealloc_page_vma(GFP_HIGHUSER,vma,addr);// ← 落点由 VMA 的 mempolicy 决定if(page)lock_page(page);returnpage;}alloc_page_vma()按这段 VMA 的 NUMA 内存策略分配没有特殊策略时就是 first-touch/当前 node。这里的“VMA 策略”就是第 02 章mbind设定的“地址段级策略”内核里挂在 VMA 上没设时退化成第 01 章讲的 first-touch。也就是说——KFD 迁回的落点取决于 VMA 策略或触发缺页的那个 CPU 所在 node而不是“GPU 物理上最近的 node”。3.2 DRMdrm_pagemap路径vma_alloc_folio/folio_allocIntel 的 DRM SVM 后端走drm_pagemap。它填目标页的函数是drm_pagemap_migrate_populate_ram_pfn()drivers/gpu/drm/drm_pagemap.c// drivers/gpu/drm/drm_pagemap.c drm_pagemap_migrate_populate_ram_pfn()/* TODO: Support fallback to single pages if THP allocation fails */if(vas)foliovma_alloc_folio(GFP_HIGHUSER,order,vas,addr);// 有 VMA跟随 VMA 策略elsefoliofolio_alloc(GFP_HIGHUSER,order);// 无 VMA直接落当前 node有vasVMA时vma_alloc_folio跟随 VMA 的 mempolicy等价于 first-touch落点是“碰它的 CPU”所在 node。无vas时如后台驱逐 evictfolio_alloc完全不带 node 偏好落在当前执行线程所在的 node。两种情况都没有把“发起迁移的 GPU 最近的那个 CPU node”作为参数。在 NPS4 / 多 socket 机器上这意味着页很可能迁到一个离目标 GPU 较远的 node后续 CPU 访问就吃了远程延迟——这正是发现的问题。3.3 两条路径对照路径分配目标页的函数落点依据是否考虑 GPU 邻近 nodeKFDalloc_page_vma(GFP_HIGHUSER, vma, addr)VMA mempolicy / 当前 node否DRMdrm_pagemap有 VMAvma_alloc_folio(...)VMA mempolicy否DRMdrm_pagemapevict无 VMAfolio_alloc(GFP_HIGHUSER, order)当前 node无偏好否结论现有 device→host 迁移的落点从来不是“GPU 最近的 node”而是“恰好碰它的 CPU”或“当前 node”。4. evict 路径除了 CPU 缺页触发的迁回还有一类是显存吃紧时的驱逐evict把 SVM 显存页赶回系统内存腾空间。evict 往往发生在没有用户 VMA 上下文的后台流程里正对应folio_allocvas NULL分支——连 VMA 策略都没有纯落当前 node离“最近 node”更远。所以 evict 路径是这个问题最明显的受害场景。触发迁回的两种来源有无CPU 缺页migrate_to_rampopulate_ram_pfn 分配目标页显存驱逐evict_to_ram有 VMA 上下文?vma_alloc_folio跟随 VMA 策略folio_alloc落当前 node落点都可能远离发起 GPU 的最近 node5. 本章小结把“目标 node”的旅程接到本章层现状应该怎样用户态/上层只说“迁回 SYSMEM”传入/推导出“GPU 最近的 node id”drm_pagemap 分配vma_alloc_folio/folio_alloc无 node 偏好用alloc_pages_node(nid, ...)之类带上目标 node落点碰它的 CPU / 当前 nodeGPU 邻近 node也就是说第 01 章“怎么反推 GPU 最近 node”、第 02 章“move_pages/分配 API 怎么指定 node”、第 03 章“node 参数怎么决定落点”到这里合流成一个具体的问题**在drm_pagemap的 populate_ram 分配处把正确的 node 传进去。总结下本文的技术要点ZONE_DEVICE/MEMORY_DEVICE_PRIVATE让显存拥有struct page、能进页表但 CPU 不能直接访问include/linux/memremap.h。驱动用devm_memremap_pages()注册显存绑定dev_pagemap.ops.migrate_to_ram回调。CPU 访问设备页触发缺页 →migrate_to_ram→migrate_vma三段式迁回系统内存。下面是本文的两个焦点问题焦点1目标 CPU 页由alloc_page_vmaKFD/vma_alloc_folio·folio_allocDRM分配落点是 VMA 策略或当前 node都不考虑 GPU 邻近 node。焦点2evict 路径无 VMA用folio_alloc纯落当前 node是问题最突出的场景。接下来讨论下可能的优化以及helios和GB200这种机架式系统中的numa。关联阅读01 你的内存不是一整块看懂 NUMA 与机器拓扑02 一段内存到底在哪个 node用户态 NUMA 编程接口03 页是怎么在 node 间搬家的内核 NUMA 与页迁移机制ZONE_DEVICE为设备内存创建 struct page

相关新闻

双系统下Docker部署Milvus 2.3.4与ATTU可视化实战

双系统下Docker部署Milvus 2.3.4与ATTU可视化实战

1. 项目概述:为什么要在双系统环境下折腾 Milvus? 最近在做一个本地知识库的RAG项目,向量数据库的选型自然落到了Milvus头上。我的主力开发机是Windows 10,但很多AI和数据库生态的工具链在Linux下更友好、更稳定。为了兼顾日常办公…

2026/7/31 8:20:39 阅读更多 →
贪心算法实战:区间调度问题解析与多语言实现

贪心算法实战:区间调度问题解析与多语言实现

1. 项目概述:从一道机试真题看区间调度算法最近在帮几个准备华为OD机试的朋友做模拟练习,发现“演唱会”这道题(题目编号268,据传是2025B卷的真题)的出镜率相当高。题目本身描述很生活化:给你一堆演出的开始…

2026/7/31 8:20:39 阅读更多 →
C#断点失效全解析:从PDB原理到实战排查指南

C#断点失效全解析:从PDB原理到实战排查指南

1. 项目概述:当断点“失灵”时,我们在调试什么?“C# 当前不会命中断点”——这大概是每个C#开发者,无论是刚入门的新手还是经验丰富的老手,都曾遇到过的最令人沮丧的调试提示之一。你信心满满地在代码行左侧点下那个小…

2026/7/31 8:20:39 阅读更多 →

最新新闻

全球内存短缺,苹果 Q3 营收仍逆势上扬!库克卸任前苹果面临哪些挑战与机遇?

全球内存短缺,苹果 Q3 营收仍逆势上扬!库克卸任前苹果面临哪些挑战与机遇?

全球内存短缺让设备制造商压力山大,苹果却在第三季度财报中交出亮眼成绩,iPhone 和 Mac 销售额大幅增长。不过,未来供应限制或加剧,库克也将卸任,苹果前路几何? Q3 财报:逆势增长 尽管全球内存短…

2026/7/31 9:00:55 阅读更多 →
杰理之usb(dm)与sd(data)复用U盘兼容性差【篇】

杰理之usb(dm)与sd(data)复用U盘兼容性差【篇】

2026/7/31 9:00:55 阅读更多 →
逻辑门真值表深度解析:从布尔代数到硬件调试与位运算实战

逻辑门真值表深度解析:从布尔代数到硬件调试与位运算实战

1. 项目概述:从真值表到逻辑世界的基石“逻辑门真值表”,这听起来像是计算机科学或数字电路教科书里最基础、最枯燥的一章。很多初学者,甚至一些从业者,都容易轻视它,觉得无非就是几个0和1的排列组合,背下来…

2026/7/31 9:00:55 阅读更多 →
房山区口碑好的大宅门窗维修维保服务中心

房山区口碑好的大宅门窗维修维保服务中心

在房山区,大宅门窗的维修与维保是众多业主关注的重点。门窗不仅关系到家居的安全性,还影响着室内的舒适度和美观度。今天就为大家介绍一家口碑极佳的大宅门窗维修维保服务中心——北京鸣然断桥铝门窗服务部。一、服务项目全面,一站式解决门窗…

2026/7/31 9:00:55 阅读更多 →
Unity URP移动端性能优化:集成FSR超分辨率提升帧率与画质

Unity URP移动端性能优化:集成FSR超分辨率提升帧率与画质

1. 项目概述:为什么要在Unity URP中折腾超分辨率?做移动端或者跨平台项目,尤其是面向中低端设备的开发者,对“性能”和“画质”这对冤家一定深有体会。想要画面清晰锐利,就得拉高分辨率,但GPU瞬间就扛不住了…

2026/7/31 9:00:55 阅读更多 →
C++字符串分割:从标准库缺失到高性能实现方案全解析

C++字符串分割:从标准库缺失到高性能实现方案全解析

1. 项目概述:为什么C标准库没有split? 这个问题,估计每个从Python、Java或者C#转过来的C开发者,都曾在某个深夜对着屏幕发出过灵魂拷问。别的语言里,一句 str.split(",") 就能优雅搞定的事情,怎…

2026/7/31 8:59:55 阅读更多 →

日新闻

物理复制比逻辑复制好在哪?数据库复制原理详解

物理复制比逻辑复制好在哪?数据库复制原理详解

数据库复制是把主库数据同步到备库的机制,分为逻辑复制和物理复制两种。逻辑复制传输的是 SQL 语句或行变更事件,物理复制传输的是存储引擎底层的物理日志。阿里云 PolarDB(云原生数据库)采用物理复制,在同步延迟、数据…

2026/7/31 0:00:34 阅读更多 →
BilibiliDown:3分钟学会B站视频下载的终极指南

BilibiliDown:3分钟学会B站视频下载的终极指南

BilibiliDown:3分钟学会B站视频下载的终极指南 【免费下载链接】BilibiliDown (GUI-多平台支持) B站 哔哩哔哩 视频下载器。支持稍后再看、收藏夹、UP主视频批量下载|Bilibili Video Downloader 😳 项目地址: https://gitcode.com/gh_mirrors/bi/Bilib…

2026/7/31 0:00:34 阅读更多 →
有哪些游戏数据AI平台?游戏行业Data+AI融合方案盘点

有哪些游戏数据AI平台?游戏行业Data+AI融合方案盘点

当前,游戏行业的“DataAI融合”已从概念验证进入价值落地阶段。根据IDC 2025年数据,中国AI游戏云市场规模已达18.6亿元;同时,游戏研发环节AI渗透率高达86%,生成式AI内容普及率超过50%。面对庞大的市场,游戏…

2026/7/31 0:00:34 阅读更多 →

周新闻

深度学习道路桥梁裂缝检测系统 道路桥梁裂缝检测数据集 道路桥梁病害识别检测数据集

深度学习道路桥梁裂缝检测系统 道路桥梁裂缝检测数据集 道路桥梁病害识别检测数据集

深度学习道路桥梁裂缝检测系统 数据集6000张 完整源码已标注数据集训练好的模型环境配置教程程序运行说明文档,可以直接使用!系统支持图片、视频、摄像头等多种方式检测裂缝,功能强大实用。 1数据集6000张 8各类别

2026/7/31 1:03:03 阅读更多 →
深度学习YOLO模型如何训练 PUBG 绝地求生目标检测数据集

深度学习YOLO模型如何训练 PUBG 绝地求生目标检测数据集

pubg数据集 精选原图1.42万数据 1.49万标签 无任何重复、算法增强或冗余图像! pubg绝地求生目标检测数据集 1分类:e_body,14905个标签,txt格式 共计14244张图,99%为640*640尺寸图像 适合yolo目标检测、AI训练关键词&am…

2026/7/29 14:34:28 阅读更多 →
Apex英雄目标检测数据集 深度学习框架YOLO如何训练APEX数据集

Apex英雄目标检测数据集 深度学习框架YOLO如何训练APEX数据集

Apex检测数据集数据集详情检测类别: allies enemy tag图片总量:7247张训练集:5139张验证集:1425张测试集:683张标注状态:全部已标注,即拿即用数据格式:支持YOLO格式及其他格式&#…

2026/7/31 4:19:39 阅读更多 →

月新闻