1.它能卸载网络包处理、存储虚拟化、安全、虚拟机/容器管理等任务,降低数据中心税
2.它与 CPU(通用计算)、GPU(图形/并行计算)并列,是专注于基础设施数据处理的异构计算成员。
3.它具备可编程性,通过软件,用户可以灵活定义DPU 执行的具体任务和策略,使其适应不同的应用场景。
4. DPU 通常需要与主机CPU紧密协同才能发挥最大效能
因此,对应来说,DPU编程核心在于利用编程语言和框架释放硬件加速的巨大潜力,并通过高效的通信(gRPC, RDMA, DPDK)和主机并行技术(OpenMP, MPI)构建强大的异构协同系统。
下面,我们就开始看一下DPU相关的编程语言和框架吧!
一、编程语言
1.C/C++
C/C++语言能提供高效的直接内存访问、对硬件控制力强。
因此被用于编写 DPU 固件(Firmware)、操作系统驱动、运行时环境、以及直接操作硬件寄存器的性能关键代码。
同时也是也是主机端调用 DPU 服务(通过 SDK/API/gRPC)和实现高性能通信的主要语言。
2.P4
和C/C++、Python、Java这些大家耳熟能详的主流的编程语言相比,对不少人来说,P4编程语言听起来还比较陌生。
P4(Programming Protocol-Independent Packet Processors)编程语言是一种用于网络设备数据平面的编程语言。
它于2013 年由 Nick McKeown 教授带领的斯坦福大学研究团队提出,当时被称为 “Protocol independent switch architecture” 或 “PISA”。
2015年12月P4发布了1.0版本,2016年有了基于P4的交换芯片。
P4语言是一种声明式语言,专门设计用于描述网络设备(如交换机、路由器、智能网卡、DPU)如何解析、处理、修改和转发数据包。它有三个特点:
(1)协议无关性:P4 不与特定网络协议绑定,用户可根据现网协议支持情况和 P4 语法要素来自定义转发逻辑,按需加入或删去协议,从而实现对各种网络协议如 VXLAN、MPLS 等的灵活支持。
(2)平台无关性:用户无需关注底层平台细节,可独立于底层硬件对报文处理功能编程。前端编译器将 P4 高级语言程序转换成中间表示 IR,后端编译器再将 IR 编译成目标设备配置,这样用户编写的 P4 程序可在不同硬件平台上实现,提高了代码的可移植性。
(3)可重构性:在不更换硬件的情况下,P4 支持动态修改数据包处理方式,同一台设备可根据现网需求随时重新配置,增强了网络设备的灵活性和适应性,允许 “朝令夕改”。
P4语言高度抽象网络处理逻辑,使开发者专注于“做什么”而非“怎么做”。
而编译器能针对特定 DPU 硬件(如可编程数据流水线)生成高度优化的代码。
P4被应用在DPU 上实现高性能虚拟交换机(vSwitch)、负载均衡器、防火墙、网络监控、自定义协议处理等。主机应用可通过 API 或 gRPC 服务配置 P4 流水线规则。
3.硬件描述语言HDL
DPU 发展初期,基于 FPGA+CPU 架构的方案开发时间短、迭代快,便于 DPU 厂商迅速推出产品,抢占市场。
FPGA 的并行处理和流水线操作能力使 DPU 能同时处理多个任务,提高系统吞吐量和响应速度,降低延迟,在网络、存储等对延迟敏感的场景表现出色。
基于FPGA 的 DPU 可以实现网络、存储和安全功能的卸载与加速,提高数据中心的性能和效率。
如Xilinx 的 Alveo 系列 DPU,为数据中心提供了高性能的硬件加速解决方案。
FPGA 的可编程硬件特性使 DPU 能针对特定任务构建专用硬件加速器,如图像处理、加密解密等,大幅提升 DPU 数据处理速度和效率。
FPGA的编程方式和CPU不同,需要用到各种硬件描述语言HDL,如Verilog、VHDL等。尽管一些系统比如Alveo Vitis HLS提供了抽象,试图降低它的编程难度,但一般来讲,FPGA的编程较CPU更难。
4.Python
Python主要用于 DPU 的控制平面、管理平面、自动化脚本和高级应用开发,不直接用于编写数据平面的高性能处理代码。
Pythobn易用性强,所以常被用来快速开发调用 DPU 服务的客户端(利用 gRPC 或其他 SDK 的 Python 绑定)和编排脚本。
比如:配置 DPU 上的网络策略、安全规则、存储参数;监控 DPU 状态和性能指标;实现生命周期管理等。
5.特定领域语言 (DSLs) 与配置语言
一些 DPU 平台会提供更高级的、针对特定功能(如存储虚拟化、安全策略)的 DSL 或 YAML/JSON 配置模板。这些配置最终可能通过 gRPC 或专有 API 下发到 DPU。
这样能进一步简化特定任务的配置,提升易用性。开发者通过声明式配置表达意图,由底层框架转化为 DPU 可执行的指令。
比如:AMD Pensando Policy Language、NVIDIA DOCA Flow、Intel IPU 存储配置 (基于 SPDK/DPDK)、AMD Pensando Service Chains等。
二、关键开发框架
为了降低 DPU 编程的复杂度,提高开发效率并充分利用硬件特性,主要 DPU 厂商都提供了强大的软件开发套件(SDK)和框架。
下面介绍三家代表性的DPU厂商的开发框架:
1.NVIDIA DOCA (Data Center Infrastructure-on-a-Chip Architecture):
DOCA的目标平台是NVIDIA BlueField 系列 DPU,提供一套类似于 CUDA 的、统一的开发框架和 API,抽象底层硬件复杂性。DOCA生态系统最成熟、功能最全面、文档也十分丰富。
DOCA由如下部件组成:
(1)运行时环境: 在 DPU 上运行的服务和库。
(2)驱动: 主机与 DPU 通信(支持 RDMA、PCIe)。
(3)开发库 (DOCA Libraries): 提供高层次 API,用于开发网络(流处理、正则表达式)、存储(RDMA, GPUDirect Storage)、安全(加解密、TLS)、基础设施管理(vGPU, 热迁移)等应用。部分库提供 gRPC 接口供主机调用。
(4)服务: 如 DOCA Firefly(基于 P4 的高性能防火墙框架)。
(5)工具: 编译器、模拟器、调试器、管理工具。
DOCA 主要提供 C API,并有 Python 绑定。底层高性能部分结合 C、P4 和优化的库。DOCA Flow库提供高级抽象创建网络处理流水线。
DOCA利用 RDMA 实现极致低延迟高带宽的主机和DPU的通信,也支持 gRPC 用于控制管理面。
主机端并行应用(OpenMP/MPI)可通过 DOCA API 高效访问 DPU 加速服务。
2.AMD PENSANDO SOFTWARE-IN-SILICON DEVELOPMENT KIT (SSDK) :
AMD SSDK的目标平台是AMD Pensando DPU,功能简图如下:
SSDK支持 P416 语言(P4语言的2016版本)用于可编程数据流水线,允许用户编写在网络层和传输层进行数据包处理的代码,以实现如网络地址转换(NAT)、防火墙等功能。
同时,支持 C 和 C++ 语言用于编程 DPU 的 CPU 核心复杂体,实现更复杂的控制逻辑和任务调度。
SSDK 包含 DPDK 驱动,借助 DPDK 的高性能数据包处理能力,为 DPU 的网络数据处理提供支持,使 SSDK 能更高效地实现网络相关功能。
SSDK开发工具链包括:
(1)P416 编译器,用于将 P416 代码编译为可在 DPU 上运行的二进制文件。
(2)调试工具:帮助开发人员在开发过程中快速定位和解决问题。
(3)硬件仿真模拟器:配备的模拟器具有机器寄存器精度,使开发人员能够在没有实际硬件的情况下进行开发和测试,确保代码能够在真实硬件上无缝运行,从而加快开发速度,简化调试过程,并支持 CI/CD 基于的开发和工作流程。
SSDK的示例代码与文档相对齐全。它提供示例代码,涵盖网络、存储和安全等多个领域,如网络访问控制列表(NACL)、软件定义网络(SDN)策略卸载、最长前缀匹配(LPM)、访问控制列表(ACL)等,还提供文档,帮助开发人员快速上手。
3.中科驭数HADOS:
中科驭数的DPU开发框架HADOS(Heterogeneous Architecture Development Platform)是一个专用计算敏捷异构软件开发平台。
HADOS包括设备驱动层(DDL)、应用驱动层(ADL)和应用开发平台层(ADP)。
(1)设备驱动层(DDL) :集成DPU开发全套驱动模块与丰富API接口,涵盖超低延迟LDMA、RDMA、虚拟化、存储加密等功能模块,支持NP网络可编程,适用于追求极致性能与定制化的用户。
(2)应用驱动层(ADL) :聚焦“三U一体”高性能算力中心,通过优化的DPDK、SPDK、OVS、OVN等技术组件,为网络、计算、存储提供全面加速服务,助力用户轻松构建高性能算力底座,实现开箱即用。
(3)应用开发平台层(ADP) :配备编译、仿真、调试、部署全栈工具包,其中HADEP(业界首款DPU Emulator)可实现中科驭数DPU全功能仿真,支持云化部署及与真实DPU混合部署,大幅缩短开发周期,提升研发效率。
HADOS集成了从编译到部署的全套P4开发工具,如P4编译器、汇编器、BM-NPU模拟器等,并围绕NPU指令集构建调试器、链接器、加载器等工具以及自动化测试验证平台,简化开发流程。
HADOS通过优化的DPDK、SPDK等技术组件,实现了对网络、存储的全面加速服务,提高了数据包处理的性能和存储访问的效率。
三、开源框架和编程模型
DPU不能脱离现有的软件行业的开源软件栈和编程模型:
1.DPDK (Data Plane Development Kit)
DPDK由Intel、arm、amd、华为、红帽、nvidia等多家公司开发,是高性能用户态网络包处理的事实标准库。
它主要基于Linux系统运行,是用于快速数据包处理的函数库与驱动的集合,可以极大提高数据处理性能和吞吐量,提高数据平面应用程序的工作效率。
DPDK通过用户态轮询模式驱动(Poll Mode Driver)绕过内核协议栈,直接接管网卡数据流。
许多 DPU SDK 会集成或兼容 DPDK API,方便开发者移植高性能网络应用或利用熟悉模型。
DPU集成DPDK后,可将OVS/vSwitch、VXLAN封装、TCP流分类等网络功能全卸载,释放主机CPU 30%~50%算力。
例如:NVIDIA BlueField-2 DPU 原生集成DPDK,支持线速转发与流表管理;Helium DPU 通过DPDK实现80Gbps OVS卸载,时延降低50%
2.SPDK (Storage Performance Development Kit)
SPDK是由 Intel 发起的开源高性能存储软件开发工具包,用于编写高性能、可扩展的用户模式存储应用程序,
SPDK采用用户态NVMe驱动+无锁轮询架构,消除内核I/O栈开销。DPU搭载SPDK后,可卸载NVMe-oF、存储压缩/加密等任务,例如:
英特尔IPU通过SPDK实现存储虚拟化,将NVMe延迟从微秒级降至亚微秒级6;Helium DPU支持SPDK加速存储协议,提升裸金属云存储IOPS 3倍。
3.P4(Programming Protocol-independent Packet Processors) 社区工具链:
P4社区作为推动网络数据平面可编程技术的核心力量,对DPU的发展具有多重战略意义。它不仅为DPU提供了开放、灵活的技术生态,还通过标准化工具链和协作机制,推动了DPU在性能、场景适应性和产业生态上的突破。
P4语言的核心特性是协议无关性,允许开发者自定义数据包解析、匹配和转发逻辑,无需依赖固定功能的硬件。这一特性使DPU能够灵活支持各类新兴网络协议(如自定义隧道封装、金融低延时交易协议等),适应快速演进的云、AI、边缘计算场景。
P4社区推动的开放工具链(如编译器、模拟器)显著降低了DPU的创新门槛,使其在复杂场景中实现突破:
4.gRPC
gRPC 是Google公司开发的一个高性能、开源和通用的 RPC (远程过程调用)框架。
gRPC的远程procdure通过调用二进制协议的标准网络连接工作,并且与语言无关。
因此应用程序能够通过明确定义的接口在不同系统和语言之间建立无缝通信。
gRPC可以和DPU一起部署以增强网络通信和数据处理的特定方面。通过这种方法,可以将任务卸载到DPU,从而降低CPU利用率。比如:
主机管理软件、编排系统(如 K8s)通过 gRPC 调用 DPU 上的服务,进行配置、监控、策略下发。
为 DPU 的功能(如配置防火墙规则、查询状态、管理存储卷)提供统一的、语言无关的访问方式。
5.OpenMP(Open Multi-Processing)
OpenMP是一种广泛使用的并行编程指令集,主要用于在共享内存的并行系统中简化多线程编程。
通过OpenMP,可以在保持统一的代码的基础上,将计算卸载到加速器,如 GPU 或DPU等,利用加速器设备上的并行性,增强计算密集型应用程序的性能和效率。
OpenMP 并行化的主机线程/任务可以调用 DPU SDK API ,将适合卸载的任务(如加解密、压缩、特定过滤)发送给 DPU 执行。DPU 处理结果返回后,OpenMP 线程继续处理。关键在于协调好数据移动和任务依赖。
6.MPI (Message Passing Interface):
MPI是一种消息传递编程模型的标准。它不是一种语言,而是一种库描述,提供与C和Fortran语言的绑定。它是分布式内存并行编程的事实标准,用于跨多个计算节点的并行计算。
MPI可与 DPU协同,结合MPI的并行处理能力和DPU的卸载能力,为HPC应用及AI应用提升性能。
例如:由X-ScaleSolutions设计开发的MVAPICH2- DPU MPI库,可利用 InfiniBand 网络充分发挥 DPU 的潜力。