2022年最終日!今年はARMプロセッサと一体のFPGAボード(SoC FPGA)を中心に使っていたが、卒業論文や学会発表が終わり次第、Alveoカードを中心に使うことになりそうなので開発環境をセットアップした。そのときのメモを残しておく。基本的にUG1301UG1370を参考にセットアップした。 Alveo U200とU50

セットアップ環境

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 U200とU50のパッケージ

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 imageMethod 2: Revert Card via Vivado Hardware Managerを試し、再度xbmgmt examineコマンドを試すとデバイスとして認識された。手順としては、VivadoがインストールされているマシンとAlveoをMicro-USBケーブルで繋ぎ、ゴールデンマスターのMCSファイル(ROM向けの回路情報ファイル)をVivadoのハードウェアマネージャからプログラムすると完了。

Vitis Tutorialを動かす

Vitis Tutorialベクトル加算がテーマのチュートリアルをU200上で動かしてみた。手順に従い、実環境でホストマシンとAlveoカードが通信して演算を行うことができた。

ベクトル加算のシステムダイアグラム ホストマシン上のプログラムによりAlveo上の回路を制御する