玩转OurBMC第二十三期:OurBMC之PCIe接口应用(下)
【栏目介绍:“玩转OurBMC”是OurBMC社区开创的知识分享类栏目,主要聚焦于社区和BMC全栈技术相关基础知识的分享,全方位涵盖了从理论原理到实践操作的知识传递。OurBMC社区将通过“玩转OurBMC”栏目,帮助开发者们深入了解到社区文化、理念及特色,增进开发者对BMC全栈技术的理解。
欢迎各位关注“玩转OurBMC”栏目,共同探索OurBMC社区的精彩世界。同时,我们诚挚地邀请各位开发者向“玩转OurBMC”栏目投稿,共同学习进步,将栏目打造成为汇聚智慧、激发创意的知识园地。】
PCI-Express (peripheral component interconnect express)是一种高速串行计算机扩展总线标准,它采用高速串行点对点双通道的传输架构,使得每一个所连接的设备都能够被分配到独享的通道带宽,与传统共享总线带宽的方式截然不同,独享通道带宽有效避免了多个设备争抢带宽的情况,从而显著提升了数据传输的效率和稳定性。PCI-Express主要支持主动电源管理,错误报告,端对端的可靠性传输,热插拔以及服务质量(QOS)等重要功能,这些功能共同构建起了一个高效、稳定且灵活的计算机扩展总线系统。
PCIe接口应用:虚拟网卡
在PCIe(PCI Express)系统中,BDF(Bus, Device, Function)是用于唯一标识设备的关键资源标识方式,它构成了 PCIe 设备的 "地址" 系统,让操作系统和固件能够准确定位和管理总线上的每个功能单元。BDF 格式通常表示为BB:DD.F,分别为Bus(总线号,BB),用于区分系统中的不同 PCIe 总线。Device(设备号,DD),用于标识同一总线上的不同物理设备。Function(功能号,F),用于标识同一物理设备内的不同逻辑功能(对应多 func 设备)。
E2000 PCIe EP支持生成多个真实 function的能力,其控制器内包含3个逻辑功能单元。目前function0默认用作DC的图形显示功能,同样的其他function的BAR0都用于特定的硬件功能无法更改,但BAR1-5可以选择性的映射地址。如下图所示,E2000内核启动后按照内核EPC驱动提供的sys接口配置相关参数(如Vendor ID、Device ID等),Host上电启动后则会扫描一个05:00.1的PCIe EP。
此时用户需要在E2000端基于内核EPC框架开发EP驱动,在Host端开发RC驱动。Host内核在启动过程中,会根据PCI Device ID Table(VendorID、DeviceID)自动匹配并加载对应的RC驱动。Host与EP驱动之间通过BAR空间所映射的共享内存进行通信,即前述的共享内存通信机制。用虚拟网卡为例,加载驱动后Host与EP在系统中分别呈现出一个网络设备。两者应用层可通过Socket网络编程进行通信,在内核中网络数据包以sk_buff(skb)形式进行处理,那么共享内存中传输的数据为skb的网络数据包。
由于共享内存缓冲区大小在初始化时就已固定,若要在BAR空间里存储完整的SKB数据,就需要为其分配足够大的固定缓冲区,这会造成巨大的浪费(内存碎片化),大量碎片化网络数据包的通信场景将成为性能瓶颈。同时在共享内存PIO机制下,CPU的核心工作变成执行IN/OUT指令,即从端口读取数据到寄存器,再从寄存器写入内存(或反之),每个字节/字的移动都需要CPU亲自执行指令。CPU时间几乎全部被数据搬运占用,无法有效处理真正的网络协议栈(IP、TCP解包)或用户应用程序。为了解决这个问题,真实的网卡都会使用DMA引擎来搬运数据。
E2000 PCIe控制器实现了两个完全独立的 DMA 引擎模块,可以编程使用 DMA 直接传输或分散式DMA(SG-DMA)传输。每个 DMA 引擎,既支持从主存到 EP 设备搬运数据,也支持从 EP 设备到主存搬运数据;支持任意长度的数据传输(DMA 直接传输模式最大 4GB;SG DMA 模式每个描述符最大 16MB)。DMA控制器作为总线主控设备,可以主动发起对内存的读写操作,在不经过CPU寄存器的情况下,直接在外设(如网卡)和内存之间建立数据通道,这消除了不必要的中间步骤,效率更高。让CPU的角色从“搬运工”转变为“管理者”。它只负责初始化DMA传输(设置描述符)和处理传输完成后的中断,其余时间CPU可以去处理其他计算任务。
当引入DMA控制器后,BAR空间内不再需要CPU填充完整的skb数据,而只需写入待发送skb的内存物理地址和长度,理论上CPU占用率可以大幅下降。但是目前还没有“通知EP启动DMA引擎搬运”的方法,导致RC和EP驱动都需要轮询BAR空间来识别是否有新的SKB需要发送。所以还需要一种中断触发机制来解决这个问题,而在PCIe总线上一般使用MSI/MSI-X和Doorbell实现。
MSI(Message Signaled Interrupt)是一种EP主动触发RC产生中断的功能,系统软件在RC枚举PCIe总线时会扫描每个EP的PCIe空间,为支持MSI能力的EP设置Message Address Register,这个地址通常就是处理器中断控制器的地址。同时根据硬件平台当前可用的中断资源,分配相应数量的、连续的中断向量号给这个设备,并将起始向量号写入设备的 MessageData寄存器中。
当BMC需要触发Host MSI中断时,则会使用该地址发出上图所示Memory Write Transaction的TLP报文给Host,使其产生中断。随后Host内核基于报文的MSI中断向量号调用设备驱动注册的中断处理函数。从上述EP使RC产生中断的过程发现,MSI本质上是一种特殊的 Memory Write TLP报文。
Doorbell是一种在PCIe设备中广泛应用的软件编程模型或概念。它并非由PCIe基础规范直接定义一个叫做 “Doorbell” 的特定寄存器,而是被许多建立在PCIe之上的设备规范(如NVMe,SR-IOV虚拟化)所采用的一种通用机制。Doorbell通常是一个映射到主机内存空间(位于设备的BAR中)的寄存器。当Host想要通知设备开始处理任务时,它只需向这个Doorbell的地址执行写操作产生一个PCIe事务。E2000的PCIe控制器能够监控Bar1上的地址,支持将收到写请求转换为硬件中断,并可以读出Host写入的值从而执行特定业务,如从共享内存中读取DMA描述符并执行内存搬运动作,将SKB搬运到EP或RC。
虚拟网卡传输SKB参考通信流程如上图所示:
CPU应用层发送网络数据包,驱动构建SKB。
CPU获取SKB数据的物理地址和长度,并写入BAR空间DMA描述符。
CPU向EP发送Doorbell中断,通知“有新的包要发送”。
EP 进入中断处理函数,读取BAR空间描述符环,申请SKB长度的内存。
EP DMA控制器根据描述符中的地址,直接从主内存中的SKB数据区读取数据并写入申请的内存中。
EP DMA传输结束后,解析TCP报文发给EP的应用层。
本期内容着重为大家介绍了基于PCIE接口实现的应用场景--虚拟网卡,基于PCIe的虚拟网卡通过硬件加速、资源隔离和灵活扩展,成为云计算、HPC、边缘计算等场景的核心组件。除共享内存和虚拟网卡外,PCIe接口在存储加速(NVMe-oF over PCIe)、异构计算(GPU/FPGA直连)及安全计算(TEE可信执行环境)等多个领域也有广泛的应用,欢迎广大读者积极探索。
欢迎大家关注OurBMC社区,了解更多BMC技术干货。
OurBMC社区官方网站:

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
-
上一篇
可信数据流通开发者必看,深度解读隐语密态计算设备SPU(Secretflow Processing Unit)
打开链接点亮社区Star,照亮技术的前进之路。每一个点赞,都是社区技术大佬前进的动力 Github 地址: https://github.com/secretflow SPU 是_Secretflow Processing Unit_的简称,它作为隐语平台的密态计算单元,为隐语提供安全的计算服务。 1.SPU概念理解 密态计算单元这个概念听起来比较晦涩,我们用一个实际的例子介绍一下SPU的作用。 假设要用 JAX 写逻辑回归(SPU不依赖JAX,选择JAX因为简单),代码如下: import jax import jax.numpy as jnp def sigmoid(x): return 1 / (1 + jnp.exp(-x)) def loss(x, y, w): pred = sigmoid(jnp.dot(x, w)) label_prob = pred * y + (1 - pred) * (1 - y) return -jnp.sum(jnp.log(label_prob)) def logit_regression(x, y, epochs=3, step_size=...
-
下一篇
GPU 网络基础,Part 2(MoE 训练中的网络挑战;什么是前、后端网络;什么是东西向、南北向流量)
编者按: 在大规模人工智能模型训练日益依赖分布式 GPU 集群的今天,我们是否真正理解支撑这些系统高效运行的网络架构?数据如何从存储设备抵达 GPU?训练过程中不同并行策略又如何对网络提出截然不同的挑战? 我们今天为大家带来的文章,作者的核心观点是:现代 AI 训练系统必须通过严格区分前端与后端网络,并针对数据并行、流水线并行和专家并行等不同通信模式进行协同优化,才能有效应对日益复杂的网络拥塞与延迟问题。 文章首先厘清了"前端网络"与"后端网络"的功能边界,强调将关键训练流量隔离在高性能后端网络中的必要性;接着深入剖析了三种主流并行训练策略 ------ 数据并行带来的全局同步压力、流水线并行对拓扑感知调度的依赖,以及专家并行引发的非均匀突发流量;最后以 DeepSeek-V3 混合专家模型为例,展示了如何通过算法、通信内核与硬件协同设计,实现计算与通信的高效重叠,从而突破跨节点训练的瓶颈。 作者 | Austin Lyons 编译 | 岳扬 01 前端网络 vs 后端网络 上次我们探讨了大语言模型预训练中的 GPU 间通信,重点分析了与邻近 GPU 的高速高带宽连接(如通过 NVLi...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- 设置Eclipse缩进为4个空格,增强代码规范
- SpringBoot2整合Thymeleaf,官方推荐html解决方案
- CentOS6,CentOS7官方镜像安装Oracle11G
- Mario游戏-低调大师作品
- Eclipse初始化配置,告别卡顿、闪退、编译时间过长
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
- CentOS7编译安装Gcc9.2.0,解决mysql等软件编译问题
- Crontab安装和使用
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- SpringBoot2初体验,简单认识spring boot2并且搭建基础工程