A Simple Note on P4FPGA: A Rapid Prototyping Framework for P4
論文:P4FPGA: A Rapid Prototyping Framework for P4
Github:https://github.com/p4fpga
Reference: Han Wang, Robert Soule ?, Huynh Tu Dang, Ki Suh Lee, Vishal Shrivastav, Nate Foster, and Hakim Weatherspoon. 2017. P4FPGA : A Rapid Prototyping Framework for P4. In Proceedings of ACM Symposium on SDN Research conference, Santa Clara, California USA, April 2017 (SOSR 2017), 14 pages.
A Simple Note on "P4FPGA: A Rapid Prototyping Framework for P4"
Structure:
- Introduction, Background and Overview
- Code Generation
- Fixed-Function Runtime
- Optimization Principles
- Implementation and Evaluation
Introduction
P4語(yǔ)言的提出為網(wǎng)絡(luò)領(lǐng)域帶來(lái)了巨大的影響,編程人員可以通過(guò)P4實(shí)現(xiàn)一系列有意義的網(wǎng)絡(luò)應(yīng)用、協(xié)議等。
但是,當(dāng)前大多數(shù)P4可編程的目標(biāo)設(shè)備是以軟件的形式實(shí)現(xiàn)的,開(kāi)發(fā)人員需要在硬件上實(shí)現(xiàn)更高效的設(shè)計(jì)。在這方面,FPGA是更具吸引力的P4程序載體。作為一種形式的可重編程芯片,FPGA提供了軟件的靈活性和硬件的性能。
而設(shè)計(jì)一款將P4語(yǔ)言轉(zhuǎn)換為FPGA HDL代碼的編譯器面臨著以下難點(diǎn):
- FPGA主要通過(guò)低層次的、不可移植的代碼庫(kù)進(jìn)行編程;此外,第三方處理設(shè)備之間的通信是設(shè)備特定的,具有不可移植性;
- 由于程序之間的差異性以及不同架構(gòu)采取的不同負(fù)載策略,基于源P4代碼生成高效的硬件代碼實(shí)現(xiàn)是非常困難的;
- 雖然P4語(yǔ)言無(wú)感知底層硬件架構(gòu),但它依賴于一系列"extern"語(yǔ)法來(lái)導(dǎo)入外部實(shí)現(xiàn)的高效功能,這使代碼生成變的更加復(fù)雜。
P4FPGA,靈活、高效、可移植的開(kāi)源P4-to-FPGA編譯器和runtime。為保證P4FPGA的靈活性,編譯器允許用戶導(dǎo)入使用不同語(yǔ)言編寫(xiě)的特定硬件模塊。這種方法提供了在ASIC交換機(jī)上難以實(shí)現(xiàn)的靈活性。為保證生成代碼的高效性,P4FPGA支持一或多個(gè)端口的數(shù)據(jù)通路,允許用戶基于他們的特定應(yīng)用選擇最佳的設(shè)計(jì)。此外P4FPGA提供了基于設(shè)備無(wú)感知硬件抽象的runtime,保證P4FPGA支持往Xilinx或Altera FPGA上加載代碼。
實(shí)驗(yàn)對(duì)不同的具有代表性的P4程序進(jìn)行了驗(yàn)證,結(jié)果表明P4FPGA生成的代碼能夠在任意數(shù)據(jù)報(bào)大小的情況下達(dá)到線速,同時(shí)時(shí)延與商用ASIC交換機(jī)相似。P4FPGA已用于至少兩個(gè)以上的科研項(xiàng)目。
總之,論文做出了以下貢獻(xiàn):
- 提出了P4FPGA編譯器和運(yùn)行時(shí)系統(tǒng);
- 驗(yàn)證了生成代碼和不同P4程序的后端的性能,并驗(yàn)證性能不輸于商用交換機(jī);
- 使用P4FPGA開(kāi)發(fā)了一系列標(biāo)準(zhǔn)和網(wǎng)絡(luò)應(yīng)用,表明P4FPGA能夠被廣泛應(yīng)用。
Code Generation
P4FPGA編譯器的核心工作,是將用P4語(yǔ)言表達(dá)的邏輯數(shù)據(jù)報(bào)處理結(jié)構(gòu)轉(zhuǎn)換為用硬件描述語(yǔ)言表達(dá)的邏輯數(shù)據(jù)報(bào)處理結(jié)構(gòu)。P4FPGA將生成的物理處理結(jié)構(gòu)轉(zhuǎn)換為一個(gè)個(gè)塊block。在大多數(shù)編譯器中,塊對(duì)應(yīng)于一系列的操作(查表,數(shù)據(jù)報(bào)操作原語(yǔ)等)。通過(guò)使用參數(shù)化的模板在P4FPGA中實(shí)現(xiàn)了這些基本塊。在初始化的時(shí)候,這些模板是用于實(shí)現(xiàn)數(shù)據(jù)報(bào)解析器、流表、動(dòng)作和逆解析器邏輯的硬件模塊。
實(shí)現(xiàn)塊主要有兩個(gè)動(dòng)機(jī):
- 降低編譯器的復(fù)雜性,代碼生成本質(zhì)上就是塊的組合;
- 模塊化設(shè)計(jì)從(1)程序員能夠輕松通過(guò)外部函數(shù)接口新增外部定義的功能;(2)程序員可以通過(guò)替換相同功能的塊來(lái)修改編譯器 兩個(gè)角度保證了拓展性。
P4代碼的流控制程序?qū)?yīng)于基本塊的組合,將這些基本塊的組合稱為可編程數(shù)據(jù)報(bào)處理流水線,這與P4FPGA運(yùn)行時(shí)系統(tǒng)實(shí)現(xiàn)的固化流水線相反,換句話說(shuō),可編程數(shù)據(jù)報(bào)處理流水線對(duì)應(yīng)于特定P4源程序,而固化流水線受制于目標(biāo)平臺(tái),對(duì)于所有輸入程序都是一樣的。
Programmable Pipeline
可編程的數(shù)據(jù)報(bào)處理流水線在FPGA硬件上實(shí)現(xiàn)了P4源程序的可編程邏輯。
Parsing
數(shù)據(jù)報(bào)的解析處理可以被抽象為有限狀態(tài)機(jī)(Finite State Machine, FSM),由狀態(tài)和轉(zhuǎn)移組成。
對(duì)于一個(gè)給定的狀態(tài),FSM基于header或parser的輸入進(jìn)行解析狀態(tài)轉(zhuǎn)移。
一個(gè)狀態(tài)的子集識(shí)別并解析首部字段,FSM圖可以是無(wú)環(huán)的也可以是有環(huán)的。
P4FPGA采用數(shù)據(jù)流的方法將數(shù)據(jù)報(bào)字節(jié)輸入FSM中,在有足夠的數(shù)據(jù)解析首部或執(zhí)行FSM轉(zhuǎn)移的時(shí)候進(jìn)行處理。
解析器基本塊的實(shí)現(xiàn)包括適用于所有解析器實(shí)例的代碼(包括狀態(tài)變量,如數(shù)據(jù)報(bào)buffer,解析狀態(tài)及偏移量,和管理輸入字節(jié)的環(huán)路)以及解析器實(shí)例特定的代碼(實(shí)現(xiàn)應(yīng)用特定的FSM)。
Deparsing
輸入:(1)存儲(chǔ)于內(nèi)存中的數(shù)據(jù)報(bào),(2)可編程流水線修改過(guò)的數(shù)據(jù)報(bào)首部。逆解析器根據(jù)這兩個(gè)輸入重組數(shù)據(jù)報(bào)并轉(zhuǎn)發(fā)。
類似于解析器,逆解析器也有一個(gè)FSM,但是由于要實(shí)現(xiàn)數(shù)據(jù)報(bào)首部的增添與刪除,逆解析器的設(shè)計(jì)更加復(fù)雜。
逆解析器有以下三個(gè)模塊:(1)數(shù)據(jù)報(bào)拓展器,(2)數(shù)據(jù)報(bào)合并器,(3)數(shù)據(jù)報(bào)壓縮器。
- 數(shù)據(jù)報(bào)拓展器基于設(shè)計(jì)好的偏移量往數(shù)據(jù)報(bào)填充字節(jié),支持?jǐn)?shù)據(jù)報(bào)首部的添加;
- 數(shù)據(jù)報(bào)合并器對(duì)修改的數(shù)據(jù)報(bào)首部字段進(jìn)行寫(xiě)操作,包括被數(shù)據(jù)報(bào)拓展器增加的首部;
- 數(shù)據(jù)報(bào)壓縮器通過(guò)寫(xiě)位掩碼將數(shù)據(jù)報(bào)的某些字節(jié)標(biāo)記為非法。
注意:逆解析器負(fù)責(zé)進(jìn)行數(shù)據(jù)報(bào)的修改操作。數(shù)據(jù)報(bào)的修改操作既可以在流水線中進(jìn)行(一張流表處理完接著一張流表),或者在流水線的最后進(jìn)行。為了提高效率,降低時(shí)延,P4FPGA采取后者。換句話說(shuō),可編程流水線對(duì)數(shù)據(jù)報(bào)的拷貝進(jìn)行操作,逆解析器將這些操作合并到數(shù)據(jù)報(bào)中。
Matching
P4FPGA中實(shí)現(xiàn)流表的基本塊被設(shè)計(jì)為支持?jǐn)?shù)據(jù)流接口get/put訪問(wèn)的硬件模塊,P4支持用戶指定匹配數(shù)據(jù)報(bào)的算法。P4FPGA實(shí)現(xiàn)了兩種:精確匹配和三元組匹配,三元組匹配使用了第三方的代碼庫(kù)。P4FPGA使用兩種方法實(shí)現(xiàn)精確匹配,一種是通過(guò)CAM內(nèi)存,另一種是通過(guò)基于hash的查找表。用戶可以通過(guò)往編譯器傳入?yún)?shù)使用這兩種方法。
由于P4向用戶提供了"流表可編程"的抽象,一些流表可能只有動(dòng)作,用于對(duì) 在該流水線階段處理的每一個(gè)數(shù)據(jù)報(bào) 觸發(fā)動(dòng)作。P4FPGA不給該階段分配任何流表資源。
Actions
P4的動(dòng)作能夠修改一個(gè)字段的值,移除、增加首部,或修改數(shù)據(jù)報(bào)的元數(shù)據(jù)。理論上,每一個(gè)動(dòng)作在任意時(shí)間,根據(jù)暫時(shí)的元數(shù)據(jù)處理一個(gè)數(shù)據(jù)報(bào)。
P4FPGA實(shí)現(xiàn)對(duì)數(shù)據(jù)報(bào)元數(shù)據(jù)的內(nèi)聯(lián)(inline)編輯和對(duì)數(shù)據(jù)報(bào)首部的post-pipeline修改。修改動(dòng)作創(chuàng)建一份存儲(chǔ)于內(nèi)存中的更新值拷貝,應(yīng)用于逆解析器將操作合并到數(shù)據(jù)報(bào)時(shí)。
對(duì)于修改數(shù)據(jù)報(bào)長(zhǎng)度的動(dòng)作,基本塊在實(shí)現(xiàn)逆解析器的塊之前/之后創(chuàng)建,以實(shí)現(xiàn)重校準(zhǔn)。比如,對(duì)于刪除數(shù)據(jù)報(bào)首部的動(dòng)作,實(shí)現(xiàn)逆解析器的塊通過(guò)位掩碼將刪除的首部標(biāo)記為非法,而之后的重校準(zhǔn)塊將剩余的字節(jié)覆蓋在非法字節(jié)之上。
Control Flow
P4流控制程序在無(wú)環(huán)的情況下組織流表和動(dòng)作。它的原始實(shí)現(xiàn)是采用固化的流水線設(shè)計(jì),在該情況下,runtime會(huì)使用額外的元數(shù)據(jù)實(shí)現(xiàn)源程序的邏輯。但是由于實(shí)現(xiàn)目標(biāo)是FPGA,P4FPGA能夠?qū)⒘骺刂七壿嬛苯佑成涞缴傻挠布O(shè)計(jì)。每一個(gè)流控制節(jié)點(diǎn)對(duì)應(yīng)于一個(gè)后接情況分支的基本塊。因此我們注意到,在FPGA上實(shí)現(xiàn)流控制邏輯比硬件交換機(jī)更加靈活。
在程序執(zhí)行階段,解析后的數(shù)據(jù)報(bào)和元數(shù)據(jù)傳入樹(shù)結(jié)構(gòu)。對(duì)于每一個(gè)節(jié)點(diǎn),runtime評(píng)估情況并將數(shù)據(jù)傳入合適的分支,或者基于控制平面API的規(guī)則執(zhí)行查表。
P4FPGA依賴流水并行實(shí)現(xiàn)高吞吐,樹(shù)結(jié)構(gòu)的不同節(jié)點(diǎn)能夠并行處理不同的數(shù)據(jù)報(bào)。
Control Plane API
P4FPGA生成控制平面API,提供C++函數(shù),允許用戶對(duì)流表項(xiàng)進(jìn)行增刪改查,讀/寫(xiě)狀態(tài)化內(nèi)存。API也支持Debug。
External Functions
相比ASIC,FPGA的優(yōu)點(diǎn)在于它們更加靈活和可編程。
P4提供了有限的編程接口來(lái)實(shí)現(xiàn)網(wǎng)絡(luò)應(yīng)用,并在設(shè)計(jì)上是平臺(tái)無(wú)關(guān)的。因此有時(shí)需要實(shí)現(xiàn)額外的功能通過(guò)調(diào)用外部函數(shù)。比如校驗(yàn)和計(jì)算、加密、解密等。P4語(yǔ)言中是通過(guò)extern語(yǔ)法來(lái)聲明和調(diào)用這些函數(shù)的,而這些調(diào)用和架構(gòu)緊密相關(guān)。
P4FPGA允許用戶自己通過(guò)HDL實(shí)現(xiàn)外部定義的函數(shù),但是這樣會(huì)對(duì)高效代碼的生成造成影響,因?yàn)闀?huì)造成高時(shí)延。比如,一個(gè)外部函數(shù)需要訪問(wèn)持續(xù)型的狀態(tài)或者有很復(fù)雜的處理邏輯,那么就需要較長(zhǎng)的時(shí)間等待完成。如果整個(gè)進(jìn)程因?yàn)橥獠亢瘮?shù)處理而阻塞,那么將大幅影響吞吐量。P4FPGA實(shí)現(xiàn)了異步的操作處理,保證操作是并行的,這類似于多進(jìn)程,但是無(wú)需內(nèi)容交換的額外開(kāi)銷。
Fixed-Function Runtime
P4FPGA固化功能的runtime為P4中的處理算法提供執(zhí)行環(huán)境,它定義了允許生成代碼通過(guò)目標(biāo)無(wú)感知抽象訪問(wèn)通用功能的途徑。因此,runtime扮演著相當(dāng)重要的角色,它為數(shù)據(jù)報(bào)處理應(yīng)用提供高效、靈活、可拓展的環(huán)境。
- 必須提供一個(gè)對(duì)于不同硬件平臺(tái)都通用的抽象架構(gòu);
- 必須提供高效的中間媒介用于在不同處理組件之間傳遞數(shù)據(jù);
- 必須提供輔助功能用于支持控制、監(jiān)控和debug。
P4程序員可能會(huì)編寫(xiě)各式各樣的網(wǎng)絡(luò)應(yīng)用,對(duì)runtime提出了不同的要求。為支持這些不同的用戶場(chǎng)景,P4FPGA允許用戶選擇兩種架構(gòu):
- multi-port switching: 適用于網(wǎng)絡(luò)轉(zhuǎn)發(fā)組件,比如交換機(jī)和路由器,以及測(cè)試新型網(wǎng)絡(luò)協(xié)議;它使用一個(gè)512位的crossbar做出端口選擇。
- bump-in-the-wire: 適用于網(wǎng)絡(luò)功能和網(wǎng)絡(luò)加速,只有一個(gè)入端口和一個(gè)出端口。
Memory Management
當(dāng)數(shù)據(jù)報(bào)進(jìn)入交換機(jī)時(shí),它需要在內(nèi)存中存儲(chǔ)起來(lái),有兩種實(shí)現(xiàn)方法:
- 使用FIFO隊(duì)列緩存數(shù)據(jù)報(bào),缺點(diǎn)在于不利于實(shí)現(xiàn)先進(jìn)的數(shù)據(jù)報(bào)處理特征,比如QoS(這些特征需要數(shù)據(jù)報(bào)重排序);
- P4FPGA通過(guò)內(nèi)存管理單元MMU對(duì)可選內(nèi)存buffer進(jìn)行管理,MMU做了兩個(gè)接口,一個(gè)malloc()一個(gè)free(),使用buffer分配的方法管理數(shù)據(jù)報(bào)。
Transceiver Management
P4FPGA是跨硬件平臺(tái)的,因此提供了收發(fā)管理單元來(lái)保證runtime能使用平臺(tái)特定的MAC層和物理層。
Host Communication
P4FPGA集成了主機(jī)通信通道與CPU進(jìn)行通信,對(duì)于實(shí)現(xiàn)控制通道和debug非常有用。主機(jī)通信模塊主要基于PCIe協(xié)議。P4FPGA在硬件和軟件之間提供了阻塞和非阻塞兩種RPC方法
Timing Closure
對(duì)于時(shí)序收斂問(wèn)題,做了兩個(gè)方面的處理:
- 使用流水FIFO保證parser的輸入輸出、流表和動(dòng)作塊是記錄過(guò)的(registered);
- 優(yōu)化動(dòng)作引擎的設(shè)計(jì)和流控制的邏輯,在每個(gè)時(shí)鐘周期實(shí)現(xiàn)簡(jiǎn)單的組合邏輯。
Optimization Principles
為保證P4FPGA生成代碼具備高效性,在編譯器層面和微架構(gòu)層面基于以下信條實(shí)現(xiàn)了優(yōu)化:
- 1.Leverage hardware parallelism in space and time to increase throughput.
- 2.Transform sequential semantics to parallel semantics to reduce latency.
- 3.Select the right architecture for the job.
- 4.Use a resource-efficient components to implement match tables.
- 5.Eliminate dead metadata
- 6.Use non-blocking access for external modules.
Implementation and Evaluation
轉(zhuǎn)載于:https://www.cnblogs.com/qq952693358/p/7862047.html
總結(jié)
以上是生活随笔為你收集整理的A Simple Note on P4FPGA: A Rapid Prototyping Framework for P4的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 关于近十年来N-S方程的研究结果
- 下一篇: Git-远程操作