P4 Compiler 系列 – 簡介 Compiler 架構

5 月 10, 2018

接下來幾個章節會簡介目前 P4 Compiler 的設計,以及如何從頭開始撰寫一個新的 P4-16 package 並搭配自己寫的 P4 backend compiler 以及自己定義的 target binary。

最新版的 P4 Compiler 可以至 https://github.com/p4lang/p4c 下載,該 Compiler 支援了 bmv2 (v1model + simple switch), ebpf, graph(Pipeline 視覺化用) 以及一個測試用的 Compiler。

P4 Compiler 的設計與 LLVM 這類型的 Compiler 有點相似,提供了 Frontend 以及 Backend Copmiler,而目前 P4 的 Frontend compiler 支援 P-14 以及 P4-16 這兩供規格(部分 P4-16 規格不支援)

夠精確的講,P4 Compiler 還包含了 Midend 來最佳化 P4 Code。

而 Frontend Copmiler 所產生的資訊稱為 Intermediate Representation(以下簡稱 IR),IR 產生之後回傳遞給 Midend,最後在傳遞給 Backend。

上圖為 P4 Compiler 在編譯 P4-16 程式時大略經過的步驟,圖並未包含 Midend。

Frontend Compiler 除了將 P4 程式轉換成 IR 以外,同時也能夠(但非必要)產生一個 P4Info 的檔案。
而 Midend 則是對 IR 進行最佳化,開發者可以自行開發 Midend,例如 P4 Target 並不支援某些 P4 功能,則可以在 Midend 就預先處理掉。官方也有提供許多預設的 Midend 功能像是移除未使用的 table 等等。
最後 Backend 則是將拿到的 IR 直接轉換成 P4 Target 的 Binary。

在開發之前首先是需要先了解有哪些部分需要開發,除了 P4 Target 本身以外,需要開發的有:

  • Architecture package (e.g. v1model)
  • Target binary 規格或格式
  • Backend Compiler
  • Midend Compiler

Architecture package 會在下一章節說明,而 Target binary 規格會與 Backend Compiler 一起撰寫,畢竟格式是自己訂的。

在撰寫 Compiler 之前,首先要先釐清一件事情就是其實 Frontend, Midend 以及 Backend Compiler 其實是包在同一個 binary 裡的,舉例來說,bmv2 常用的 Compiler p4c-bm2-ss 其實是一個包含 Frontend, Midend 及 Backend 的 Binary。

有些人可能會發現安裝或是編譯好 P4 Compiler 之後會有一個 p4c 程式,而透過 p4c 並指定 Backend (-b) 一樣可以跑出與 p4c-bm2-ss 一樣的結果。

若直接編輯 p4c 的話會發現他其實只是一支 Python 程式,並透過載入特定 Backend 的設定檔案去執行實際的 Backend,除了執行 Backend 之外,他還包含了預先透過傳統 C Compiler 所提供的 Preprocessor 去處理 P4 程式中所有的 Preprocess code 如 #include, #define 等等。處理頑之後產生一組臨時的單一 P4 程式(.p4i),最後再透過 Bacnkend (e.g. p4c-bm2-ss)去編譯 p4i 檔案並輸出。

若是好奇想要了解 IR 實際產生出來帶有什麼樣的資訊,可以透過 p4c-bm2-ss(主要是給 v1model,但經過測試其他的架構似乎也行)去產生 JSON 格式的 IR:

$ p4c-bm2-ss --toJSON IR.json your-p4-code.p4

下一章節會說明如何定義一個新的 architecture package。

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *

這個網站採用 Akismet 服務減少垃圾留言。進一步瞭解 Akismet 如何處理網站訪客的留言資料