Vitis Accel Examples を試す(1/3)
Vitis_Accel_Examples のサンプル実行と make 時に引き渡される引数の意味について解説します。
環境設定
XRT と Vitis の環境設定が必要です。csh では次のような感じ。 bash だと source が.(ドット)になって .csh が .sh になる(でいいかな?)。
source /tools/Xilinx/Vitis/2021.1/settings64.csh
source /opt/xilinx/xrt/setup.csh
U50 で実行するには XRT がインストールされている必要があります。 U50 の初期設定はこちら
まずはお試し
簡単そうな cpp_kernels の burst_rw を試しにやってみましょう。 make コマンドを引数無しでたたくと使い方が出てきます。 それを読むと all と run で使えることがわかります。 次のように実行するとボードが無くても Xilinx の xsim という シミュレータ用のコードが出来て実行可能です。
> make all TARGET=hw_emu DEVICE=xilinx_u50_gen3x16_xdma_201920_3
> make run TARGET=hw_emu DEVICE=xilinx_u50_gen3x16_xdma_201920_3
make の時に重要なキーワードに TARGET と DEVICE があります。 簡単に説明していきましょう。
TARGET
sw_emu, hw_emu, hw が選択可能。
sw_emu | :ソフトウェアのシミュレーション。C++ レベルなのでコンパイルも実行も早い。 |
hw_emu | :ハードウェアのシミュレーション。xsim が呼ばれる。 |
hw | :実際のハードウェア。合成するのでバイナリを作るのがやたらと遅い。 |
DEVICE
DEVICE は正確には U50 を指します。最近の Xilinx の Makefile では PLATFORM に改められています。歴史的経緯でこの Examples では DEVICE になっている ようです。 SDAccel の延長の Vitis では PLATFORM を2種類定義していて(詳細はこの辺) 「Vitis は、データセンターまたはエンベデッド プラットフォームのいずれかをターゲットとした FPGA アクセラレーション アプリケーションを開発するための統合フローを提供します」(Vitis フロー 101 チュートリアルより) だそうです。
データセンター
簡単に書くと Alveo とかはデータセンター(既存の SDAccel の延長)、 それ以外の今までのボードはエンベデッド。 データセンター用の PLATFORM は基本的にはベンダーからしか 提供されない(詳細はブラックボックス)ようです。なので U50 で qdma が 使いたくても(例えば Docker から仮想的にポートを見せたい!!なんて時は きっと qdma をつかう。つかったことないけど)、Xilinx が出してくれないと 使えません。nodma なんてのも Makefile にキーワードがあるけど、 実際の PLATFORM としては提供されていません。
データセンタ-は PCIe を含むブラックボックスの部分とユーザが作る部分に 別れていてどうやら DFX(Dynamic Function eXchange) という技術、 昔はパーシャルと呼ばれていた技術を使っているようです。
FPGA の部屋で DFX が紹介されているので(こちら)、興味のある人は見てみるといいでしょう。
蛇足ながら XRT の XRT and Vitis Platform Overview という資料に怪しい感じで PCIe Based Platforms に ERT とか MicroBlaze とか書いてあります。さらに PCIe Based Hybrid Platforms には ZOCL-ERT とか PS とか言う記述があります。

ERT を動かすためにベアメタルの環境が用意されているみたいです。 U30 や VCK5000 では MPSoC があるので ZOCL-ERT が使えるみたいですね。 今後のデータセンタの主流にするのかな?
エンベデッド
エンベデッドの方は SDSoC が廃止され(とほほ)、SDAccel 方式の OpenCL に 統一された PLATFORM になりました。DFX は使用されていないようようです。 (お~っと、ikwzm さんの XRT 環境は DFX つかってるぞ Ultra96/Ultra96-V2 向け Debian GNU/Linux で XRT(Xilinx Runtime)を動かす(2.8ビルド編)) なので、データセンターとは違い、自分で PLATFORM を作る事が出来ます。 KV260 で実際にやってみて出来ることを確認しました(いずれ記事で書きます)。
OpenCL 方式なので SDSoC のように関数をアクセラレートするという感覚ではなくなりました。すべてカーネルをロードして実行するというプログラミング・モデルです。
おまけ
v++ と xo
v++ で途中生成される xo(Xilinx Object) これなんでしょう? はい。zip でした。しかも、中身は cpp。RTL の場合は Verilog だったり します。
> unzip -l ./_x.sw_emu.xilinx_u50_gen3x16_xdma_201920_3/vadd.xo
Archive: ./_x.sw_emu.xilinx_u50_gen3x16_xdma_201920_3/vadd.xo
E4wynEIAkS1J0O5zTMd+FEfzMUHETT2T18csKUfcrqVAo=
Length Date Time Name
--------- ---------- ----- ----
1214 2021-09-05 02:19 vadd/kernel.xml
2681 2021-09-04 16:57 vadd/cpu_sources/vadd.cpp
433 2021-09-05 02:19 xo.xml
--------- -------
4328 3 files
Xilinx の資料の中でリンクだのなんだのという言葉出てきますが 既存の概念に合わせてるだけでまぁ一種のギミックですね。 よくできた考え方なので不自然ではありません。
xclbin
v++ で作られる xclbin は hw, hw_emu, sw_emu で3種類あります。 ヘッダーの中にそれを切り分ける情報があるらしく、hw の場合は 単純に FPGA の bit ファイルです。 hw_emu の場合は xsim で実行するための情報で、HDL のソースを含みます。 sw_emu の場合は
それを XRT 用のランタイムが切り分けて実行します。 正確には環境変数 XCL_EMULATION_MODE に TARGET を設定します。 何も設定しないと hw の設定です。XCL_EMULATION_MODE を 間違えると実行できないので、自動的に付けてくれる make から run するようにしましょう。