3.2K Views
February 22, 23
スライド概要
フィックスターズならではの「FPGA」に関する高速化手法、効率的な開発ノウハウ、苦労話などについてお話しいたします。
<講演内容>
1.オープンソースで FPGA ボードを SmartNIC 化!
ネットワークインターフェスカード(NIC) に複雑なネットワーク処理をオフロードして、CPU への負荷を軽減する SmartNIC が注目されています。
SmartNIC には、高速 IO、IO 直近での高速処理、柔軟な機能変更、が要求され、FPGA の特性を十分に発揮できるアプリケーションと言えます。
FPGA を NIC 化するデザインはオープンソースで公開されているものがあり、このデザインを利用して独自のユーザーロジックを挿入すれば、様々な FPGA ボードを SmartNIC 化することが可能です。
今回、Intel Agilex FPGA ボードと corundum (https://github.com/corundum/corundum)、
AMD Xilinx Alveo U250 と open-nic (https://github.com/Xilinx/open-nic)
の組み合わせで動作を試したので紹介します。
FPGA のネットワークアプリケーションの開発経験のある方もない方も、ぜひご聴講下さい。
2.Lightning Talk!
①格安FPGAボードのすすめ その2
②Latticeの小規模・低消費電力FPGA iCE40でハマった話
・当社技術ブログ 記事: https://proc-cpuinfo.fixstars.com/
・フィックスターズグループ/セミナー一覧: https://www.fixstars.com/ja/seminar
・フィックスターズのFPGAシステム開発: https://www.fixstars.com/ja/services/fpga
フィックスターズは、コンピュータの性能を最大限に引き出すソフトウェア開発のスペシャリストです。車載、産業機器、金融、医療など、幅広い分野での開発経験があります。また、ディープラーニングや機械学習などの最先端技術にも力を入れています。 並列化や最適化技術を駆使して、マルチコアCPU、GPU、FPGA、量子アニーリングマシンなど、さまざまなハードウェアでソフトウェアを高速化するサービスを提供しています。さらに、長年の経験から培ったハードウェアの知識と最適化ノウハウを活かし、高精度で高性能なアルゴリズムの開発も行っています。 ・開催セミナー一覧:https://www.fixstars.com/ja/seminar ・技術ブログ :https://proc-cpuinfo.fixstars.com/
実践的!FPGA開発セミナー vol.19 2023/02/22 18:00~ Copyright© Fixstars Group
オープンソースで FPGA ボードを SmartNIC 化! Copyright© Fixstars Group
Who I am Ryuji NISHIDA 写真 西田 竜之 ソリューション第四事業部 シニアエンジニア Copyright© Fixstars Group
自己紹介 ● 西田竜之 ○ ○ ○ FPGAを用いたシステム開発に従事 ハードウェア開発をメインに担当 略歴 ■ 半導体ベンダ ● サーバー向けASIC開発 ■ 映像事務機メーカー ● 高画質エンジンLSI 映像機器向けFPGA開発 ■ フィックスターズ ● FPGAを用いた高速取引金融システム ● OpenCLによるアプリの高速化 Copyright© Fixstars Group
本題の前に・・・ ● 実践的!FPGA 開発セミナー vol.15 「続 Intel® Agilex™ 開発キットを用いた各種機能トライアル」 ■ HPS (ARMコア) 上での Linux 起動を紹介 ● インテル® FPGA Advent Calendar 2022 に投稿 ⇒ ● プレゼント対象(4 名)に選んで頂きました! ○ 年末、投稿してみてはいかがでしょうか? 参照URL https://qiita.com/ryujinishida/items/be74f4a91231886cedc1 参照URL https://blog.qiita.com/adventcalendar-2022-presents-winners/ ・プレゼント品 Copyright© Fixstars Group Air Pods Pro
本日のAgenda 1. SmartNICとは 2. Intel® Agilex™ ボードを SmartNIC 化 3. AMD Xilinx Alveo U250 ボードを SmartNIC 化 Copyright© Fixstars Group
SmartNIC とは ● SmartNIC (Smart Network Interface Card) ○ CPU 負荷のかかるネットワーク処理を NIC にオフロードする ■ フィルタリング、暗号化、etc. ○ FPGA の特徴を有効的に使える 2019 Xilinx DataCenter Summit 発表資料抜粋 Copyright© Fixstars Group
SmartNIC とは ● SmartNIC 的なアプリケーション例 2019 Xilinx DataCenter Summit 発表資料抜粋 Copyright© Fixstars Group
SmartNIC とは ● SmartNIC 製品例 ○ AMD Xilinx ■ ALVEO™ SMARTRNIC 参照URL https://japan.xilinx.com/applications/data-center/network-acceleration.html#smartnics ○ Intel®FPGA ■ SmartNIC N6000-PL 参照URL https://www.intel.co.jp/content/www/jp/ja/products/details/fpga/platforms/smartnic/n6000-pl-platform.html Copyright© Fixstars Group
SmartNIC とは ● その他(参考) ○ P4 言語 https://p4.org/ ■ Programming Protocol-independent Packet Processors ■ データプレーンデバイス (NIC、スイッチ、ルーターなど) の ■ ■ パケット処理をプログラミングするドメイン固有言語 ネットワーク用プロセッサ(ASIC, CPU)の制御に使用される FPGA 製品でも P4 言語対応のものが多い ○ DPDK https://www.dpdk.org/ ■ ■ ■ The Data Plane Development Kit 高速パケット処理用のライブラリ、ドライバ カーネル機能をバイパスして CPU コアが直接低レイヤの処理をする Copyright© Fixstars Group
Intel® Agilex™ ボードを SmartNIC 化 ● 実行環境 ○ ホスト ■ OS:Ubuntu 18.04LTS ○ 使用 Agilex™ ボード ■ ■ ■ ES 品 QSFP-DD x 2 PCIe I/F ※ ES 品のため Gen4 未対応 参照URL: https://www.intel.com/content/www/us/en/products/details/fpga/developmentkits/agilex/f-series.html NIC 化の I/F はそろっている ● SmartNIC として使うために・・・ ○ ○ PCIe ⇔ Ethernet FPGA デザイン Linux ドライバ Copyright© Fixstars Group オープンソースで提供されている プラットフォームを利用して試行
Intel® Agilex™ ボードを SmartNIC 化 ● Corundum: An Open-Source 100-Gbps NIC ○ https://github.com/corundum/corundum ■ サポートボードリスト Intel®FPGA ボード 参照URL: https://docs.corundum.io/en/latest/index.html 参照URL: https://cseweb.ucsd.edu//~snoeren/papers/corundum-fccm20.pdf 対象のAgilex ボードにポーティングする Copyright© Fixstars Group
Intel® Agilex™ ボードを SmartNIC 化 ● Corundum: An Open-Source 100-Gbps NIC ○ 構成 ■ ■ ■ P-Tile PCIe IP (Gen3) はストリーム入出力 App にユーザーアプリケーションを実装する Linuxドライバも同梱されている Copyright© Fixstars Group デザインは RTL (verilog)
Intel® Agilex™ ボードを SmartNIC 化 ● Corundum: An Open-Source 100-Gbps NIC ○ ○ Quartus Prime 22.3 を使用 ハードウェア構築 $ git clone https://github.com/corundum/corundum.git $ cd corundum/fpga/mqnic/DE10_Agilex/fpga_100g/fpga_24AR0 $ make ■ Quarutus プロジェクトが生成される ※ 実際には make がエラー返り値をうけて 途中停止するため、make を複数回実行 ■ ピン配置、PWRMGT 設定をポーティング対象の ボードに合わせて修正 ■ Quarutus を起動、合成を実行 Copyright© Fixstars Group
Intel® Agilex™ ボードを SmartNIC 化 ● Corundum: An Open-Source 100-Gbps NIC ○ ドライバビルド $ cd corundum/modules/mqnic $ make $ sudo insmod mqnic.ko ■ Ubuntu で問題なくビルドできた (CentOS は未対応だった) Copyright© Fixstars Group
Intel® Agilex™ ボードを SmartNIC 化 ● Corundum: An Open-Source 100-Gbps NIC ○ 実機確認 ⇒ ■ ■ ○ 失敗 .sof をコンフィグレーション & reboot lspci コマンドで PCI デバイスを確認 ⇒ 認識せず・・・ デバッグ ■ P-Tile Debug tool Kit PLL もロックせず 全く動いていない・・ クロック、リセット、ボード設定 を確認 ⇒ 問題なし ■ ■ (※ Copyright© Fixstars Group Intel 社に確認したところ、 ES 品ボードの初期不良の疑いがあり、 ボード返却と動作確認が必要とのこと) ⇒ 今回は断念
Intel® Agilex™ ボードを SmartNIC 化 ● ここまでのまとめ ○ SmartNIC の紹介 ○ オープンソースの FPGA NIC 化プラットフォーム Corundum の紹介 ○ Intel® Agilex™ ボード実行トライアル ■ 合成、ビルドは完了 ■ 実機確認でエラー Copyright© Fixstars Group
Who I am Takashi UCHIDA 内田 崇 ソリューション第四事業部 エンジニア Copyright© Fixstars Group
open-nicとは? ● AMD Xilinxから出ているFPGA designおよびdriver ● open source ● 内部ロジックをカスタムで追加可能(今回は未実施) Copyright© Fixstars Group
open-nicの構成 open-nicは以下3つのrepositoryから構成される。 ● open-nic-shell FPGA designのrepository ● open-nic-driver FPGAをHOSTから制御するためのdriverのrepository ● open-nic-dpdk dpdkを使用したdriver(今回は未使用) Copyright© Fixstars Group
open-nic-shell ● FPGA design ● Vivado version 2020.x、2021.xに対応 ● 以下のboardに対応 Xilinx Alveo U50, U55N, U200, U250, U280 Copyright© Fixstars Group
open-nic-shell design 概要(1) FPGA design 全体図 (githubのREADMEから抜粋) ● HOST - FPGA間の通信はopen-nic-driverを 使用してPCIe経由でQDMAで行われる ● QSFPの制御はCMAC IPが使用されている ● ユーザーロジックを追加できる領域は2箇所 (左図の灰色部) ● CMACのポート数やQDMAのphysical functionの実装数などをパラメータ設定可 能 ● 今回の動作確認ではデフォルトで実行 Copyright© Fixstars Group
open-nic-shell design 概要(2) ● QDMA subsystem ● ザイリンクスのQDMA IPと、QDMA IPインター フェースと250MHzユーザーロジックボックスの橋渡 しをするRTLロジックが含まれる ● QDMAサブシステムと250MHzボックス間のインター フェースは、AXI4-streamプロトコルの変種を使用し ている ● CMAC subsystem ● ザイリンクスのCMAC IPといくつかのラッパーロジッ クが含まれる ● 1または2のCMACポートをサポートする2つのCMAC ポートの場合、専用のデータおよび制御インターフェ イスを持つCMACサブシステムのインスタンスが2つ 存在する ● CMACサブシステムは322MHzで動作し、 AXI4-streamプロトコルの変種を使用して322MHzの ユーザーロジックボックスに接続する FPGA design 全体図 (githubのREADMEから抜粋) Copyright© Fixstars Group
open-nic-shell design 概要(3) ● packet adapter ● 250MHz AXI-streamと322MHz AXI-stream間の変換 に使用される ● TXパスとRXパスの両方で、パケットモードFIFOとして 機能し、送出前にパケット全体をバッファリングする ● RXパスでは、CMACサブシステムインタフェースで欠 落しているバックプレッシャー機能を回復する ● system configuration ○ リセット機構を実装し、各コンポーネントのレジスタア ドレスを割り当てている ○ レジスタインタフェースはAXI4-liteプロトコルを使用 し、250MHzのクロックと位相が揃った125MHzで動作 する FPGA design 全体図 (githubのREADMEから抜粋) Copyright© Fixstars Group
open-nic-shell design 概要(4) ユーザーロジックのinterfaceは基本的にAXI4-streamだが、一部特殊 なデータが付随する。 250MHzのインターフェース(AXI4-streamベース) ● ● ● ● ● ● ● ● FPGA design 全体図 tvalid(1bit) tdata(512 bits) tkeep(64 bits) tlast(1 bit) tready(1 bit) tuser_size(16 bits):packet size(byte単位) tuser_src(16 bits) tuser_dst(16 bits) ○ MAC ports = CMACのポート(1 or 2) ○ cmac portとphysical functionの判別用 ○ 例) QDMA -> CMACの場合 (githubのREADMEから抜粋) src tuser_src, tuser_dstのformat (READMEから抜粋) dst 左赤丸 PCIe PFs 0固定 右赤丸 左赤丸の設定 MAC Ports を設定 そのまま) Copyright© Fixstars Group
open-nic-shell design 概要(5) 322MHzのインターフェイスは以下の通り ● ● ● ● ● ● FPGA design 全体図 (githubのREADMEから抜粋) Copyright© Fixstars Group tvalid(1bit) tdata(512 bits) tkeep(64 bits) tlast(1 bit) tready(1 bit) tuser_err:パケットにエラーが発生している場合1 を設定
open-nic-driver ● HOSTからPCIe経由でFPGAにデータ転送やregister設定するためのdriver ● OSは以下に対応している ○ Ubuntu 18.04 ○ Ubuntu 20.04 ○ Ubuntu 22.04 ● open-nicで指定されているrepositoryのコードだと動作しなかった(固まっ た)ので今回は最新版(2023/2/21時点)のrepositoryで動作確認した Copyright© Fixstars Group
open-nicビルド手順 ● open-nic repositoryのscriptディレクトリ内で以下を実行する ./checkout.sh . ● これによりopen-nic-shellとopen-nic-driverのrepositoryがscriptフォルダ内にcloneされる Copyright© Fixstars Group
open-nic-shell 合成手順(1) 注意) cmacの合成にはlicense(無料)が必要なので事前に取得/設定しておく必要がある ● open-nicで使用するboardの種類などのoptionを指定して、<open-nic-shell repository TOP>/scriptにあるbuild.tclを実行 例) alveo u250を指定する場合 $ vivado -mode batch -source ./build.tcl -tclargs -board au250 ● open-nicで指定されているrepositoryの構成だとvivadoのversionが2020.2で固定されており変 更する必要があるので注意 ● スクリプト実行完了後手動でGUIを立ち上げbitstreamを作成する Copyright© Fixstars Group
script(build.tcl)修正箇所 例) vivadoのversionを2021.2にする場合 53 # Vivado version check 54 # set VIVADO_VERSION "2020.2" 55 set VIVADO_VERSION "2021.2" 56 if {![string equal [version -short] $VIVADO_VERSION]} { 57 puts "OpenNIC shell requires Vivado version $VIVADO_VERSION" 58 exit 59 } Copyright© Fixstars Group
open-nic-shell 合成手順(2) build実行時のoptionを一部抜粋する。 ● -user_plugin <PATH> ○ user pluginとしてuser logicをdesignに挿入するためのoption ○ user pluginを指定しない場合はdefaultで用意されているlogicが使用される ● -num_phys_func 使用するphysical functionの数を指定する(1 ~ 4、default:1) ● -num_queue QDMAに使用するqueueの数を指定する(1 ~ 2048、default:512) ● -num_cmac_port 使用するCMAC port数を指定する(1 or 2、default 1) Copyright© Fixstars Group
FPGA書き込み ● bitファイルを書き込んだ後hot rebootしないとlspciで認識されないので注 意 ● lspciでdeviceが以下のように表示されていればOK $ lspci | grep Xilinx XX:XX.X Memory controller: Xilinx Corporation Device 903f Copyright© Fixstars Group
driver実行手順 ● driverは最新版(2023/2/21時点)のrepositoryを使用すること ● repository内でmake後、以下コマンドでkernel moduleをinsertする $ sudo insmod onic.ko RS_FEC_ENABLED=1 ● 実行後、dmesgで確認してエラーがなければ問題なく動作している ● 注意点 1. ひとつ前の手順まで実行しlspciでXilinx deviceが確認できる状態にしてから実行すること 2. driverをinsert後FPGAを再度書き込む際は以下のコマンドでkernel moduleを取り除いてか ら実行すること $ sudo rmmod onic.ko Copyright© Fixstars Group
(dmsg log 例) $ dmsg … [ 366.528180] onic: loading out-of-tree module taints kernel. [ 366.528239] onic: module verification failed: signature and/or required key missing - tainting kernel [ 366.528737] OpenNIC Linux Kernel Driver 0.21 [ 366.528880] onic 0000:01:00.0 onic1s0f0 (uninitialized): Set MAC address to 00:0a:35:82:25:21 [ 366.528881] onic 0000:01:00.0: device is a master PF [ 366.528961] onic 0000:01:00.0: Allocated 8 queue vectors [ 366.529001] onic 0000:01:00.0: Number of CMAC instances = 1 [ 366.529012] onic 0000:01:00.0: Setup IRQ vector 34 with name onic1s0f0-0 [ 366.529019] onic 0000:01:00.0: Setup IRQ vector 35 with name onic1s0f0-1 [ 366.529027] onic 0000:01:00.0: Setup IRQ vector 36 with name onic1s0f0-2 [ 366.529034] onic 0000:01:00.0: Setup IRQ vector 37 with name onic1s0f0-3 [ 366.529040] onic 0000:01:00.0: Setup IRQ vector 38 with name onic1s0f0-4 [ 366.529047] onic 0000:01:00.0: Setup IRQ vector 39 with name onic1s0f0-5 [ 366.529054] onic 0000:01:00.0: Setup IRQ vector 40 with name onic1s0f0-6 [ 366.529060] onic 0000:01:00.0: Setup IRQ vector 41 with name onic1s0f0-7 [ 366.589007] onic 0000:01:00.0 enp1s0: renamed from onic1s0f0 Copyright© Fixstars Group
動作確認環境 ● 以下の構成で動作確認を行った HOST 1 (Ubuntu 20.04.4 LTS) HOST 2 (Ubuntu 22.04.1 LTS) u250 (192.168.10.1) ConnectX-5 (192.168.10.2) 100Gbps DACケーブル Copyright© Fixstars Group
open-nic動作確認(iperf)結果 iperfが動作することが確認できた。 host01(client) host02(server) $ iperf -c 192.168.10.2 -----------------------------------------------------------Client connecting to 192.168.10.2, TCP port 5001 TCP window size: 4.00 MByte (default) -----------------------------------------------------------[ 3] local 192.168.10.1 port 57708 connected with 192.168.10.2 port 5001 [ ID] Interval Transfer Bandwidth [ 3] 0.0-10.0 sec 16.6 GBytes 14.2 Gbits/sec $ iperf -s -----------------------------------------------------------Server listening on TCP port 5001 TCP window size: 128 KByte (default) -----------------------------------------------------------[ 1] local 192.168.10.2 port 5001 connected with 192.168.10.1 port 57708 [ ID] Interval Transfer Bandwidth [ 1] 0.0000-10.0009 sec 16.6 GBytes 14.2 Gbits/sec Copyright© Fixstars Group
まとめ ● AMD Xilinxから出ているopen sourceのopen-nicを実際に動かしてみた ● 細かな注意点はあるが、比較的簡単にFPGAをNIC化できた Copyright© Fixstars Group
(Appendix) Copyright© Fixstars Group
QDMA(IP) ● QDMA wrapperに相当 ● MM(memory mapped)とST(stream)の2種類のAXI interfaceを使用可能 ● Physical Functionおよびその周辺の回路はIPに含 まれていないので準備する必要がある(open-nicの designにはRTL(verilog)が含まれている) ● 今回のopen-nicではStreamのinterfaceを使用し ている QDMA wrapper(IP) Architechture (PG302より抜粋) Copyright© Fixstars Group
QDMA(参考) QDMA Architechture (PG302より抜粋) Copyright© Fixstars Group
Thank you! お問い合わせ窓口 : [email protected] Copyright © Fixstars Group