当前位置: 首页 > news >正文

深度解析 RDMA 技术的里程碑:基于 DMA-BUF 的 P2P 直接访问(GPU Direct RDMA 新姿势)

前言

在高性能计算(HPC)和 AI 训练场景中,GPU 与网卡(NIC)之间的数据传输效率至关重要。传统的 RDMA 访问用户空间缓冲区通常依赖get_user_pages()来钉住(Pin)物理内存。但当数据驻留在 GPU 显存(VRAM)时,这种方式因缺乏标准page结构而失效。

2020 年,Intel 的 Jianxin Xiong 向 Linux 内核提交了一系列补丁(已合入主线),正式引入了RDMA DMA-BUF支持。这一特性彻底打通了 RDMA 驱动作为importer导入 GPU 显存的路径,实现了更优雅的 P2P 传输。


一、 为什么需要 DMA-BUF?(痛点分析)

在传统的 RDMA 操作中,内核需要通过page结构来管理内存,但设备内存(如 GPU VRAM)在 Linux 内存管理子系统(MM)中是个“异类”。

目前虽然有几种解决方案,但各有利弊:

  1. ZONE_DEVICE:虽然为设备内存引入了专用page结构,但在 PCI P2P 场景下,它要求由“执行 DMA 的一方”分配缓冲区,这与 GPU 驱动预先分配显存的习惯相悖。

  2. HMM(异构内存管理):支持共享虚拟地址空间,但它倾向于让数据在系统内存和显存间“漂移”(迁移),不支持长期钉住(Pin)内存,且不支持 P2P。

  3. DMA-BUF:作为 Linux 内核中跨驱动共享缓冲区的标准机制,它具有天然优势:无需page结构、API 简单灵活、且大多数 GPU 驱动(如 NVIDIA, AMD, Intel)已原生支持。


二、 核心原理:当 RDMA 遇到 ODP

这次合入的主线代码(Patch 1-4)核心逻辑是:让 RDMA 驱动扮演 DMA-BUF 的导入者(Importer)。

1. 解决“钉不住”的问题

有一个棘手的问题:现有的 GPU 驱动通常不允许通过 DMA-BUF 接口“钉住”显存。如果你强行 Pin,显存可能会被置换回系统内存。

解决方案:借力 ODP(On-Demand Paging)。

这组补丁并不强制要求 Pin 内存,而是利用支持ODP的网卡。当网卡访问显存时,如果发生缺页,通过 DMA-BUF 的动态挂载(Dynamic Attach)机制实时获取 DMA 地址。

2. 关键流程
  • 用户态:通过 GPU 驱动获取显存对应的fd(文件描述符)。

  • 内核态(RDMA 驱动)

    1. 调用dma_buf_get(fd)获取对象。

    2. 使用dma_buf_attach()动态挂载。

    3. 通过reg_user_mr_dmabuf注册内存区域(MR)。


三、 补丁系列详解(补丁 ID 概览)

该系列共包含 4 个核心补丁,分工明确:

  • Patch 1:通用代码引入

    添加了从fd导入 dma-buf 并映射页面的通用基础代码,为 RDMA 栈提供了处理 dma-buf 的工具函数。

  • Patch 2:新增驱动方法

    引入了reg_user_mr_dmabuf()接口。这是对现有reg_user_mr的扩展,专门处理基于 dma-buf 的内存注册。

  • Patch 3:用户态接口(Uverbs Command)

    增加了一个新的uverbs命令,允许用户空间应用直接把 GPU 的 dma-buf 句柄传给 RDMA 栈。

  • Patch 4:落地 mlx5 驱动

    在 NVIDIA/Mellanox 的mlx5驱动中正式实现上述接口。由于mlx5是 ODP 技术的代表,因此成为了首个受益者。


四、 性能与影响

通过这一机制,开发者可以实现真正的Zero-copy P2P

  • 降低 CPU 开销:不再需要在系统内存中中转数据。

  • 降低延迟:数据直接通过 PCIe 在 GPU 和 NIC 之间交换。

  • 灵活性:不再受限于特定的显存分配器,只要支持 dma-buf 即可。


五、 总结

DMA-BUF 与 RDMA 的结合是 Linux 内核在处理异构计算架构上的重要一步。它不仅简化了网卡访问 GPU 内存的逻辑,也为未来 CXL 等高速互联技术下的内存共享铺平了道路。

对于从事 RDMA 开发或高性能计算的朋友来说,关注ODPDMA-BUF的结合将是提升系统吞吐量的关键技巧。


参考链接:

  • Linux RDMA 补丁详情

  • 内核源码相关路径:drivers/infiniband/core/rw.c,drivers/infiniband/hw/mlx5/

http://www.jsqmd.com/news/509489/

相关文章:

  • ESP32 TWAI/CAN驱动深度解析与Arduino工程实践
  • SunnyUI控件库实战:用UIPipe控件5分钟打造一个流量监控界面
  • DCT-Net视频处理:实时卡通化视频流
  • 开源工具Synology HDD db:突破群晖NAS硬件兼容性限制实现存储自由选择指南
  • 春联生成模型-中文-base开发实战:IDEA中创建SpringCloud集成项目
  • Ext2Read:3步让你在Windows上轻松读取Linux分区文件
  • 本科毕业论文自救指南:用 Paperxie AI,3 天搞定初稿、排版、降重全流程,告别熬夜焦虑
  • Kali Linux 原生AI渗透测试工作流:Claude + MCP 让自然语言驱动黑客工具
  • Stable-Diffusion-3.5-FP8入门指南:3步完成环境配置,轻松生成高清图片
  • 基于Matlab 2021a的两级式单相光伏并网仿真及优化设计(附仿真说明文件)
  • 卷积神经网络参数详解:kernel size、stride、padding如何影响你的模型效果?
  • 优选算法_模拟_提莫攻击_C++
  • CosyVoice3问题解决手册:音频生成失败、发音不准怎么办?
  • JPEGView:让专业图像浏览与处理触手可及
  • 2026年供应链公司权威推荐:财务管理/财务软件用友/供应链管理/用友云财务系统/财务供应链一体化/供应链/选择指南 - 优质品牌商家
  • NEURAL MASK开源镜像安全审计:本地沙箱执行+零外网依赖+内存加密
  • Qwen3.5-9B一文详解:9B参数开源镜像+Gradio界面完整部署流程
  • LlamaParse:3步搞定PDF智能解析的终极指南
  • FireRedASR Pro快速上手:支持GPU加速,识别速度大幅提升
  • 电子科技大学计算机复试面试:如何用一份‘挖坑式’简历引导老师提问?
  • 从零开始:在Windows系统上部署gte-base-zh模型服务
  • Nanbeige 4.1-3B惊艳效果展示:阳光草原配色+逐字蹦出神谕+系统日志可视化
  • Botty暗黑破坏神2全自动刷宝脚本:3步告别手动Farming的智能助手
  • 从格式地狱到一键通关:Paperxie 4000 + 高校模板库,让本科毕业论文排版效率拉满
  • 【持续更新】cps5301文档翻译
  • 基于java的事业单位教师招聘考试可视化系统
  • Qwen3-32B-Chat保姆级教程:从裸机Ubuntu系统到Qwen3-32B服务上线全过程
  • 从FP16到FP8:Stable Diffusion 3.5量化升级指南,显著降低硬件门槛
  • Nanbeige 4.1-3B多场景落地:社区运营、粉丝互动、内容共创新范式
  • 基于java的个人理财备忘录记账提醒系统vue