ホワイトペーパー

BittWare のパケットパーサーの構築、HLS と P4 の実装の比較

XUP-P3R with advanced passive heatsink

概要

One of the features of both BittWare’s SmartNIC Shell and BittWare’s Loopback Example is a packet parser/classifier that extracts protocol fields from packets. With this white paper, we not only wanted to describe our Parser, but explain how using HLS to build and configure it has resulted in a better implementation than using the P4 language. The Parser code is available on the BittWare developer website for free to AMD UltraScale+ owners as part of our Loopback Example (January 2020 availability)

スマートNICのプログラミングにP4を超えるものを

Today the Parser component of BittWare’s SmartNIC Shell is built using the AMD HLS C++ development environment. But an earlier revision of BittWare’s SmartNIC Shell used the P4 language though the AMD SDNet tool.

One reason to use P4 is that it’s an emerging standard popular among people embracing software-defined networking (SDN) on commodity Intel servers. However, AMD later restricted the availability of SDNet. Our use of P4 was specifically for end-users of SmartNIC Shell, so this restriction caused us to search for a more open solution. Following the success of our RSS implementation using HLS, we were motivated to re-implement the SmartNIC Shell parser using this same HLS approach (specifically the Xilinx HLS C++ environment).

本ホワイトペーパーのPDF版

Packet Parserとは?

イーサネット上で使用されるプロトコルは、ハードウェアが活用するには難しいものです。この課題は、プロトコルに多くのオプションフィールドがあるために存在します。これらのオプションは、例えば、IPヘッダーの開始を見つけることを複雑にしています。なぜか?IPヘッダーの場合、その前に0、1、2個のVLANタグがあることがあります。また、MPLSタグがある場合もあります。したがって、ハードウェアは、IPヘッダーを見つけるために、プロトコルを十分に理解する必要があります。ハードウェアは、ハードウェアのフィルタやテーブルでよく使用されるIPアドレスを見つけるために、IPヘッダを必要とします。IPヘッダー自体にもオプションのフィールドがあるため、同様の問題が次のレベルでも存在する。

BittWareのHLS C++パケットパーサーで対応可能です:

  • VLANタグ0~2個(旧SDNetのコードでは0または1個でした)
  • 0~5個のMPLSタグ(BittWare'旧SDNetコードはMPLSを認識していませんでした。)
  • IPフラグメント
  • IPv4ヘッダー(IPv6は不可)

ポートIDがこれらのIPプロトコルにあることを想定しています:TCP、UDP、DCCP、およびSTCP。

パケットパーサの 2 つのバージョンを作成した結果、P4 を使用した場合と HLS C++ を使用した場合とで、いくつかの違いがあることがわかりました。全体として、HLS のフローは P4 よりも抽象度が低いのですが、ツールははるかに成熟しています。

リソースの使用状況の詳細は表の通りです:

特徴P4/SDNetHLS C++
CLBs3,1853,391
ビーラム220
レジスター10,3615,975
コード行数2061,154

すべてのFPGAリソースにおいて、HLSは同等かそれ以上であることがわかります。ソースコードはより多くの行数を必要としますが、その一部はコメントやフォーマットによる影響です。しかし、HLS の C++ 実装は、P4 よりも常に多くのコード行を必要とすることは事実です。しかし、これはパケットパーサー/分類器の場合であり、P4 が記述できる範囲に含まれるもので、HLS C++ はそれ以上のことができます。HLSは非常に汎用的で、ほとんど何でもできる。P4は非常に特殊です。

さらに良いことに、HLS の実装が存在する以上、イーサネットプロトコルのバリエーションに対応するために HLS を修正する作業は、P4 言語で修正するのとほぼ同じであるのです。これは、HLS の C++ 実装が、私たちが作成した低レベルのパーサー関数への呼び出しのシーケンスとして構成されているためです。このアプローチは、P4 の下にあるランタイムを直接操作するのと同じです。

前述のように、Parser ブロックを含む Loopback Example のソースコードは、BittWare Developer サイトを通じて、Ultrascale++ オーナーが無償で入手できます。この例は、HLS C++ コード内で AXI インターフェイスを使用する方法を示す優れた図解です。BittWare FPGAカードをお持ちでない方は、こちらをご覧ください。購入先については、弊社までお問い合わせください。

タプル(Tuple)とは?

イーサネット上で使用されるプロトコルは、ハードウェアが活用するには難しいものです。この課題は、プロトコルに多くのオプションフィールドがあるために存在します。これらのオプションは、例えば、IPヘッダーの開始を見つけることを複雑にしています。なぜか?IPヘッダーの場合、その前に0、1、2個のVLANタグがあることがあります。また、MPLSタグがある場合もあります。したがって、ハードウェアは、IPヘッダーを見つけるために、プロトコルを十分に理解する必要があります。ハードウェアは、ハードウェアのフィルタやテーブルでよく使用されるIPアドレスを見つけるために、IPヘッダを必要とします。IPヘッダー自体にもオプションのフィールドがあるため、同様の問題が次のレベルでも存在する。

BittWareのHLS C++パケットパーサーで対応可能です:

  • VLANタグ0~2個(旧SDNetのコードでは0または1個でした)
  • 0~5個のMPLSタグ(BittWare'旧SDNetコードはMPLSを認識していませんでした。)
  • IPフラグメント
  • IPv4ヘッダー(IPv6は不可)

ポートIDがこれらのIPプロトコルにあることを想定しています:TCP、UDP、DCCP、およびSTCP。

FPGAハードウェアにP4が一般化する?

P4言語は、「パケット転送データプレーン」(またはネットワークスイッチ)をソフトウェアで定義するために作られました。この言語は、特にハードウェアベンダーのBarefoot Networksと関連しています。P4言語は、Googleが普及を支援する「P4 Runtime」と呼ばれるものとは異なります。P4 Runtimeは、P4でコンパイルされたソリューションのコントロールプレーンを操作することができる標準ランタイムAPIを提供します。

P4では、新しいプロトコルに対応したパケット分類器/解析器を簡単に定義することができます。また、P4はテーブルのルックアップ機能を一式規定しており、例えばVLANタグを排除して流れるパケットを書き換えることができます。

P4の柔軟性がFPGAへの採用につながるということでしょうか。そうならない理由はいくつかあると思います。

FPGAハードウェア上でP4のサブセットを提供する商用オプションは存在するが、現在のところその範囲は限定的である。さらに、前述の通り、商業的な条件から、BittWare 、これらを活用してサンプルプログラムを作成し、製品とともに無償で提供することは困難である。

注意すべきは、実際のFPGAアプリケーションは、P4だけで書くことはできないということです。たとえば、いくつかの例でパーサーに続くレシーバーサイドスケーリング(RSS)ブロックは、P4 でオーサリングすることはできません。しかし、HLS C++を使用すれば、どちらのブロックも、あるいは2つの機能を組み合わせた1つのブロックもオーサリングすることが可能です。

また、P4 テーブルルックアップ関数は、基本的に RTL または HLS C++ で記述されたハードウェア固有のランタイムライブラリのラ ップである。プログラマは、そのようなランタイムをHLS C++からペナルティなしで直接呼び出すことができます。

つまり、P4 と HLS C++ の両方を使用してパーサを実装した結果、HLS C++ のアプローチを採用することにしました。FPGA上のP4の需要が、成熟したツールをサポートできるほど大きくなるとは思えません。HLS C++は、より多くのことができ、より成熟しています。

HLSのポータビリティと結論

空の見出し

FPGA上のパケット・パーサーの実装について、P4言語による実装とHLS C++による実装の2つの説明を行い、あなたに合ったアプローチを評価するための参考になれば幸いです。

One final note is regarding portability between our FPGA cards. Between our AMD FPGA-based cards, HLS provides an easy method with few, if any, changes needed. For moving to an Intel-based card, such as our 520N-MX, source code changes will be required, particularly with respect to compliler pragmas. However, the basic concepts are identical. In both cases we are structuring C++ based upon our knowledge of FPGA translation challenges. Arbitrary C++ code will run very poorly inside an FPGA. However, C++ code restructured and anointed with pragmas works very well. The changes required for AMD or Intel are very similar but just expressed a little differently.

BittWareの SmartNIC Shell の一部として、当社の Parser は、当社の FPGA カードでネットワークパケット処理アプリケーションを構築する際に、チームの迅速な立ち上げに貢献します。SmartNIC for our cardsの詳細、またはお客様のアプリケーションのニーズについては、弊社までお問い合わせください。

BittWareのLoopbackの例では、SmartNICシェルのサブセットを再展開しており、無償で提供することができます。このサブセットには、私たちのParserライブラリが含まれています。

もっと読みたいがある:アプリノートを入手する

PDFダウンロードを希望する

このページでは、SmartNIC Shellの一部であるParserの基本的な概要を説明しています。SmartNIC Shellのアプリノートには、より詳細な情報が記載されていますし、何より無料でダウンロードできます!フォームに記入して、フルアプリケーションノートのPDF版へのアクセスをリクエストしてください。

"*"は必須項目

名称*
PDFはこのアドレスを使って送信されますので、これが有効なメールであることを確認してください。
住所・都市名*