U50 つかってみる
2021-9-7 1:47 JST

手元に U50 があるので使ってみましょう。

Linux(Ubuntu) の準備

Linux の Kernel の 5.11 から DRM のドライバの構造が変わり gem_vm_ops がなくなってしまいました。その為、5.11 以降の Kernel だと XRT をインストールできません。(https://github.com/Xilinx/XRT/issues/5168)

現在、私が使っている環境は Ubuntu 20.04 で Kernel は 5.8.0-50-genericです。不用意に一旦 update してしまったので apt install や apt remove を屈指して古い Kernel に戻しています。

> uname -a
Linux meza 5.8.0-59-generic #66~20.04.1-Ubuntu SMP Thu Jun 17 11:14:10 UTC 2021 x86_64 x86_64 x86_64 GNU/Linux

XRT などのインストール

Xilinx の U50 のページを参考にドライバ等をインストールしていきます。(先に Vivado/Vitis のインストールが必要かも)

最初の xrt のインストールでエラーになる場合は Kernel のバージョンをチェックしましょう(5.11 以降は現時点で対応していない)。xrt のインストール時にファームウェアのインストールを促すメッセージが出ます。その通りにインストールします。うまくいけば lspci で次のように表示されます。

> lspci -v -d 10ee:
07:00.0 Processing accelerators: Xilinx Corporation Device 5020
        Subsystem: Xilinx Corporation Device 000e
        Flags: bus master, fast devsel, latency 0
        Memory at 4008000000 (64-bit, prefetchable) [size=32M]
        Memory at 400c000000 (64-bit, prefetchable) [size=128K]
        Capabilities: <access denied>
        Kernel driver in use: xclmgmt
        Kernel modules: xclmgmt

07:00.1 Processing accelerators: Xilinx Corporation Device 5021
        Subsystem: Xilinx Corporation Device 000e
        Flags: bus master, fast devsel, latency 0, IRQ 18
        Memory at 400a000000 (64-bit, prefetchable) [size=32M]
        Memory at 400c020000 (64-bit, prefetchable) [size=128K]
        Memory at 4010000000 (64-bit, prefetchable) [size=256M]
        Capabilities: <access denied>
        Kernel driver in use: xocl
        Kernel modules: xocl

一個目の Device の 5020 しか表示されていない場合はうまくファームウェアの書き込みがなされていません。

サンプルの実行

Vivado/Vitis もインストールされているものとします。

# CSH の場合の設定例
> source /tools/Xilinx/Vitis/2021.1/settings64.csh
> source /opt/xilinx/xrt/setup.csh
# BASH だとこうかな?(自信なし)
$ . /tools/Xilinx/Vitis/2021.1/settings64.sh
$ . /opt/xilinx/xrt/setup.sh

Vitis_Accel_Examplesが使ってみて簡単でした。Vitis-Tutorialsも日本語の説明があるので読んでおいた方がいいでしょう。特にVitis-Tutorials/Runtime_and_System_Optimization/Introduction/design_source/hw_srcは参考になりました。

Vitis-Tutorials

Runtime_and_System_Optimization/Introduction/design_source/hw_src に移動して Vitis_Libraries の空ディレクトリがあるので#(:a :href "https://github.com/Xilinx/Vitis_Libraries" "Vitis_Libraries")を clone します。

あとは一つ上に行って cmake するだけです。

> mkdir build
> cd build
> cmake ..
> make -j

この辺うろ覚え。hw_src にいって make したかも。PLATFORM は /opt/xilinx/platforms の下にある長い名前を指定します。

> make PLATFORM=xilinx_u50_gen3x16_xdma_201920_3

make すると alveo_examples.xclbin とその他ホスト側の実行オブジェクトができます。例えば 04_wide_app を実行してみます。

> source /opt/xilinx/xrt/setup.csh
lsof: WARNING: can't stat() overlay file system /var/lib/docker/overlay2/eed96ad22bac165f79130bd53a8d2d98a433fc0f58c66fa2db9b08f7aad56422/merged
      Output information may be incomplete.
lsof: WARNING: can't stat() nsfs file system /run/docker/netns/7dda8504c917
      Output information may be incomplete.
XILINX_XRT        : /opt/xilinx/xrt
PATH              : /opt/xilinx/xrt/bin:/usr/sbin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin
LD_LIBRARY_PATH   : /opt/xilinx/xrt/lib
PYTHONPATH        : /opt/xilinx/xrt/python

> ./04_wide_vadd
-- Example 4: Parallelizing the Data Path --

Loading alveo_examples.xclbin to program the Alveo board

Running kernel test XRT-allocated buffers and wide data path:


OCL-mapped contiguous buffer example complete!

--------------- Key execution times ---------------
OpenCL Initialization              : 7210.854 ms
Allocate contiguous OpenCL buffers :   22.252 ms
Set kernel arguments               :    0.004 ms
Map buffers to userspace pointers  :    0.049 ms
Populating buffer inputs           :  113.123 ms
Software VADD run                  :   84.908 ms
Memory object migration enqueue    :   97.073 ms
OCL Enqueue task                   :    0.027 ms
Wait for kernel to complete        :   10.433 ms
Read back computation results      :   48.879 ms

04_wide_vadd で実行されているプログラムのソースはhw_src/vadd.cpp です。C で書かれているので読みやすいですね。

Vitis_Accel_Examples

チュートリアルではないけど、こちらの方が汎用的に出来ていると思います。以下のスタイルのカーネルがあります。いずれも呼び出し元(host)は OpenCL で書かれています。

各ディレクトリで 単純に make とうつと Help が出てくるのでそれも読んでおいた方がよいでしょう。

rtl_kernels/rtl_vadd

わざわざ RTL のカーネルにしなくてもいい気がしますがこのサンプルをやってみましょう。(Vitis と XRT の環境設定を忘れずに!)

> make all TARGET=hw_emu DEVICE=xilinx_u50_gen3x16_xdma_201920_3 HOST_ARCH=x86

これで hw_emu(ハードウェアのエミュレーション)ができるようになります。xsim でシミュレーションするようです。実行には 環境変数 XCL_EMULATION_MODE が必要なので、それを自動でつけてくれるmake から実行します。

> make run TARGET=hw_emu DEVICE=xilinx_u50_gen3x16_xdma_201920_3 HOST_ARCH=x86

なお、cpp_kernels だと C のシミュレーション(sw_emu) が使えます。デバッグの時便利ですね。

U50 を本当に使うなら TARGET に hw を設定します。これは合成まで頑張ってやってくれるのでえらく時間がかかります。実行には環境変数を必要としないので直接実行可能です。

> make all TARGET=hw DEVICE=xilinx_u50_gen3x16_xdma_201920_3 HOST_ARCH=x86
> rtl_add build_dir.hw_emu.xilinx_u50_gen3x16_xdma_201920_3/vadd.xclbin

この xclbin というのが特殊で、hw の時は bit ファイルが入っているのですが、hw_emu の時は xsim を起動する情報が、sw の時は動的なライブラリ(so)が入っています。この辺を XRT のライブラリが吸収しています。

なのでやろうと思えばおれおれ XRT ライブラリも作る事が出来ます。

おまけ

どっかの作業中でVivado の合成中にメモリが足りなくなって先に行けなくなりました。(エラーが発生して)

JOBS の指定が 8 のままだったのがよくなかったようです。(というか Makafile にハードコーディングされていた、、、)

メモリが足りなくならないように JOBS を設定しましょう。どっかのサイトで swap 増やせばいいみたいな事書いてあったけどそれトータルのコンパイル時間がたぶん遅くなるよね。

リンク集