王立峰:赛灵思FPGA上的P4

我是赛灵思的系统架构师,今天我给大家介绍一下在P4研究方面的更新。

赛灵思公司在三十年前发明了FPGA。随着摩尔定律的发展,FPGA的发展也是相当快。比如,在2016年,我的FPGA可能支持百万级的。在我的FPGA里,除了基本的查找表跟三十年前相比有很大更新。同时,也内嵌了很多部件,像存储单元、几千个DSP单元、100G以太网。最重要的是,FPGA本身是一张白纸,怎么在这张白纸里写出大家需要的功能。

现在FPGA已经可以实现相当复杂的网络处理功能。我们和学术界交流比较深的有Net FPGA项目,可以进行很多网络处理。

除了研究项目,还有很多各大公司的产品项目用了FPGA。这些产品项目有更加复杂的架构。比如,用多个FPGA实现复杂的处理。或者是用FPGA做快速的数据通道,用CPU做慢速的数据通道。在交换机路由器里,用FPGA做一些智能的除了,同时还有传统的ASIC进行基础的数据转发。这些应用场景都是存在的,FPGA的使用非常灵活。

回到包处理,过去的FPGA要用语言来写,很多人可能不懂这些语言,怎么办?在P4之前,赛灵思自己就推出了SDNet的工具。它是采用高级语言脚本PX语法,把你需要做的包处理的内容,通过脚本写出来,我们提供了SDNet的编译器。在编译的时候,我才告诉编译器要实现的细节。比如,网络带宽是多少,是1G,还是200G;或者需要延迟多少;设计是针对资源优化,还是针对可编程性进行优化。通过这些参数可以生成SDNet设计的IP,也可以针对查表处理有一些Firmware。通过赛灵思的加载文件加载到FPGA,同时通过Firmware更新生成一个完整的逻辑。

这是P4的标准架构,P4和原来的SDNet非常类似,在数据层面,通过输入端的匹配和处理,再到输出端的匹配和处理,再到输出。

我可以把P4的架构映射到SDNet的处理方式。我们发现P4语言定义的结构和SDNet可以实现的结构,匹配度非常高。

在这种情况下,我们可以做一个很简单的事情。也就是用户写了P4语言的设计,赛灵思公司会提供P4的编译器。我们这个P4编译器支持P4_16规范。从时间点来说,这个月就会提供一个早期的版本,供客户使用。这个编译器可以生成SDNet的脚本。这一整套设计是通过SDNet,用来做行为的仿真设计和测试。同时,最终生成出来的SDNet的IP,可以通过VIVADO工具,编译到最终的FPGA设计。

再细化一下。首先有了P4语言写的设计。P4的front end就是P4提供的,HLIR生成高级中间层。下一步是从中间层生成赛灵思的SDNet,这是赛灵思公司提供的映射环境,我们写了一个语法的语言转换器,目的是把整个设计转换到SDNet。SDNet是赛灵思公司提供的一个产品,可以把PS语法的网络行为设计生成到具体的FPGA设计中。

我们自己的实验用的是赛灵思VCU110开发板,这块开发板上用的是20纳米XCVU095器件,支持四路100G的interface。

对于科研机构更加感兴趣的是有没有自己的环境。NetFPGA提供了相当好的环境。这样一块板卡上包括4个万兆的以太网口,DMA是去CPU的通道,有一个输入和输出,中间是转发的处理,上面是输入,下面是输出,同样是4个以太网口加一个CPU的通道。

我们在2016年P4发展大会上进行了这样的演示,用P4语言系整个数据流程,通过P4到FPGA的编译器,生成了中间这个模块,加载到中间就形成了P4的验证环境。这是基于FPGA开发平台来做的。如果大家有相同的平台,也可以自己做。

提问:是不是只要遵从P4的编程规范写的所有代码,就可以放到FPDA上跑。我为NP写的代码,不需要做任何修改,只要生成P4的规范就可以跑在FPGA的平台上?
王立峰:属于P4的部分是的。

提问:我觉得这完全讲不通,因为硬件完全不同。
王立峰:下面我来回答你的问题。P4有一个重要的概念,它的语法和它的架构是可以分离的。这是P4.org写的P4的标准架构、标准语法,也有它自己的库。同时,各个Target开发者也会提供自己平台相关的特有架构的表示,平台也有自己的库。在这种情况下,作为在目标平台上的P4使用者,首先会做一些架构级别的选择,哪些部分是从P4.org通用的架构。他也会考虑一部分架构没有被P4.org覆盖,他会用平台相关的特性来进行编写;同时,他在写P4程序的时候,会调用标准的P4的库,也可能会使用与平台相关的自定义的功能;同时,作为开发者,他可能也有自己的用P4语言写的库。这些库可能是跨平台的,也可能是针对某些特定平台有特定优化的。通过这三种的结合,再经过编译器,就会生成API和和对应的转发平台代码。这整个架构图,大致是这样的开发流程。

举一个例子。这张图本身是从P4.org里看到的,是用P4定义的交换机的例子。Paser、Deparser都是标准的,根据P4.org的模块来写的,你完全不需要用私有的模块。同时,你会自己定义一些数据通道,这些数据通道上包括User data等等模块,这些模块你也会尽量按照P4给里的框架来写。也就是你希望中间一块有很大的迁移能力,你会希望完全按照标准来写。

同时,还有其他一些模块,因为P4只定义了中间的部分,边上的数据是怎么进来的、怎么出去,它有一些和平台相关的,是100G的以太网口,还是10G的以太网口,这是完全不一样的。还可能需要端到端的延迟处理能力,它是毫秒级别,还是纳秒级别,处理也是不一样的。也就是我用一个通用的结构来表示这个东西存在,在具体的实例中还有一些很细节的部分。比如,输入、输出、以太网的Mac、Surface的配置,这些可能是固定的,你不会考虑太多的现场可编程性的部分是与你的Target平台相关的,这些部分是要根据平台来进行处理的。这些部分就属于P4.org定义之外的东西,但你在实现当中可以考虑。

最后讲的是另外一个例子,也是我们在上个月做的演示。这是标准的24核的服务器,插在一块赛灵思FPGA的智能网卡上。智能网卡用P4语言实现了基于IETF的交换功能。在服务器上通过Linux实现多个虚拟机,每个虚拟机都有自己的DPDK。所有VM之间的通讯,都通过NSH的swich来实现,这个swich的实现是基于P4的。
赛灵思支持FPGA,希望可以跟大家一起把P4的通用语言在网络协议当中发展得更快、更好。


  • 本站原创文章仅代表作者观点,不代表SDNLAB立场。所有原创内容版权均属SDNLAB,欢迎大家转发分享。但未经授权,严禁任何媒体(平面媒体、网络媒体、自媒体等)以及微信公众号复制、转载、摘编或以其他方式进行使用,转载须注明来自 SDNLAB并附上本文链接。 本站中所有编译类文章仅用于学习和交流目的,编译工作遵照 CC 协议,如果有侵犯到您权益的地方,请及时联系我们。
  • 本文链接https://www.sdnlab.com/18205.html
分享到:
相关文章
条评论

登录后才可以评论

SDNLAB君 发表于16-12-08
1