随着P4语言正逐渐成为可编程交换机事实上的可编程语言标准,越来越多的人希望打造属于自己的支持P4语言的可编程交换机或智能网卡或DPU,因此支持P4语言的编译器的开发至关重要。P4编译器负责如何将逻辑查找表映射到物理表,同时要满足程序中的数据和控制依赖关系,这里面涉及到数学的最优化问题。抛开最优化问题不谈,能否打造一款不是最优的但也能支持P4语言的编译器呢?打造编译器的过程中会遇到什么问题呢?有没有可以参考的开源资源?或许2022年8月26日arvix网站上的一篇文章会告诉你答案。PDF原文下载链接:https://arxiv.org/pdf/2208.12892.pdf。本文将该文的部分内容进行了翻译(跟以往的公众号相关文章一样,翻译质量不高,难免有问题,见谅!),给大家分享一下。另外,笔者所在团队也曾开发过一款支持P4语言的HyperParser,其中就开发出一款支持P4语言的自己的编译器,具体可参考公众号之前文章《【Verilog开源】一种用于智能网卡或可编程交换机的,支持P4语言的高性能开源解析器的设计》。
01
引言
后端编译器需要解决几个计算上难以解决的问题[18,22],以找到P4程序到目标硬件的映射。优化算法通常需要很长时间才能完成[18,22]。随着网络内计算[23]范式的不断兴起,各种研究工作[24–28]也将重点放在数据平面中的不同网络功能的开发上。在这些情况下,研究人员不需要安装具有各种功能的成熟交换机所需的大型P4程序。当数据平面程序员需要将如此大的P4程序适配到目标硬件中时,最佳映射算法是很重要的。另一方面,使用基于启发式算法的开源后端编译器可以为研究人员提供关于使用目标硬件实现较小P4程序的快速决策。
后端编译器使用的映射算法对P4程序的资源(TCAM/SRAM存储、ALU数量、纵横宽度等)要求以及目标交换机中的可用资源非常敏感[18]。P4程序的资源需求可以在运行时改变(例如,IPv4转发表的大小增加),这可能使先前计算的映射无效。随着网络虚拟化[29]和网络即服务[30]范式的快速扩散,按需网络功能部署的需求也在快速增长。它需要在短时间内快速自动部署定制的数据平面算法。因此,开发更快、更有效的启发式/近似映射算法具有重大意义。使用封闭源代码后端编译器,研究人员无法尝试不同的映射算法。除此之外,在RMT体系结构中开发支持复杂指令的硬件单元(P4语言中的extern[3])越来越受到关注[31–33]。
没有开源后端编译器,研究人员无法将新开发的外部程序集成到P4程序中并测试其有效性。从头开始独立开发后端编译器需要各种与映射计算无关的常见和重复任务(即IR解析、使用图形数据结构表示解析的IR、建模硬件资源等)。开源后端编译器可以让研究人员专注于开发高效的映射算法,而不是专注于重复的任务。
受这些因素的启发,在这项工作中,我们为基于V1Model[15]架构的RMT交换机设计了一个开源P4后端编译器(仅映射阶段)。据我们所知,它是第一个基于RMT架构的可编程交换机的开源P416后端编译器。后端编译器需要两个输入:a)V1Model交换机中可用资源的规范,以及b)P4C前端生成的P4程序的中间表示(IR)。由于P4C不提供任何接口来指定V1Model交换机的硬件资源,我们开发了基于JSON格式的硬件规范语言(HSL)(第3.3节)来表示V1Model交换机的硬件资源规范。在讨论了第2节中的相关工作之后,我们在第3节中简要讨论了V1Model架构以及HSL(第3.3节)。然后,我们介绍了P4C编译器前端提供的IR结构(第4节)。该后端使用各种现有的基于启发式的算法来分配V1Model交换机中的流水线资源并计算IR到硬件资源的映射。据我们所知,这是文献中第一个考虑P4程序中使用有状态内存产生的约束及其对映射决策的影响的方案我们在第5节中讨论了映射过程的细节。一旦找到映射,计算硬件配置二进制文件需要将映射直接转换为硬件指令代码。由于这项工作不专注于在V1Model switch的任何特定实例上执行P4程序,因此我们将硬件配置二进制生成留给未来的工作。我们在第6节中讨论了后端编译器的实现和评估,并在第5节中总结了本文。
为什么选择V1Model: V1Model是开源P4C编译器前端完全支持的唯一RMT交换机。此外,主要可编程交换机硬件供应商都支持V1Model架构[9,34]。近年来,大量研究工作[35]将V1Model用作其参考硬件架构(通过使用商用硬件或BMV2模拟器)。此外,V1Model类似于P4语言版本14中使用的抽象交换机模型。因此,所有基于P414的研究工作都可以映射到该模型。最后,P4联盟正在标准化的最新可编程交换机架构是PSA[16],它也类似于V1Model架构。本文中介绍的后端编译器可以通过少量修改扩展到PSA体系结构。由于这些原因,V1Model是大量研究工作的代表性硬件架构,我们选择为该架构构建后端编译器。
后端编译器不做什么:本文中介绍的后端编译器仅支持V1Model架构和P4语言(P416)结构的子集,它们涵盖了广泛的用例。系统支持的P4结构的完整列表,见[36]。专有硬件可以具有用于数据包处理的特殊指令(如extern[3]),并且它们的系统中也可以具有附加约束。我们的后端编译器不是任何专有系统的完全替代品。它使用启发式算法将P4程序映射到V1Model交换机,尽管存在有效映射,但它可以部分拒绝P4程序(如其他可编程交换机后端[37])。此外,由于使用了启发式,它不能保证计算映射的最优性。最后,后端编译器仅覆盖图1所示的映射阶段,而不覆盖硬件配置生成阶段。
02
在[2]中,作者介绍了一种基于RMT架构的抽象交换转发模型,并提出了P4编程语言,以与协议无关的方式对交换机进行编程。作者还介绍了两级P4语言编译器的高级结构。虽然这项工作简要地讨论了解析器和TDG映射问题,但缺少一个完整的后端编译器开源系统。在[38]中,作者解决了将数据包解析逻辑映射到基于CAM的硬件的问题。然而,它的主要重点是合成解析器硬件电路。因此,它不能直接用于P416后端编译器。在[18]中,作者讨论了将RMT交换机的逻辑匹配动作表映射到物理匹配动作表的计算复杂性。他们提出了一种基于整数线性规划的方法(用于最优解)以及一些基于启发式的映射计算方法
该系统是一个开源项目。然而,它不能支持P4程序中的状态存储器,这是网络内计算范式的关键要求。上面提到的所有工作都是为了支持P4语言的初始版本(又称P414[4]),并且没有一个提供完整的后端编译器。此外,最新版本的P4语言(又称P416)在架构上与P414不同。因此,这些工作不能直接用于编译P416程序
P4语言联盟开发的P416语言的参考编译器是P4C[14]。其前端可以为各种目标体系结构(包括RMT体系结构)编译P416程序。它通过基于CPU的仿真为两个RMT架构交换机提供后端支持:V1Model[15]和PSA[16]。这些仿真后端在CPU上执行P4程序的中间表示。它没有规定对RMT交换机的硬件资源进行建模。在决定P416程序是否可以映射到真实的目标硬件时,无法考虑硬件资源限制约束。在[8]中,作者为基于FPGA的平台提供了一个开源P416后端编译器。然而,该系统的基本块与RMT体系结构中使用的物理匹配动作表不同。这里,基本块可以执行匹配和分支指令;并且基于它们的结果,可以执行一些动作。因此,与原始RMT架构相比,它在每个节点中提供了更灵活的匹配动作能力
RMT体系结构的文献中几乎没有其他开源编译器编译器[37,39]。然而,它们[37]要么不支持P416中编写的程序作为输入,要么是为基于非RMT架构的硬件平台设计的[39]。除了这些开源系统,还存在一些能够支持RMT交换机的P416语言的专有后端编译器[21,40]。然而,它们本质上是封闭源代码,不提供对其内部机制的访问。
03
图2 V1Model的流水线结构
在V1Model架构中,传入数据包首先通过基于TCAM的[38]可编程解析器(图3),该解析器执行以状态机形式提供的解析逻辑(由后端编译器转换为状态表)。解析器包含两个主要构建块:
a)报头识别单元:它包含一个PB位宽的缓冲区,用于在数据包中查找并在每个周期识别最多H个包头。它还包含一个TCAM,能够存储PTL条目以实现状态表。每个TCAM条目包含当前解析状态的信息和要匹配的头字段的值(作为位序列)。在每个周期,可以在TCAM中查找最大f TC查找字段值(每个字段具有最大查找宽度f TW b)和当前状态。TCAM条目为PTW b宽,用于存储查找字段值和当前状态值。每个条目还包含指向RAM单元的指针,用于存储下一个解析状态和要由提取单元提取的报头字段的位置。
b) 提取单元:在TCAM中匹配数据包后,存储在SRAM的匹配索引单元中的信息被加载到提取单元中。该单元可以提取最大PEW位宽数据作为报头字段,并将其存储在字段缓冲器中。在每个循环中,提取几个报头字段,并将下一个解析状态馈送到报头识别单元,以便在下一个循环中在TCAM中进行匹配。报头识别单元可以向前移动到分组中的最大PMA位,以开始识别下一报头字段。每个解析器单元都设计为具有最大解析速率(PRate)吞吐量。V1Model交换机可以并行部署多个解析器单元,以实现更高的数据包解析速率。
完成解析后,所有提取的报头字段从字段缓冲器发送到分组报头向量(PHV)。PHV可以存储不同类型的字段;类型i的所有f iC报头字段均为f iW位宽(i=1至F)。PHV中的多个字段可以合并在一起以形成更大的标题字段。除了解析的头字段之外,PHV还存储硬件特定元数据(即入口端口、时间戳等)。PHV通过宽首部总线传递到流水线中的后续组件(图2的N个匹配动作阶段)。
经过解析之后,PHV通过N个匹配动作阶段进行入口阶段处理。每个阶段(图3)包含T个TW位宽的TCAM块单元,每个TCAM块能够存储TL条目。它还包含S个SW位宽SRAM块,每个块都能够存储SL条目。TCAM块用于实现三元/范围/前缀/精确匹配的物理匹配动作表(MAT)。一小部分SRAM块(SM块)用于实现基于哈希表(使用HSK-way-Cuckoo哈希表[41,42])的物理匹配动作表以进行精确匹配,其余用于存储其他信息(即动作参数、下一个MAT地址等)。这些较小的物理匹配动作表可以独立运行,也可以分组在一起,以匹配阶段中更宽的标题字段。跨阶段的MATs可以合并以实现更长的表。头字段分别通过两个交叉开关TCB(TCBW位宽)和SCB(SCBW位宽度)从PHV提供给基于TCAM和SRAM的物理MA。对于MATs中的每个条目,有一个相应的指针指向相应的动作信息(动作参数,动作指令,地址和下一个MAT地址等)。在MATs中找到匹配时,从存储器加载相应的动作信息。每个匹配动作阶段包含用于PHV的每个字段的独立算术逻辑单元(ALU),用于并行计算。两个或多个单元可以组合在一起,以在较大的字段上执行计算。除了每个报头字段ALU单元外,在每个匹配操作阶段,还可以使用固定数量的外部单元(散列、计数器、寄存器、计量器等)进行特殊操作(即散列计算、计数、存储/加载状态等)。
每个阶段可以存储所有用于物理MATs的Ac个VLIW指令。每个VLIW命令都为每个报头字段ALU和外部单元携带单独的指令。数据从PHV通过ACBW位宽交叉开关(ACB)提供给这些处理单元。与匹配交叉开关(TCB和SCB)类似,该交叉开关的每一位都由PHV的所有字段驱动。动作信息(除了动作指令存储在专用存储器中)和外部单元使用的有状态存储器被分配在可用SRAM块(分别为SA块和SS SRAM块)的单独块中。每一级包含MP内存端口(每一个MBW位宽),能够在一个时钟周期内从/读写到SRAM单元。这些端口用于从SRAM块读取/写入数据,以获得精确的MATs、动作存储器和状态存储器。每个基于TCAM的MAT都可以存储固定数量的匹配条目(最大容量)。另一方面,基于SRAM的MAT可以存储可变数量的条目,因为相同的SRAM块被分配用于存储匹配条目、动作条目和有状态存储器。用于精确匹配MAT、动作存储器和有状态存储器的总SRAM块(可用总S块中的SM、SA和SS)的数量取决于第5.3节的逻辑到物理MAT映射算法。为了优化SRAM使用,RMT架构允许字打包,创建多个SRAM块的打包单元
多个条目(匹配、操作或有状态内存条目)可以存储在一个单元中,以减少SRAM浪费。这种可变打包格式不会影响匹配性能,匹配单元可以将数据包与存储在同一SRAM块中的多个字进行匹配。
图3 RMT流水线上的一个匹配-动作阶段
数据包复制引擎和流量管理器(PRE&TM):完成入口阶段处理后,数据包被提交到出口端口的队列。PRE&TM是一个不可编程的组件,负责处理端口队列中的数据包生命周期,调度数据包,并在必要时复制数据包。除了这些,还有两个用于计算和验证数据包校验和的固定功能组件。由于它们是固定的功能块,我们不讨论它们的细节。
输出阶段:一旦从出口端口的队列中取出数据包,它将进行出口阶段处理。出口级类似于入口级,并共享相同的物理组件进行处理。后端编译器在入口线程和出口线程之间分配资源,使它们不会妨碍彼此的数据包处理活动
逆解析器:出口阶段处理完成后,数据包通过逆解析器块。它重新组合来自分组报头向量字段的数据和有效载荷。则分组最终通过输出信道传播。
后端编译器需要有关V1Model交换机可用资源的信息。然而,公开可用的P4C编译器不提供任何接口来对其进行建模。包头向量、可编程解析器和匹配动作阶段是V1Model架构中的主要可编程组件。我们开发了一种基于JSON格式的硬件规范语言(HSL),用于指定基于V1Model架构的交换机的可编程组件中的可用资源。该语言允许指定PHV中可以容纳多少标题字段,以及这些字段的位宽。类似地,它允许指定可编程解析器中使用的各种硬件资源的维度(第3.1节)。它还允许指定匹配操作阶段的数量和每个阶段中的资源数量,如第3.2节所述。附录B显示了V1Model交换机的示例硬件规范。
因为篇幅有限,中间内容请参考原文,此处翻译略。
07
局限:我们的后端编译器支持大多数P4语言结构,涵盖广泛的用例。然而,它仍然不支持可变长度的头解析和操作中的直接有状态内存访问。通过仔细设计P4程序,可以避免这两种情况。除此之外,它不支持P4语言中可用的原子事务机制。我们正在努力支持这些P4语言功能。
扩展V1Model体系结构:PSA[16]或Tofino[47]是V1Model架构的扩展,其中架构支持不同的外部。这些架构可以在一个原子指令中组合多个更简单的指令,以实现复杂的功能。例如,Tofino交换机[9]中可用的寄存器extern可以执行四路分支指令。它可以在一对寄存器(间接有状态内存)上执行两个if-else对和读-修改-写操作。然而,要在P4程序中使用它们(或任何新的外部),P4C编译器前端需要支持它们。之后,这些外部可以在我们的后端编译器中得到支持,只需对P4程序的计算映射进行少量修改。
编写新的映射算法:我们的后端编译器以模块化的方式设计。在解析P4程序的中间表示之后,它将预处理信息(头信息、解析图、TDG)存储在各种方便的数据结构(哈希表、图等)中。除此之外,它还以各种方便的数据结构(哈希表、数组等)存储V1Model交换机中的资源。作为一个开源项目,研究人员可以重用这些处理过的信息来编写用于头映射、解析图映射和TDG映射的新算法。关于源代码组织的详细讨论参见[36]。
08
P4程序的可实现性给出快速决策。我们相信,这个开源后端编译器可以作为一个经济高效的平台,用于分析现实世界V1Model交换机中P4(版本16)程序的可实现性和资源消耗。它允许研究人员作为一个开源平台来试验不同的映射算法。通过支持各种外部单元,它可以扩展到支持V1Model架构的其他派生。这可以为可编程交换机研究人员提供一个开放平台,用于试验不同的映射算法和V1Model交换机的不同变体。
THE END
今天是中秋节,祝大家:中秋节快乐!月光所至,皆为故乡!
更多有关P4编译器涉及到的最优化问题相关的文章可参考Nick教授团队的经典文章:
翻译:郭卫 图文排版:潘伟涛
责任编辑:刘欢 潘伟涛