原理篇见【https://blog.csdn.net/shenjunpeng/article/details/150931847?spm=1011.2415.3001.5331】

1. HMM 的优势与挑战

1.1 优势

  • 统一虚拟地址空间:简化异构计算平台的数据共享和访问。

  • 高效页表同步:支持设备端的 page fault 和页表同步,提升性能。

  • 内存一致性保障:通过 notifier 机制保证 CPU/设备访问一致性。

  • 简化驱动开发:为设备驱动提供标准化 API,降低开发难度。

  • 支持多种内存类型:兼容系统内存、设备私有内存、P2P 内存等。

2.2 挑战

  • 性能开销:频繁的页表同步和失效处理可能带来性能损耗。

  • 一致性复杂性:多处理器、多设备间的数据一致性管理复杂。

  • 内核集成难度:与 mm、page table、notifier 等子系统深度耦合,开发和维护门槛高。

  • 异常场景处理:如 page fault 风暴、死锁、资源泄漏等需精心设计和测试。

2. 典型代码示例

2.1 注册 mmu_interval_notifier

struct mmu_interval_notifier notifier;
mmu_interval_notifier_insert(&notifier, mm, start, length, ops);

2.2 查询并同步页表

struct hmm_range range = {.notifier = &notifier,.start = start,.end = end,.hmm_pfns = pfns,.default_flags = HMM_PFN_REQ_FAULT | HMM_PFN_REQ_WRITE,.pfn_flags_mask = HMM_PFN_REQ_FAULT | HMM_PFN_REQ_WRITE,
};
int ret = hmm_range_fault(&range);
if (ret)// 处理错误
for (i = 0; i < npages; i++) {if (range.hmm_pfns[i] & HMM_PFN_VALID) {phys_addr_t pa = hmm_pfn_to_phys(range.hmm_pfns[i]);// 填充设备页表}
}

2.3 失效处理

static bool my_notifier_invalidate(struct mmu_interval_notifier *notifier,const struct mmu_notifier_range *range,unsigned long cur_seq)
{// 暂停设备访问,unmap 页表,等待恢复return true;
}

3. SVM 中 HMM 的使用场景

KFD SVM 通过 HMM 实现以下关键功能:

  1. GPU 访问用户空间内存前,获取并锁定物理页(即页表同步、page fault 支持)。

  2. 支持 GPU 侧 page fault,在 GPU 访问尚未分配物理页的虚拟地址时,驱动可通过 HMM 触发 CPU 侧分配物理页。

  3. 支持内存迁移,如将数据从系统内存迁移到 GPU 显存(VRAM),或反向迁移。

  4. 感知虚拟地址区间失效,如 unmap、migrate、swap out 等,及时更新 GPU 页表。

3.1 SVM 中 HMM 的典型调用流程

3.1.1 注册 mmu_interval_notifier

每个 SVM 区间(struct svm_range)在创建时,都会注册一个 mmu_interval_notifier,用于感知该区间的虚拟地址空间变化。这样一旦该区间被 unmap、迁移、失效,KFD 驱动就能收到通知,做相应处理。

static void
svm_range_add_notifier_locked(struct mm_struct *mm, struct svm_range *prange)
{mmu_interval_notifier_insert_locked(&prange->notifier, mm,prange->start << PAGE_SHIFT,prange->npages << PAGE_SHIFT,&svm_range_mn_ops);
}

3.1.2 获取并锁定物理页(hmm_range_fault)

该函数会遍历指定虚拟地址区间的页表,确保每一页都被分配物理页(如有必要会触发 CPU 侧 page fault),并将每一页的 PFN(页帧号)和状态标志写入 hmm_pfns 数组。这一步通常在 svm_range_validate_and_map → amdgpu_hmm_range_get_pages 中完成。

int amdgpu_hmm_range_get_pages(struct mmu_interval_notifier *notifier,uint64_t start, uint64_t npages, bool readonly,void *owner, struct page **pages,struct hmm_range **phmm_range)
{struct hmm_range *hmm_range;unsigned long end;unsigned long timeout;unsigned long i;unsigned long *pfns;int r = 0;hmm_range = kzalloc(sizeof(*hmm_range), GFP_KERNEL);if (unlikely(!hmm_range))return -ENOMEM;pfns = kvmalloc_array(npages, sizeof(*pfns), GFP_KERNEL);if (unlikely(!pfns)) {r = -ENOMEM;goto out_free_range;}hmm_range->notifier = notifier;hmm_range->default_flags = HMM_PFN_REQ_FAULT;if (!readonly)hmm_range->default_flags |= HMM_PFN_REQ_WRITE;hmm_range->hmm_pfns = pfns;hmm_range->start = start;end = start + npages * PAGE_SIZE;hmm_range->dev_private_owner = owner;do {hmm_range->end = min(hmm_range->start + MAX_WALK_BYTE, end);pr_debug("hmm range: start = 0x%lx, end = 0x%lx",hmm_range->start, hmm_range->end);timeout = jiffies + msecs_to_jiffies(HMM_RANGE_DEFAULT_TIMEOUT);retry:hmm_range->notifier_seq = mmu_interval_read_begin(notifier);r = hmm_range_fault(hmm_range);if (unlikely(r)) {if (r == -EBUSY && !time_after(jiffies, timeout))goto retry;goto out_free_pfns;}if (hmm_range->end == end)break;hmm_range->hmm_pfns += MAX_WALK_BYTE >> PAGE_SHIFT;hmm_range->start = hmm_range->end;} while (hmm_range->end < end);hmm_range->start = start;hmm_range->hmm_pfns = pfns;for (i = 0; pages && i < npages; i++)pages[i] = hmm_pfn_to_page(pfns[i]);*phmm_range = hmm_range;return 0;out_free_pfns:kvfree(pfns);
out_free_range:kfree(hmm_range);if (r == -EBUSY)r = -EAGAIN;return r;
}

3.1.3 填充 GPU 页表

获取到物理页后,KFD 驱动会将这些页的物理地址通过 DMA 映射,填充到 GPU 页表,实现 GPU 对用户空间内存的直接访问。这里 hmm_range->hmm_pfns 就是 HMM 返回的每一页的 PFN 和状态。

r = svm_range_dma_map(prange, ctx->bitmap, offset, npages, hmm_range->hmm_pfns);

3.1.4 失效与恢复

当用户空间对 SVM 区间做 unmap、迁移等操作时,HMM 通过 mmu_interval_notifier 回调(如 svm_range_cpu_invalidate_pagetables)通知 KFD 驱动,KFD 会暂停 GPU 访问、unmap 页表、等待恢复。

4. 总结

HMM 是 Linux 内核为异构计算平台量身定制的高效内存管理机制,极大简化了 CPU 与设备间的数据共享、页表同步和一致性管理。它为 GPU、FPGA、AI 加速器等设备驱动提供了统一、标准化的 API,支持 SVM、page fault、内存迁移等高级功能,是现代高性能计算平台不可或缺的基础设施。

对于内核和驱动开发者,深入理解 HMM 的原理、实现和最佳实践,有助于开发更高效、可靠的异构计算应用,并为未来的系统优化和创新打下坚实基础。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/diannao/97557.shtml
繁体地址,请注明出处:http://hk.pswp.cn/diannao/97557.shtml
英文地址,请注明出处:http://en.pswp.cn/diannao/97557.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

鸿蒙创新赛活动——Mac提交压缩失败后续

Mac提交压缩失败后续来了… 传送带【上一篇】 背景 华为2025HarmonyOS创新赛 上传作品的时候&#xff0c;遇到了一个提示 ZIP包中的Office文件含有嵌入文件&#xff0c;就去这个Office文件找&#xff0c;怎么也找不到嵌入的文件。 解决方法1 上次推荐的解决方式是&#xff0…

Ubuntu操作系统下使用mysql、mongodb、redis

目录 一、核心步骤概览 二. MySQL &#xff08;下面以其他用户为例&#xff09; 1,、安装 2、管理服务 3、连接与使用 4、配置文件位置 5、下面来演示一下安装好之后如何在Linux操作系统中远程登录和window互连Linux 远程登录 window连Linux&#xff08;连不上的&…

springboot java开发的rocketmq 顺序消息保证

首先要明确一个关键点&#xff1a;RocketMQ 保证的是一种局部顺序&#xff08;Partially Ordered&#xff09;​&#xff0c;而非全局顺序&#xff08;Globally Ordered&#xff09;。这意味着消息的顺序性只在某个特定维度&#xff08;比如同一个订单ID&#xff09;下保证&…

【机器学习】 14 Kernels

本章目录 14 Kernels 479 14.1 Introduction 479 14.2 Kernel functions 479 14.2.1 RBF kernels 480 14.2.2 Kernels for comparing documents 480 14.2.3 Mercer (positive definite) kernels 481 14.2.4 Linear kernels 482 14.2.5 Matern kernels 482 14.2.6 String kerne…

Android开发-工程结构

一、项目视图模式在开始之前&#xff0c;确保你的 Project 面板使用的是 【Android】 视图&#xff08;默认&#xff09;。这是最常用的视图&#xff0c;它将相关文件按功能逻辑分组展示。&#x1f4a1; 你也可以切换到 【Project】 视图查看完整的文件系统结构。二、顶级项目结…

mysql的内置函数

文章目录mysql的内置函数时间函数1. 返回值的数据类型和格式2. 功能侧重点3. 函数别名情况我现在想给一个日期加上十天&#xff0c;然后输出加上十天之后的日期&#xff0c;我该怎么做&#xff1f;我现在想给一个日期减去两天&#xff0c;然后输出减去两天之后的日期&#xff0…

【动态规划】子序列问题

一、[最长递增子序列](https://leetcode.cn/problems/longest-increasing-subsequence/description/)二、[摆动序列](https://leetcode.cn/problems/wiggle-subsequence/description/)三、[最长递增子序列的个数](https://leetcode.cn/problems/number-of-longest-increasing-s…

P2P技术应用:去中心化

P2P技术应用&#xff1a;https://www.bilibili.com/video/BV1WH4y1Y7i9 P2P与下载器 P2P技术实现的下载协议&#xff1a; 1、种子文件 2、磁力 3、电骡 播放器&#xff1a; 快车、电骡、迅雷 BT&#xff08;种子&#xff09;下载的基本技术原理 网盘与P2P技术 网盘公司的主…

数据结构(C语言篇):(八)栈

目录 前言 一、概念与结构 二、栈的实现 2.1 头文件的准备 2.2 函数的实现 2.2.1 STInit( )函数&#xff08;初始化&#xff09; 2.2.2 STDestroy( )函数&#xff08;销毁&#xff09; 2.2.3 STPush( )函数&#xff08;入栈&#xff09; 2.2.4 STPop( )函数&#…

Elasticsearch数据迁移快照方案初探(一):多节点集群配置踩坑记

背景介绍 在生产环境中&#xff0c;我们经常需要将测试环境的Elasticsearch索引数据迁移到生产环境。这次我们遇到了一个典型的多节点集群快照配置问题&#xff1a;需要为所有节点添加path.repo配置&#xff0c;但过程中遇到了各种挑战。 问题描述 我们的Elasticsearch集群包含…

leedcode 算法刷题第二十天

39. 组合总和 class Solution { public:vector<vector<int>> result;vector<int> temp;void backtructing(vector<int>& candidates, int target, int sum,int start){if(sumtarget){result.push_back(temp);return;}if(sum>target){return;}f…

身份证实名认证API集成—身份核验接口-网络平台安全合规

在数字化浪潮席卷各行各业的今天&#xff0c;网络空间的安全问题日益受到关注。为防范网络诈骗、虚假注册、身份盗用等风险&#xff0c;国家陆续出台多项法律法规&#xff0c;如《网络安全法》《个人信息保护法》等&#xff0c;明确要求互联网服务提供者落实用户真实身份核验机…

谷歌TIGER爆火!生成式召回颠覆推荐系统:用语义ID破解冷启动+多样性难题,3大数据集性能碾压传统模型

注&#xff1a;此文章内容均节选自充电了么创始人&#xff0c;CEO兼CTO陈敬雷老师的新书《GPT多模态大模型与AI Agent智能体》&#xff08;跟我一起学人工智能&#xff09;【陈敬雷编著】【清华大学出版社】 清华《GPT多模态大模型与AI Agent智能体》书籍配套视频课程【陈敬雷…

分享一个实用的B站工具箱(支持音视频下载等功能)

文章目录 📖 介绍 📖 🏡 演示环境 🏡 📒 一款实用的B站工具箱 📒 💥 项目亮点 💥 🛠️ 下载与安装 🚀 使用指南 📢 注意事项 ⚓️ 相关链接 ⚓️ 📖 介绍 📖 很多小伙伴在B站追番或者学习时,总会遇到一个很头疼的问题:想把视频下载到本地,要么被限…

大话 IOT 技术(4) -- 答疑篇

文章目录前言手机能与设备直接通信吗多协议能统一用一个吗假设我们统一用http协议假设我们统一用mqtt协议bypass服务端和设备不能mqtt直接通信设备必有wifi 和蓝牙功能设备为什么不能自己连接网络配网模式是什么后话当你迷茫的时候&#xff0c;请点击 物联网目录大纲 快速查看前…

机器视觉学习-day14-绘制图像轮廓

1. 轮廓的概念轮廓是目标物体或者区域在图像外部的边界线&#xff0c;通常由一系列像素点相连组成&#xff0c;这些像素点共同构成了一个封闭的形状&#xff0c;这样形状就是轮廓。轮廓与边缘不同&#xff1a;轮廓是连续的&#xff0c;边缘可以连续也可以离散轮廓是完整的&…

Linux shell getopts 解析命令行参数

Linux shell getopts 解析命令行参数getopts语法 getopts 选项字符串 名称 [ 参数 ...]示例1&#xff08;有前置冒号&#xff09;: while getopts ":hdo:" optname; do ...... done示例1&#xff08;无前置冒号&#xff09; while getopts "hdo:" optname…

DeepInteraction++基于多模态交互的自动驾驶感知与规划框架

DeepInteraction++基于多模态交互的自动驾驶感知与规划框架 1 论文核心概念 DeepInteraction++ 提出了一种名为"模态交互"(modality interaction)的新策略,用于自动驾驶中的多模态(LiDAR 和相机)感知任务。其核心思想是不将多模态信息融合为单一表示,而是分别…

忆联参与制定消费级SSD团体标准正式出版! 以“高可靠”引领行业提质增效与用户体验升级

引言​在AIPC爆发、数据价值凸显的当下&#xff0c;存储设备已超越简单容器&#xff0c;成为智能体验基石&#xff0c;其性能与可靠性直接关乎用户效率与资产安全。然而&#xff0c;消费级SSD长期缺乏统一权威的可靠性标准&#xff0c;使厂商缺乏质量对标依据&#xff0c;用户亦…

微服务搭建(SpringBoot + Dubbo + Nacos)

1.项目接口2. 编辑pom.xml和application.yml文件2.1父工程pom.xml<?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:s…