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