2022年最終日!今年はARMプロセッサと一体のFPGAボード(SoC FPGA)を中心に使っていたが、卒業論文や学会発表が終わり次第、Alveoカードを中心に使うことになりそうなので開発環境をセットアップした。そのときのメモを残しておく。基本的にUG1301やUG1370を参考にセットアップした。
セットアップ環境
Xilinx Alveoはデータセンター向けのFPGAで、PCI Express経由でホストマシン(x86)と通信することができる。今回はAlveoのU200とU50のセットアップをした。U200もU50も同じような手順でセットアップすることができる。セットアップアップするホストマシンの環境は以下の通りである。
- ホストマシン #1
- CPU: 12th Gen Intel(R) Core(TM) i5-12400
- OS: 20.04.5 LTS (Focal Fossa)
- Vitis 2021.1
- PCI Expressスロット ← Alveo U200を装着
- ホストマシン #2
- CPU: 12th Gen Intel(R) Core(TM) i5-12400
- OS: 20.04.5 LTS (Focal Fossa)
- Vitis 2021.1
- PCI Expressスロット ← Alveo U50を装着
Vitisのインストール
Vitis 2021.1を各ホストマシンにインストールした。インストール方法はいつもどおりなので割愛する。
XRTと運用プラットフォームのインストール
Alveo U200の「開発を始める」タブとAlveo U50の「開発を始める」タブから以下のように選択し、XRTと運用プラットフォームを各ホストマシンにダウンロード&インストールした(画像はAlveo U200の場合)。インストール後は、xbmgmt
コマンドなどが使用できるようになる。
Alveoカードへのファームウェア書き込み
BDF(バス番号、デバイス番号、ファンクション番号)の確認
xbmgmt examine
コマンドでBDFを確認することができる。
自分の環境では、0000:01:00.0
がBDFであるという表示がされた。
/opt/xilinx/xrt/bin/xbmgmt examine
書き込み
xbmgmt program
コマンドで、BDF0000:01:00.0
に対してファームウェアの書き込みを行う。
sudo /opt/xilinx/xrt/bin/xbmgmt program --base --device 0000:01:00.0
書き込み後、改めてxbmgmt examine
コマンドを実行すると、プラットフォームは、
U200上ではxilinx_u200_gen3x16_xdma_base_2
、U50上ではxilinx_u50_gen3x16_xdma_base_5
となった。
動作検証の実行
XRT/運用プラットフォームをインストールとファームウェアの書き込みが完了すると、xbutil
コマンドを用いて、PCI Expressのリンク、転送帯域幅、DMA転送などのテストをすることができる。自分の環境では、以下のようにBDFを指定して実行した。
sudo /opt/xilinx/xrt/bin/xbutil validate --device 0000:01:00.1
U200上での実行結果
U200上で動作検証したときの出力を以下に貼る。
$ sudo /opt/xilinx/xrt/bin/xbutil validate --device 0000:01:00.1
Validate Device : [0000:01:00.1]
Platform : xilinx_u200_gen3x16_xdma_base_2
SC Version : 4.6.21
Platform ID : 0B095B81-FA2B-E6BD-4524-72B1C1474F18
-------------------------------------------------------------------------------
Test 1 [0000:01:00.1] : aux-connection
Test Status : [PASSED]
-------------------------------------------------------------------------------
Test 2 [0000:01:00.1] : pcie-link
Test Status : [PASSED]
-------------------------------------------------------------------------------
Test 3 [0000:01:00.1] : sc-version
Test Status : [PASSED]
-------------------------------------------------------------------------------
Test 4 [0000:01:00.1] : verify
Test Status : [PASSED]
-------------------------------------------------------------------------------
Test 5 [0000:01:00.1] : dma
Details : Buffer size - '16 MB'
Host -> PCIe -> FPGA write bandwidth = 7593.7 MB/s
Host <- PCIe <- FPGA read bandwidth = 11689.7 MB/s
Buffer size - '16 MB'
Host -> PCIe -> FPGA write bandwidth = 8155.2 MB/s
Host <- PCIe <- FPGA read bandwidth = 12150.7 MB/s
Buffer size - '16 MB'
Host -> PCIe -> FPGA write bandwidth = 7675.7 MB/s
Host <- PCIe <- FPGA read bandwidth = 11847.2 MB/s
Buffer size - '16 MB'
Host -> PCIe -> FPGA write bandwidth = 7482.6 MB/s
Host <- PCIe <- FPGA read bandwidth = 12157.5 MB/s
Test Status : [PASSED]
-------------------------------------------------------------------------------
Test 6 [0000:01:00.1] : iops
Details : IOPS: 568353 (verify)
Test Status : [PASSED]
-------------------------------------------------------------------------------
Test 7 [0000:01:00.1] : mem-bw
Details : Throughput (Type: DDR) (Bank count: 4) : 67178.8MB/s
Test Status : [PASSED]
-------------------------------------------------------------------------------
Test 8 [0000:01:00.1] : p2p
Test 9 [0000:01:00.1] : m2m
Details : bank0 -> bank1 M2M bandwidth: 11923.18 MB/s
bank0 -> bank2 M2M bandwidth: 12633.20 MB/s
bank0 -> bank3 M2M bandwidth: 12517.10 MB/s
bank1 -> bank2 M2M bandwidth: 12537.37 MB/s
bank1 -> bank3 M2M bandwidth: 12526.43 MB/s
bank2 -> bank3 M2M bandwidth: 12529.95 MB/s
Test Status : [PASSED]
-------------------------------------------------------------------------------
Test 10 [0000:01:00.1] : vcu
Test 11 [0000:01:00.1] : aie-pl
Validation completed. Please run the command '--verbose' option for more details
U50上での実行結果
U50上で動作検証したときの出力を以下に貼る。
$ sudo /opt/xilinx/xrt/bin/xbutil validate --device 0000:01:00.1
Validate Device : [0000:01:00.1]
Platform : xilinx_u50_gen3x16_xdma_base_5
SC Version : 5.2.20
Platform ID : 44654095-25B4-C06A-EC6D-0B479D3FEBE8
-------------------------------------------------------------------------------
Test 1 [0000:01:00.1] : pcie-link
Test Status : [PASSED]
-------------------------------------------------------------------------------
Test 2 [0000:01:00.1] : sc-version
Test Status : [PASSED]
-------------------------------------------------------------------------------
Test 3 [0000:01:00.1] : verify
Test Status : [PASSED]
-------------------------------------------------------------------------------
Test 4 [0000:01:00.1] : dma
Details : Buffer size - '16 MB'
Host -> PCIe -> FPGA write bandwidth = 9931.7 MB/s
Host <- PCIe <- FPGA read bandwidth = 11729.1 MB/s
Buffer size - '16 MB'
Host -> PCIe -> FPGA write bandwidth = 9916.3 MB/s
Host <- PCIe <- FPGA read bandwidth = 11549.2 MB/s
Buffer size - '16 MB'
Host -> PCIe -> FPGA write bandwidth = 9934.4 MB/s
Host <- PCIe <- FPGA read bandwidth = 11912.0 MB/s
Buffer size - '16 MB'
Host -> PCIe -> FPGA write bandwidth = 9924.8 MB/s
Host <- PCIe <- FPGA read bandwidth = 11689.5 MB/s
Buffer size - '16 MB'
Host -> PCIe -> FPGA write bandwidth = 9932.9 MB/s
Host <- PCIe <- FPGA read bandwidth = 11697.0 MB/s
Buffer size - '16 MB'
Host -> PCIe -> FPGA write bandwidth = 9814.4 MB/s
Host <- PCIe <- FPGA read bandwidth = 11690.6 MB/s
Buffer size - '16 MB'
Host -> PCIe -> FPGA write bandwidth = 9955.7 MB/s
Host <- PCIe <- FPGA read bandwidth = 11657.0 MB/s
Buffer size - '16 MB'
Host -> PCIe -> FPGA write bandwidth = 9941.0 MB/s
Host <- PCIe <- FPGA read bandwidth = 11741.0 MB/s
Buffer size - '16 MB'
Host -> PCIe -> FPGA write bandwidth = 9959.5 MB/s
Host <- PCIe <- FPGA read bandwidth = 12017.1 MB/s
Buffer size - '16 MB'
Host -> PCIe -> FPGA write bandwidth = 9926.7 MB/s
Host <- PCIe <- FPGA read bandwidth = 11597.4 MB/s
Buffer size - '16 MB'
Host -> PCIe -> FPGA write bandwidth = 9898.3 MB/s
Host <- PCIe <- FPGA read bandwidth = 11968.8 MB/s
Buffer size - '16 MB'
Host -> PCIe -> FPGA write bandwidth = 9922.9 MB/s
Host <- PCIe <- FPGA read bandwidth = 11631.1 MB/s
Buffer size - '16 MB'
Host -> PCIe -> FPGA write bandwidth = 9919.8 MB/s
Host <- PCIe <- FPGA read bandwidth = 11734.5 MB/s
Buffer size - '16 MB'
Host -> PCIe -> FPGA write bandwidth = 9919.0 MB/s
Host <- PCIe <- FPGA read bandwidth = 11721.1 MB/s
Buffer size - '16 MB'
Host -> PCIe -> FPGA write bandwidth = 9898.7 MB/s
Host <- PCIe <- FPGA read bandwidth = 11553.9 MB/s
Buffer size - '16 MB'
Host -> PCIe -> FPGA write bandwidth = 9889.5 MB/s
Host <- PCIe <- FPGA read bandwidth = 11536.7 MB/s
Buffer size - '16 MB'
Host -> PCIe -> FPGA write bandwidth = 9883.0 MB/s
Host <- PCIe <- FPGA read bandwidth = 11792.9 MB/s
Buffer size - '16 MB'
Host -> PCIe -> FPGA write bandwidth = 9971.2 MB/s
Host <- PCIe <- FPGA read bandwidth = 11595.3 MB/s
Buffer size - '16 MB'
Host -> PCIe -> FPGA write bandwidth = 9895.2 MB/s
Host <- PCIe <- FPGA read bandwidth = 11645.4 MB/s
Buffer size - '16 MB'
Host -> PCIe -> FPGA write bandwidth = 9976.6 MB/s
Host <- PCIe <- FPGA read bandwidth = 12018.8 MB/s
Buffer size - '16 MB'
Host -> PCIe -> FPGA write bandwidth = 9675.7 MB/s
Host <- PCIe <- FPGA read bandwidth = 11809.8 MB/s
Buffer size - '16 MB'
Host -> PCIe -> FPGA write bandwidth = 9671.0 MB/s
Host <- PCIe <- FPGA read bandwidth = 11753.4 MB/s
Buffer size - '16 MB'
Host -> PCIe -> FPGA write bandwidth = 9720.9 MB/s
Host <- PCIe <- FPGA read bandwidth = 11753.4 MB/s
Buffer size - '16 MB'
Host -> PCIe -> FPGA write bandwidth = 9711.3 MB/s
Host <- PCIe <- FPGA read bandwidth = 11762.5 MB/s
Buffer size - '16 MB'
Host -> PCIe -> FPGA write bandwidth = 9879.2 MB/s
Host <- PCIe <- FPGA read bandwidth = 11759.3 MB/s
Buffer size - '16 MB'
Host -> PCIe -> FPGA write bandwidth = 9684.5 MB/s
Host <- PCIe <- FPGA read bandwidth = 11725.9 MB/s
Buffer size - '16 MB'
Host -> PCIe -> FPGA write bandwidth = 9885.3 MB/s
Host <- PCIe <- FPGA read bandwidth = 11734.0 MB/s
Buffer size - '16 MB'
Host -> PCIe -> FPGA write bandwidth = 9673.9 MB/s
Host <- PCIe <- FPGA read bandwidth = 11716.8 MB/s
Buffer size - '16 MB'
Host -> PCIe -> FPGA write bandwidth = 9669.9 MB/s
Host <- PCIe <- FPGA read bandwidth = 11815.7 MB/s
Buffer size - '16 MB'
Host -> PCIe -> FPGA write bandwidth = 9925.2 MB/s
Host <- PCIe <- FPGA read bandwidth = 11781.5 MB/s
Buffer size - '16 MB'
Host -> PCIe -> FPGA write bandwidth = 9904.8 MB/s
Host <- PCIe <- FPGA read bandwidth = 11914.7 MB/s
Buffer size - '16 MB'
Host -> PCIe -> FPGA write bandwidth = 9709.1 MB/s
Host <- PCIe <- FPGA read bandwidth = 11724.8 MB/s
Test Status : [PASSED]
-------------------------------------------------------------------------------
Test 5 [0000:01:00.1] : iops
Details : IOPS: 563057 (verify)
Test Status : [PASSED]
-------------------------------------------------------------------------------
Test 6 [0000:01:00.1] : mem-bw
Details : Throughput (Type: HBM) (Bank count: 1) : 12383.5MB/s
Test Status : [PASSED]
-------------------------------------------------------------------------------
Test 7 [0000:01:00.1] : p2p
Test 8 [0000:01:00.1] : vcu
Test 9 [0000:01:00.1] : aie-pl
Validation completed. Please run the command '--verbose' option for more details
xbmgmtコマンドでデバイスが見つからないとき
以前に異なるバージョンでAlveoカードを使っていて、改めて別のマシンにセットアップする場合など、新たな環境にインストールしたXRTや運用プラットフォームパッケージのバージョンとAlveoに書き込み済みのファームウェアバージョンが異なるとxbmgmt examine
でデバイスが見られない状態になる。その場合は、XRT/運用プラットフォームをダウングレードするのもよいが、現在のOSバージョンに対応していない場合もある。別の方法としてAlveoのファームウェアを工場出荷状態に戻す方法がある。今回、U200でその問題が発生したので試してみた。71757 - Alveo Data Center Accelerator Card - Reverting Card to Factory imageのMethod 2: Revert Card via Vivado Hardware Managerを試し、再度xbmgmt examine
コマンドを試すとデバイスとして認識された。手順としては、VivadoがインストールされているマシンとAlveoをMicro-USBケーブルで繋ぎ、ゴールデンマスターのMCSファイル(ROM向けの回路情報ファイル)をVivadoのハードウェアマネージャからプログラムすると完了。
Vitis Tutorialを動かす
Vitis Tutorialのベクトル加算がテーマのチュートリアルをU200上で動かしてみた。手順に従い、実環境でホストマシンとAlveoカードが通信して演算を行うことができた。