LWN: 非GPU的加速器驱动绕过了合入原则!

深度解析 RDMA 技术的里程碑:基于 DMA-BUF 的 P2P 直接访问(GPU Direct RDMA 新姿势) 摘要:Linux内核引入RDMA DMA-BUF支持,实现GPU显存与网卡间的直接数据传输。传统方法因GPU显存缺乏标准page结构而失效,新方案利用DMA-BUF机制,让RDMA驱动作为导入者,通过ODP技术动态获取DMA地址,避免强制钉住内存。该特性包含4个核心补丁,在mlx5驱动中实现,显著降低CPU开销和延迟,支持真正的零拷贝P2P传输,为异构计算架构和未来高速互联技术奠定基础。 阅读详情

关注了就能看到更多这么棒的文章哦~

Not-a-GPU accelerator drivers cross the line

By Jonathan Corbet
August 26, 2021
DeepL assisted translation
https://lwn.net/Articles/867168/

一般来说,内核社区通常乐意合并那些可以正常工作的设备驱动程序,不太关心相关的用户空间代码是否真正可用。发生在用户空间的事情不在 kernel 的关注范围之内,也不受内核 license 的影响。不过有一个例外,那就是图形处理器(GPU)的驱动程序,如果没有可以正常工作的、采用了 freely-licensed 许可的用户空间软件的情况下,这些驱动就不能被合入 kernel。近年来,关于哪些驱动程序需要满足这个规则的问题已经被提出过好几次。这个讨论现在已经到了做最终决定是否要阻止 Habana 实验室的一些驱动程序的软件更新进入 5.15 内核。

上述 GPU-driver 的规则是由 DRM (direct-rendering)维护者 Dave Airlie 在 2010 年划定的界限。大多数 GPU 驱动的内核侧软件只是用户空间和设备之间的一个简单通道,实现了类似于网络连接的功能。这些驱动程序的真正复杂逻辑都放在了用户空间的软件组件中,而它会利用内核提供的通道来通过专有协议(通常是这样)从而控制 GPU。DRM 的维护者长期以来一直认为,如果用户空间没有一套已经实现好的软件,那么他们就无法判断、维护或测试驱动程序的内核部分代码。这个原则,他们已经坚持了十多年,并且认为这是该子系统在这段时间内取得的进展的一个重要原因。

就其本质而言,GPU 是一个经过优化的加速器,能够比最快的 CPU 还要更快地进行某些类型的处理工作。graphics 是这些加速器广泛得到使用的第一个场景,但肯定不是最后一个。最近,针对机器学习任务的加速器领域正在快速发展。其中的一个加速器,Habana Gaudi,已经得到了 Linux 内核的支持。

Gaudi 驱动的合入,引起了一些讨论,是关于如何处理这些 non-GPU 加速器的。这个驱动没有经过 DRM 代码仓库合入,也就没有遵守 DRM 子系统的上述原则,因此它进入了 mainline kernel 但实际上并没有相应的 user-space 部分。这一点后来得到了纠正(基本上纠正了,后文详述),但是 DRM 的开发者对这个过程感到并不满意,他们认为这个合入过程绕过了他们花了多年时间捍卫的原则。就在一年多以前,其他几个加速器驱动程序的到来就曾经引发了一场关于这些驱动程序是否应该被当作 GPU 对待的讨论,当时并没有明确的结论。

在过去的几个月里,Habana 驱动成为了一些类似讨论的引爆点,在 6 月底和 7 月初的时候讨论很激烈。现在的问题是该驱动的一个扩展功能需要使用到内核的 DMA-BUFF 和 P2PDMA 功能,用来在设备之间移动数据。这些子系统本来是为了能配合 GPU 驱动而开发的,并且因此被一些 DRM 开发者视为内核的 GPU API 的一部分。从这个因素来说,使用这些子系统的驱动就应该受到 GPU 子系统 merge 规则的约束。或者,就像 Airlie 在他反对合并 Gaudi 的改动时的说法:

我不支持在上游内核中为该驱动添加 dma-buf 或 p2p 功能。我们需要划个界限来界定某个驱动是不是 "一个 DRM 驱动 ",从而避免这类 driver 绕过我们对用户空间的要求,而我认为这(支持 dma-buf 或 p2p)就是我们该使用的界限。

这个驱动被合入 misc,理由就是它并不是一个真正的 drm/gpu 驱动,所以不必接受我们的用户空间相关的规则。

而将 dma-buf/p2p 功能添加到这个驱动中的话,就表明它确实符合 gpu driver model,并且应该遵循 drivers/gpu 相关规则,这就是大多数加速器和 GPU 的一个区别。

正如 DRM 开发者 Daniel Vetter 所承认的,这里其实有个误会,确实是有一个 free 的用户空间的 Gaudi driver 的。目前还缺少的是用来生成那些实际驱动该设备工作的指令流的编译器。Vetter 说,如果没有编译器,那么虽然当前代码是存在的,但是 "我们仍然无法对 driver stack 进行调试"。他进一步阐述道:

如果没有编译器,我可以按照我的设计来正常使用这个硬件吗?

如果答案是否定的,那么从本质上讲,你用你的上游驱动所做的唯一一件事就是用来获得了 upstream 驱动的所有好处,而 upstream 却没有得到任何好处。我们无法直接使用你的这一套 driver。当然我们可以使用 queue 队列,但事实上我们不能提交任何有实际价值的任务。

在讨论的过程中,DRM 的开发者们一直在明确说明,他们想要一个有效的、free 的用户空间的实现。它不一定是交付给客户的代码,只要它足以让人理解驱动程序的整体工作原理即可。不过,对某些人来说,索取编译器的要求有点过分了。Habana 的开发者 Oded Gabbay 曾这样描述 DRM 子系统的要求:

我真的认为 dri-devel 的合并标准是过于极端了,并且事实上赶走了许多想为内核做贡献但不能或不愿开放其 software IP 和 patent 的 AI 加速器公司。

我认为期望人工智能初创公司(它们在深度学习领域的占了 90%)能跟公司边界之外的人进行合作,这是不现实的,尤其是用户空间这一部分,这是公司真正的知识产权所存在的地方。

当然,Linux 内核开发过程的核心就是要求能跟公司之外进行合作。DRM 子系统并不是唯一提出这种要求的。Vetter 回应中专门之处,kernel 社区也不会接受那些没有能正常工作的 free compiler 的新 CPU 架构。

多年来,经常出现厂商在希望他们的硬件能与 Linux 一起工作的同时、还希望将他们的 "知识产权" 保留给自己的事例。这类困难已经被克服了很多次,因此我们所使用的 kernel 中获得了对硬件更加广泛和完善的支持。要克服这类困难至少需要做两件事:客户要求获取 free driver,并且开发社区对专有驱动程序的强烈反对。需求方必须自行开发(而且经常是这样做的),但内核社区一直在努力工作,从而能对于驱动代码维持一个一致的立场,并对外保持沟通。2008 年发表的声明(https://lwn.net/Articles/287056/ )就是一个例子。因此,社区内有一个共识,涵盖了与专有驱动程序相关的许多领域。例如,人们很难看到赞同 export symbol 来让这些驱动程序受益的观点。

这一系列正在进行的讨论表明,当涉及到加速器设备的驱动程序的要求时,内核社区目前还没有达成共识。这就造成了这样一种情况:如果通过 DRM 子系统进行合并会被一些规则所拒绝的代码,可以通过另一条路径来进入内核,从而绕过了这些规则。当然,这样以来这些规则就形同虚设了。对这个前景的担忧不仅仅存在于 DRM 社区,media 子系统开发者 Laurent Pinchart 也写道:

我怎么强调都不为过,我们花了多大的力气才开始让 vendor 厂商们加入进来,而且目前的情况实际上还是很脆弱的。如果我们现在发出一个信息,所有这些驱动都可以经过 drivers/misc/ 来绕过所有规则直接合入,那么这将会使得十年来的工作都完全浪费了。

要避免这种结果,就需要让内核开发者和(尤其是)子系统维护者能达成某种协议。这通常是一项具有挑战性的任务。

在 Gaudi 驱动的案例中,Greg Kroah-Hartman 回答说他已经把有争议的代码拉到了他的代码仓库里了。因为后来的反对意见,他放弃了这项工作,并承诺今后有空的时候他会再 “多说一些”。暂时放弃这个 patch 有助于平息事态,但它并没有解决根本的分歧。总有一天内核社区必须要针对加速器驱动的规则达成某种结论。如果不这样做的话,我们可能会看到更多的的 non-GPU 驱动进入内核,以及看到随之而来的许多纷争。

全文完
LWN 文章遵循 CC BY-SA 4.0 许可协议。

欢迎分享、转载及基于现有协议再创作~

长按下面二维码关注,关注 LWN 深度文章以及开源社区的各种新近言论~

深度学习Tensorflow的坑(一:无法使用GPU加速训练深度学习模型,CUDA与CUDNN相关) 项目场景: 本研究僧为了秋招卷大厂放弃了半年的深度学习,重回Python的一些坑记录 问题与解决: 1:版本问题 想用GPU加速深度学习的训练一定不能同时下载tensorflow和tensorflow-gpu。 如果遇到了什么tensorflow找不到的bug,请直接删除所有带有tensorflow的包,然后找到对应版本的下载 对应版本是指CUDNN和CUDA以及你自身显卡实力对应的tensorflow-gpu版本。 2.CUDA和CUDNN下载(2、3一起看食用体验更佳!) CUDA下载比较简单 CU 阅读详情

相关推荐

驱动 | Linux | NVMe - 1. 内核驱动

本文总结NVMe的Linux驱动是如何实现的。

MissMango0820的博客 5733

linux内存管理机制--学习整理汇总 dma-buf(3)

linux 内存管理和使用 dma_buf

求变,从思想开始 5840

第九章 GPU 虚拟地址空间管理:9.2 GPU 内存管理与 CPU MM 的对照

本章对比 CPU 内存管理与 DRM GPU 虚拟地址空间(drm_gpuvm)在地址空间、后备存储、回收及失效恢复四方面的异同。二者均需在有限物理内存下管理多上下文虚拟地址,但 GPU 因硬件约束(如不可缺页、异步迁移)而演化出不同机制:用户态指定地址、提交前集中放置、基于 fence 的异步驱逐与恢复。核心差异源于 GPU 不支持缺页恢复,驱动需通过“提交式”、“长时运行”或“缺页”三种模式实现映射管理,体现 GPU 内存模型对硬件特性的依赖。

图形/计算GPU的驱动与虚拟化技术分享园地 709

P2P DMA发展全景分析解读

P2P DMA的概念早在NVMe SSD和RDMA技术发展的初期就已出现。随着时间的推移,随着硬件技术的进步以及软件栈的支持,如Linux内核从6.2版本开始提供用户空间对P2PDMA的支持,该功能逐渐成熟并应用在更多领域,例如NVIDIA GPUDirect Storage利用P2PDMA实现了GPU与NVMe命名空间之间的直接数据复制。综上所述,尽管P2P DMA技术面临一定的挑战,但其带来的性能提升潜力使其在未来有广阔的应用前景,尤其是在高性能计算、云计算和新一代存储解决方案等领域。

存储随笔 2007

【信息科学与工程学】【产品体系】第三十三篇 DPU/smartinic芯片中的学科知识03

需求实现DMA 与流边界检测优化​分级超时状态机(短/中/长)+ 积压计数 + 批量触发DMA 控制器优化​描述符预取(深度 4)+ 中断合并(阈值 8)Fence 语义正确性验证​RTL 断言 + C 语言序列号检测 + 性能对比 + 硬件计数器所有代码均为可综合 Verilog,已在仿真器中通过基本功能测试。在 FPGA 原型上运行上述 RTL,配合 ChipScope 观察 fence 时序在 BlueField-3 上运行 DOCA DPA 测试程序,对比加/不加 fence 的结果。

weixin_49199313的博客 273

Netapp FAS2750更换磁盘后不同步问题处理

netapp fas2750磁盘更换后不同步问题处理

jetliu05的博客 1256

P2P DMA并不是所有场景都会有性能提升

在这种流式工作负载场景下,使用p2p似乎是一个可行的选择。例如,当两个高速设备(如GPU与NVMe SSD)需要频繁进行大量数据交换时,通过P2P DMA,数据可以直接在设备间传输,无需经过CPU中转,这样可以减少数据在系统内存中的多次复制以及CPU上下文切换带来的开销,从而提高整体的数据传输效率和系统的吞吐量。对于复杂工作负载,当文件内容被缓存在页缓存中时(这在多个合作应用程序构成的复杂软件系统中经常发生),p2p仅在访问持久存储中的文件时效率较高,但其性能明显低于CPU中转I/O。

存储随笔 1937

Qt实战:用QTreeView+QStandardItemModel实现多级多列文件浏览器(附完整代码)

本文深入探讨了使用Qt的QTreeView与QStandardItemModel构建多级多列文件浏览器的完整实践。通过分析模型/视图框架的优势,详细演示了从基础框架搭建、模拟数据填充,到对接真实文件系统实现懒加载的全过程。文章还涵盖了自定义委托、多列排序、右键菜单等高级定制技巧,并提供了性能优化建议和完整的代码示例,帮助开发者打造功能强大且高效的工业级文件管理界面。

weixin_29021291的博客 423

【PCIe】P2P DMA

PCIe P2P (peer-to-peer communication)是PCIe的一种特性,它使两个PCIe设备之间可以直接传输数据,而不需要使用主机RAM作为临时存储。如下图3的走向比如EP1要发送和数据给EP2,操作流程如下:1. 打开EP1的dma控制器;--client侧2.src=EP1的内存地址,dst=EP2的BAR地址空间(provider),EP2的BAR地址一般会与自己的某段内存空间有一个映射关系,也就是将EP2的bar暴漏给了EP1去操作。

珂珂可爱多 2950

simulink中MIL测试简单理解

输入信号设置如下:选中New Test Case1 ---INPUT。5、新建(选择New,Test from Spreadsheet)6、可以新建也可以导入(Use existing test)Source:Output为自己预测结果。3、右键子系统(Create)打开生成表格,可以自己调试。4、创建测试用例表格。保存路径为模型路径。保存路径在模型路径。8、运行测试设h置。

lingdianhuat的博客 1783

异步bus交互(一)— 两级DFF同步器

异步bus交互(一)— 两级DFF同步器 跨时钟域处理 & 亚稳态处理 1.问题产生 现在的芯片(比如SOC,片上系统)集成度和复杂度越来越高,通常一颗芯片上会有许多不同的信号工作在不同的时钟频率下。比如SOC芯片中的CPU通常会工作在一个频率上,总线信号(比如DRAM BUS)会工作在另一个时钟频率下,而普通的信号又会工作在另外的时钟频率下。这3个不同时钟频率下工作的信号往往需要相互沟通和传递信号。 不同时钟域下的信号传递就涉及到跨时钟域信号处理,因为相互之间的频率、相位不一样,如果不做处理或者

qq_44816673的博客 5118

非GPU版的人脸检测器总结(Non-GPU Face Detection)

1. opencv自带的级联人脸检测器 #include<opencv2/opencv.hpp> #include<opencv2/imgproc/imgproc.hpp> #include<opencv2/highgui/highgui.hpp> #include<opencv2/objdetect/objdetect.hpp> using namespace std; using namespace cv; int main() { //Video

xiakj的专栏 368

杰理外挂flash使用教程(三): 打包提示音到外部flash(2)

本教程详细介绍了提示音制作与程序配置的全流程规范。提示音制作要求包括:英文命名(8字符内)、单声道转换、标准目录结构(cpu/br23/tools/)及使用user_tone_g.bat脚本生成res.bin资源文件。程序配置需修改:1)启用NOR_FS文件系统;2)调整存储空间;3)配置外置Flash参数;4)增强下载脚本追加资源参数。测试阶段建议替换开机提示音验证功能,扩展开发可参考tone_player.c的索引播放逻辑。所有操作均配有图示说明,关键配置需修改对应头文件和脚本参数。

qq_42014563的博客 586

PCIe P2P DMA全景解读

例如,由于主机CPU访问CMB的效率低于DDR内存,且CMB的大小有限,因此对于需要频繁、大量数据交换的应用场景,CMB可能无法提供最佳的性能。Host与存储设备数据移动优化的技术中,控制器内存缓冲区(Controller Memory Buffer,CMB)是一个重要的概念。当CPU需要访问存储设备的数据时,它可以通过内存读写事务层封装(MRd或MRw)直接访问CMB,而不需要将整个数据块传输到主机内存。随着时间的推移,随着硬件技术的进步以及软件栈的支持,如。P2P DMA技术挑战。

存储随笔 6752

小论文/大论文必备 | RT-DETR目标检测、数据集增强 | 引入多种数据集增强方法,支持图像和标签同步扩充增强,助力小论文和大论文实验涨点策略,平均提升模型mAP约1-2个百分点

RT-DETR目标检测数据增强策略研究 ,本文针对RT-DETR目标检测模型提出9种数据增强方法,包括几何变换(水平/垂直翻转、中心裁剪)、光照调整(亮度、对比度)和噪声添加(高斯/椒盐噪声)等。所有增强操作均保持图像与标签同步变换,确保训练数据的准确性。实验表明,该策略可提升模型mAP 1-2个百分点,对小目标检测效果尤为显著。文中提供了完整的Python实现代码,支持批量处理图像和标签文件,并详细说明了各增强方法的功能特点。该方法通过提升数据多样性,有效增强了模型在复杂场景下的鲁棒性和泛化能力。

Ai缝合怪、助力小伙伴高效发论文 460

Python爬虫教程:微博热点话题抓取与社交媒体分析

微博是中国最大的社交媒体平台之一,拥有海量的用户和丰富的讨论话题。通过爬取微博的热门话题和讨论内容,我们可以深入分析用户的兴趣、舆论走势、社会情绪等。通过爬取微博的热点话题和讨论内容,我们可以获得关于当前热门话题的宝贵数据,并基于这些数据进行多种社交媒体分析。本文将通过Python爬虫技术,详细介绍如何抓取微博上的热门话题、话题讨论内容,并进行社交媒体分析。希望本文为你提供了一个全面的微博数据抓取与分析的指南,帮助你在社交媒体数据分析的道路上迈出坚实的第一步。微博上的一些页面内容是静态的,可以直接通过。

2201_76125261的博客 589

GPU与SSD间的P2P DMA访问机制

例如,在将数据从SSD复制到GPU的过程中,CPU会先要求SSD将数据传入其本地缓冲区,再命令GPU将这些数据复制到自身的GPU内存缓冲区。映射GPU内存到进程地址空间:GPU通过在其PCIe总线上的设备BAR上暴露部分GPU内存,使其可供CPU访问。在该系统中, PCIe BAR(Base Address Register): PCIe设备通过BAR将其控制寄存器和/或内部内存块暴露在总线上,以便由其他PCIe设备访问。为了实现p2p DMA,GPU会在BAR上暴露一部分本地内存段。

存储随笔 3516

【脑电信号】脑电信号EEG形态学滤波处理【含Matlab源码 4023期】

脑电信号EEG形态学滤波处理 完整的代码,包运行;运行操作视频见优快云资源!适合小白!

订阅付费专栏Matlab(奶茶价版),可赠送奶茶价版付费专栏指定代码1份; 823

浅析CXL P2P DMA加速数据传输拥堵问题的解决方案

当从属的CXL内存设备(如SSD或其他带有CXL.mem接口的存储设备)需要更新自身的内存缓存副本时,它可以发起Back Invalidate Snoop 请求,直接向Home Agent或者其他持有最新数据的设备请求更新一致性状态。这是为了确保在进行U-IO DMA操作时,能够正确地同步内存一致性状态,即当数据发生更改时,相关的缓存条目可以在整个系统中得到及时无效化(invalidate),从而维护全局内存一致性。在CXL架构下,为了保持内存一致性,特别是对于共享CXL内存资源的情况,

存储随笔 3382

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

YOLO-LITE

  论文:YOLO-LITE: A Real-Time Object Detection Algorithm Optimized for Non-GPU Computers  Github:https://github.com/reu2018DL/YOLO-LITE     论文致力于设计一个网络(cpu速度大于10FPS,PASCAL VOC精度大于30%),因此基于YOLO-v2,提...

年轻即出发, 5927

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

Intel开源深度学习库BigDL:Non GPU on Spark

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_34384681的博客 319

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

PCIe P2P传输软件设计

| DDR(eg. 2GB) | | DDR(eg. 8GB) | | | |||||||||||||||||||| |||||||||||||||||||| | Z7 | | V7 | | CPU | PCIe | DMA |-|SATA Disk| | DMA

黑客三遍猪 3107

LWN:对加速器驱动的硬性要求!

关注了就能看到更多这么棒的文章哦~Requirements for accelerator driversBy Jonathan CorbetSeptember 27, 2021Maint...

Linux News搬运工 316

P2P原理的解释与实现

关于采用UDP协议进行打洞以进行P2P会话的原理,我本来想写一篇文章作说明,但是现在已经有一篇文章把原理性的东西解释清楚了,我在这里不再作这部分的重复,可以参见这里: P2P 之 UDP穿透NAT的原理与实现(附源代码)--http://www.cnpaf.net/Class/hack/0512182034513804825.htm 下面解释一下上面的文章中没有提及或者说我觉得比较欠缺的地

bugouyonggan的专栏 2万+

Linux内核DMA机制

DMA控制器硬件结构 DMA允许外围设备和主内存之间直接传输 I/O 数据, DMA 依赖于系统。每一种体系结构DMA传输不同,编程接口也不同。 数据传输可以以两种方式触发:一种软件请求数据,另一种由硬件异步传输。 在第一种情况下,调用的步骤可以概括如下(以read为例): (1)在进程调用 read 时,驱动程序的方法分配一个 DMA 缓冲区,随后指示硬件传送它的数据。进程进入睡

jeffade的专栏 2万+

LWN:netgpu的故事,说明了proprietary kernel module会带来什么损害!

关注了就能看到更多这么棒的文章哦~Netgpu and the hazards of proprietary kernel modulesBy Jonathan CorbetJuly 3...

Linux News搬运工 710
上一篇: LWN:让Python的各种软件安装方式不再冲突!
下一篇: LWN: Emacs讨论使用基于web的工作流程!
LinuxNews搬运工
博客等级 码龄7年 438粉丝 20原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值