FPGAの部屋

FPGAやCPLDの話題やFPGA用のツールの話題などです。 マニアックです。 日記も書きます。

FPGAの部屋の有用と思われるコンテンツのまとめサイトを作りました。ご利用ください。 http://marsee101.web.fc2.com/index.html

カテゴリ: Alveo

ACRiルームの Alveo U50 で Emulation-SW と Emulation-HW を試す1”の続き。

Assistant ウインドウをすべて展開した。
Emulation-SW, Emulation-HW 共に、vadd-Default の下に Run Summary があるのが分かる。
31b60d81.png


Emulation-SW -> vadd-Default -> Run Summary (xclbin) を右クリックし、右クリックメニューから Open in Vitis Analyzer を選択した。
afc5e4c4.png


Run Summary ウインドウが表示された。
457644ad.png


Profile Summary を示す。
70f5dc38.png


Application Timeline を示す。
972f65ba.png


波形がある部分を拡大した。
6399c700.png


更に拡大した。
adec4890.png


次に、Emulation-HW -> vadd-Default -> Run Summary (binary_container_1.xclbin) を右クリックし、右クリックメニューから Open in Vitis Analyzer を選択した。
e6ee33e8.png


Run Summary ウインドウが表示された。
0bd3bf8d.png


System Diagram を示す。
f677d146.png


Platform Diagram を示す。
a55efe7c.png


Run Guidance の一部を示す。
c49a370d.png


Profile Summary を示す。
5398a47f.png


Application Timeline を示す。
973a2ca2.png


拡大した。
4f39f86c.png

今までは Ultra96V2 の自作の Vitis アクセラレーション・プラットフォームを使ってきたので、QEMU が設定されていなかった。よって、 Emulation-SW と Emulation-HW を試したことが無かった。今回は、ACRiルームの Alveo U50 を使用するので、 Emulation-SW と Emulation-HW を試してみたい。

ACRiルームの Alveo U50 で ChipScope Debug を試す2”で vadd に wait_for_enter() 関数を追加したが、それをコメントアウトした。
vadd の Emulation-SW をビルドした。
下の図に Emulation-SW をビルドしようと、Assistant ウインドウで Emulation-SW を右クリックし、右クリックメニューから Build を選択した様子を示す。
dc9a5121.png


Emulation-SW のビルドはすぐに終わったが、Emulation-HW のビルドは Hardware と同様に遅かった。

さて、実行してみよう。まずは、 Emulation-SW から実行してみよう。
Assistant ウインドウで Emulation-SW を右クリックし、右クリックメニューから vadd-Default を選択した。
43648a30.png


TEST PASSED が表示された。実行時間は短い。
ログを示す。

[Console output redirected to file:/home/u_marsee101/Vitis_Work/U50/2019.2/vadd/Emulation-SW/vadd-Default.launch.log]
Loading: '../binary_container_1.xclbin'
TEST PASSED



次に、 Emulation-HW をやってみる。
Assistant ウインドウで Emulation-SW を右クリックし、右クリックメニューから Build を選択してビルド成功した。
87705142.png


Assistant ウインドウで Emulation-HW を右クリックし、右クリックメニューから vadd-Default を選択した。
TEST PASSED が表示された。実行時間はEmulation-SW よりも長い。
4c6e0b04.png


ログを示す。

[Console output redirected to file:/home/u_marsee101/Vitis_Work/U50/2019.2/vadd/Emulation-HW/vadd-Default.launch.log]
Loading: '../binary_container_1.xclbin'
INFO: [HW-EM 01] Hardware emulation runs simulation underneath. Using a large data set will result in long simulation times. It is recommended that a small dataset is used for faster execution. The flow uses approximate models for DDR memory and interconnect and hence the performance data generated is approximate.
TEST PASSED
INFO: [HW-EM 06-0] Waiting for the simulator process to exit
INFO: [HW-EM 06-1] All the simulator processes exited successfully



vadd/Emulation-SW ディレクトリを示す。
35d3b559.png


vadd/Emulation-HW ディレクトリを示す。
16c643f5.png

ACRiルームの Alveo U50 で ChipScope Debug を試す1”の続き。

前回は、”Vitis 2020.1 でカーネルの ChipScope Debug をやってみた”で試した ChipScope Debug を ACRi ルームの Alveo U50 でもうまく行くかどうか?を確かめたかったということで、”Vitis 2020.1 でカーネルの ChipScope Debug をやってみた”と同様にやってみたが、Alveo U50 が JTAG で接続されていないようだった。今回は、”Debugging Your Applications on an Alveo Data Center Accelerator Card Using ChipScope”を見つけたので、それを参照してやってみよう。

参照するのは、、”Debugging Your Applications on an Alveo Data Center Accelerator Card Using ChipScope”と
日本語では、”Vitis 統合ソフトウェア開発プラットフォーム 2020.1 の XVC およびハードウェア サーバーの実行”だ。

Debugging Your Applications on an Alveo Data Center Accelerator Card Using ChipScope”によると、デバックモードで途中でブレークポイントを作成して、ソフトウェアを停止するようになっているが、ACRiルームのAlveo U50 でデバックモードにすると、ソースコード・デバックが行えずに、なぜかDisassemble に落ちてしまう。
5f4cc25d.png


そこで、”Vitis 統合ソフトウェア開発プラットフォーム 2020.1 の カーネル開始前に ILA トリガーを追加”を参照して、wait_for_enter() 関数を追加した。
036fe39c.png


vadd アクセラレーション・アプリケーションを実行すると、wait_for_enter() 関数が実行されて、”Press ENTER to continue after setting up ILA trigger...”で停止した。
0576dae4.png


停止後に、、”Debugging Your Applications on an Alveo Data Center Accelerator Card Using ChipScope”によると、
debug_hw --xvc_pcie /dev/xvc_pub. --hw_server
を実行するということなので、
ls /dev
で見たところ、xvc_pri.m0 があったので、それではないだろうか?
6211d236.png


そこで、
debug_hw --xvc_pcie /dev/xvc_pri.m0 --hw_server
を実行した。
035eb504.png


ところが、エラーになってしまった。

u_marsee101@as004:~$ debug_hw --xvc_pcie /dev/xvc_pri.m0 --hw_server
launching xvc_pcie...
/tools/Xilinx/Vivado/2019.2/bin/xvc_pcie -d /dev/xvc_pri.m0 -s TCP::10200
launching hw_server...
/tools/Xilinx/Vivado/2019.2/bin/hw_server -sTCP::3121

****************************
*** Press Ctrl-C to exit ***
****************************

ERROR: xvc_pcie process terminated with error code 2.


このエラーを検索すると、”Can't run debug_hw”が見つかった。
この資料によると、”この問題はまもなくリリースされる新しいXRTで対処されます。”とのことでした。。。 orz...

ちなみに
xbutil scan
の結果を示す。
88822e4b.png

u_marsee101@as004:~$ xbutil scan
INFO: Found total 1 card(s), 1 are usable
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
System Configuration
OS name:    Linux
Release:    3.10.0-957.27.2.el7.x86_64
Version:    #1 SMP Mon Jul 29 17:46:05 UTC 2019
Machine:    x86_64
Model:      To Be Filled By O.E.M.
CPU cores:  16
Memory:     128432 MB
Glibc:      2.27
Distribution:   Ubuntu 18.04.4 LTS
Now:        Fri Nov 13 04:34:39 2020
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
XRT Information
Version:    2.6.655
Git Hash:   2d6bfe4ce91051d4e5b499d38fc493586dd4859a
Git Branch: 2020.1
Build Date: 2020-05-22 12:05:03
XOCL:       2.6.655,2d6bfe4ce91051d4e5b499d38fc493586dd4859a
XCLMGMT:    2.6.655,2d6bfe4ce91051d4e5b499d38fc493586dd4859a
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 [0] 0000:01:00.1 xilinx_u50_gen3x16_xdma_201920_3 user(inst=129)
WARNING: Kernel verison 3.10.0-957.27.2.el7.x86_64 is not officially supported. 5.3.0 is the latest supported version


XRTのバージョンの 2.6.655 は”Can't run debug_hw”と同じだった。残念。。。

最後に Vitis IDE で Enter キーを押すと、TEST PASSED が表示された。
79482577.png

久しぶりに ACRi ルームの Alveo U50 を使ってみることにした。”Vitis 2020.1 でカーネルの ChipScope Debug をやってみた”で試した ChipScope Debug を ACRi ルームの Alveo U50 でもうまく行くかどうか?を確かめたかったからだ。

まずは、”ACRi ルームへようこそ!”のページから Alveo U50 の予約を取った。今回は、予約時間が過ぎていても予約取れるようになっていて、とっても便利になっている。とても良い。。。

ACRi ルームの Alveo U50 を使ってみた1(Vector Addition の実行)”を参照しながら、Tera Term を立ち上げて gw.acri.c.titech.ac.jp に接続し、リモートデスクトップ接続を立ち上げて、as004 に入れた。久しぶりなので、ドキドキした。接続できてよかった。。。

Activities をクリックして、ファイル・ブラウザとターミナルを起動した。

ターミナルで、XRT と Vitis 2019.2 の環境を設定し、Vitis を起動した。
source /opt/xilinx/xrt/setup.sh
source /tools/Xilinx/Vitis/2019.2/settings64.sh
vitis

47d49d53.png


Vitis 2019.2 の Assistant ウインドウの vadd_system を右クリックし、右クリックメニューから Settings... を選択する。
e2563f11.png


System Project Settings ダイアログが開く。
vadd_system -> vadd -> Hardware -> binary container_1 -> krnl_vadd をクリックする。
bbd88c71.png


krnl_vadd の ChipScope Debug のチェックボックスをクリックすると、すべての ChipScope Debug チェックボックスにチェックが入る。
fc5d4159.png


Apply ボタンをクリックしてから Apply and Clod ボタンをクリックする。

Vitis 2019.2 の Assistant ウインドウの vadd_system -> Hardware を右クリックし、右クリックメニューから Build を選択してビルドする。
369b5532.png


ビルドしているところだ。
37e37bba.png


ビルドが成功した。
8eb89f22.png


Assistant ウインドウの vadd_system -> vadd -> Hardware -> binary container_1 を右クリックし、右クリックメニューから Open Vivado Project を選択する。
b9612eff.png


Vivado 2019.2 が起動した。
d4298337.png


Assistant ウインドウの vadd_system -> vadd -> Hardware を右クリックし、右クリックメニューから Run -> vadd-Default (OpenCL Application) を選択する。
7f9fd105.png


TEST PASSED した。
9f5b367c.png


Vivado で PROGRAM AND DEBUG -> Open Hardware Manager -> Open Target をクリックして、Auto Connect を選択したが、Vivado Analyzer 画面は表示されなかった。やはり、JTAG では接続されていないようだ。
ff0be26f.png

ACRi ルームの Alveo U50 を使ってみた3(ラプラシアンフィルタ)”の続き。

前回は、ACRi ルームの Alveo U50 を使用して、ラプラシアンフィルタを実装して動作させることができた。今回は、CNN を ACRi ルームの Alveo U50 で動作させてみよう。

今回実装する CNN は横 56 ピクセル x 10 行の画像から白線を検出して、右に行くか、直進するか左に行くの 3 出力を出力する CNN だ。これは、以前 Ultra96 ボードでカーネルを RTL カーネルとして使用したプロジェクトをそのまま使用している。つまり、Vivao HLS で作成した XO ファイルをVitis プロジェクトでカーネルとして使用しているわけだ。詳しくは、”テンプレートで書いた畳み込みニューラルネットワークをRTLカーネルとしてVitisで実装する5(Vitis 編)”辺りを参照して欲しい。

なお、余談になるが、今回のブログに書くに当たって、デバックしている途中で、ソースコードのバグも発見した。それは、任意精度固定データ型の量子化モードとオーバーフローモードが2番めの全結合層の重みとバイアスで関数の定義と違っていたことだ。Ultra96用のプロジェクトではこれでも通ってしまったようだが、今回の Alveo U50 ではエラーになった。

以前のUltra96 ボードでカーネルを RTL カーネルとして使用した Vivado HLS プロジェクトは”テンプレートで書いた畳み込みニューラルネットワークをRTLカーネルとしてVitisで実装する1(Vivado HLS 編 1)”を参照して欲しい。

さて、ACRi ルームの Alveo U50 が搭載されたマシンにログインして、進めていこう。この辺りの手順は”ACRi ルームの Alveo U50 を使ってみた1(Vector Addition の実行)”を参照して欲しい。

まずは、リモートデスクトップ接続した状態で、XRT の環境を設定する。
source /opt/xilinx/xrt/setup.sh

Vitis 2019.2 の環境を設定する。
source /tools/Xilinx/Vitis/2019.2/settings64.sh

ACRi ルームの Alveo U50 を使ってみた1(Vector Addition の実行)”のVivado HLS プロジェクトを ACRi ルームのファイルサーバーに SFTP でアップロードした。

Vivado HLS で新しいSolution を作成し、FPGA の型番を xcvu35p-fsvh2014-2-e に設定した。( IDA さん、教えていただいて、ありがとうございます)
C コードの合成をしたところ成功した。なお、動作周波数は 300 MHz とした。
3aa3a550.png

f67c6a99.png


すごい。。。ほとんどリソース消費していない。これだと、だいぶ大きな CNN でもいけるんじゃないだろうか?楽しみだ。マシンの性能も不安が無いし、とっても心強い。

Export RTL を行うと、all_layers_dnn.xo ファイルが生成された。
566392cf.png


all_layers_dnn.xo ファイルをカーネルに指定した Vitis 2019.2 のプロジェクトを作成した。やはり、vector addition のテンプレートを使用しないと実行時に失敗するので、使用した。もうビルドまで終了している。
ba0308bd.png


Vitis 2019.2 のプロジェクト all_layers_template2/src ディレクトリの中身を示す。
49988a6c.png


Run Configuration を作成した。なお、[Run Configurations] ウィンドウで [Environment] タブに移動し、テーブルに設定されている LD_LIBRARY_PATH 変数を削除してある。
0cf6e6b0.png


実行したところ、成功した。
8e377cd7.png


ログを示す。

[Console output redirected to file:/home/u_marsee101/Vitis_Work/U50/2019.2/all_layers_template2/Hardware/all_layers_template2-Default.launch.log]
Using FPGA binary file specfied through the command line: ../binary_container_1.xclbin
Found Platform
Platform Name: Xilinx
Loading: '../binary_container_1.xclbin'
hw_error: i = 0 output = 0 t_test_num = 1
dot2[0] = 0.00000000 dot2_soft[0] = -6.89110470
dot2[1] = 0.00000000 dot2_soft[1] = 3.03815722
dot2[2] = 0.00000000 dot2_soft[2] = -3.19690108

hw_error: i = 25 output = 2 t_test_num = 1
sw_error: i = 25 output_soft = 2 t_test_num = 1
dot2[0] = 0.25000000 dot2_soft[0] = -3.77501726
dot2[1] = 0.12500000 dot2_soft[1] = -0.13269189
dot2[2] = 0.25000000 dot2_soft[2] = 1.61074853

hw_error: i = 30 output = 2 t_test_num = 1
sw_error: i = 30 output_soft = 2 t_test_num = 1
dot2[0] = 0.43750000 dot2_soft[0] = -4.67336369
dot2[1] = 0.40625000 dot2_soft[1] = 0.12951475
dot2[2] = 0.43750000 dot2_soft[2] = 1.71587336

sw_error: i = 31 output_soft = 2 t_test_num = 1
dot2[0] = -0.25000000 dot2_soft[0] = -5.31440449
dot2[1] = 0.90625000 dot2_soft[1] = 0.69655895
dot2[2] = -0.25000000 dot2_soft[2] = 1.00723171

sw_error: i = 35 output_soft = 2 t_test_num = 1
dot2[0] = 0.43750000 dot2_soft[0] = -5.15462875
dot2[1] = 0.50000000 dot2_soft[1] = 0.19586089
dot2[2] = 0.43750000 dot2_soft[2] = 1.79063916

sw_error: i = 36 output_soft = 2 t_test_num = 1
dot2[0] = -0.25000000 dot2_soft[0] = -5.64889669
dot2[1] = 1.03125000 dot2_soft[1] = 0.69646239
dot2[2] = -0.25000000 dot2_soft[2] = 1.09402716

sw_error: i = 40 output_soft = 2 t_test_num = 1
dot2[0] = 0.09375000 dot2_soft[0] = -5.31394196
dot2[1] = 0.59375000 dot2_soft[1] = 0.30034199
dot2[2] = 0.09375000 dot2_soft[2] = 1.52586949

sw_error: i = 41 output_soft = 2 t_test_num = 1
dot2[0] = 0.06250000 dot2_soft[0] = -5.94443941
dot2[1] = 0.87500000 dot2_soft[1] = 0.61903512
dot2[2] = 0.06250000 dot2_soft[2] = 1.28180122

sw_error: i = 42 output_soft = 2 t_test_num = 1
dot2[0] = 0.37500000 dot2_soft[0] = -7.44187164
dot2[1] = 1.31250000 dot2_soft[1] = 1.10615981
dot2[2] = 0.37500000 dot2_soft[2] = 1.35738707

sw_error: i = 45 output_soft = 2 t_test_num = 1
dot2[0] = 0.18750000 dot2_soft[0] = -5.92508411
dot2[1] = 0.68750000 dot2_soft[1] = 0.44851223
dot2[2] = 0.18750000 dot2_soft[2] = 1.43742454

sw_error: i = 46 output_soft = 2 t_test_num = 1
dot2[0] = 0.90625000 dot2_soft[0] = -7.76649952
dot2[1] = 1.06250000 dot2_soft[1] = 0.82863915
dot2[2] = 0.90625000 dot2_soft[2] = 1.88942850

sw_error: i = 47 output_soft = 2 t_test_num = 1
dot2[0] = 0.75000000 dot2_soft[0] = -9.50911713
dot2[1] = 1.75000000 dot2_soft[1] = 1.48399019
dot2[2] = 0.75000000 dot2_soft[2] = 1.85759318

hw_error: i = 75 output = 2 t_test_num = 1
sw_error: i = 75 output_soft = 2 t_test_num = 1
dot2[0] = 2.12500000 dot2_soft[0] = -4.04238653
dot2[1] = -1.03125000 dot2_soft[1] = -1.22402656
dot2[2] = 2.12500000 dot2_soft[2] = 3.36929369

hw_error: i = 76 output = 2 t_test_num = 1
sw_error: i = 76 output_soft = 2 t_test_num = 1
dot2[0] = 0.40625000 dot2_soft[0] = -4.09871578
dot2[1] = -0.21875000 dot2_soft[1] = -0.46985394
dot2[2] = 0.40625000 dot2_soft[2] = 1.61257589

hw_error: i = 80 output = 2 t_test_num = 1
sw_error: i = 80 output_soft = 2 t_test_num = 1
dot2[0] = 1.78125000 dot2_soft[0] = -4.33292818
dot2[1] = -0.75000000 dot2_soft[1] = -0.96692348
dot2[2] = 1.78125000 dot2_soft[2] = 2.98383069

hw_error: i = 81 output = 2 t_test_num = 1
sw_error: i = 81 output_soft = 2 t_test_num = 1
dot2[0] = 0.09375000 dot2_soft[0] = -4.40864801
dot2[1] = 0.06250000 dot2_soft[1] = -0.15780880
dot2[2] = 0.09375000 dot2_soft[2] = 1.26864278

hw_error: i = 85 output = 2 t_test_num = 1
sw_error: i = 85 output_soft = 2 t_test_num = 1
dot2[0] = 1.21875000 dot2_soft[0] = -4.16326904
dot2[1] = -0.59375000 dot2_soft[1] = -0.84592772
dot2[2] = 1.21875000 dot2_soft[2] = 2.42255425

sw_error: i = 86 output_soft = 2 t_test_num = 1
dot2[0] = -0.28125000 dot2_soft[0] = -4.36515617
dot2[1] = 0.09375000 dot2_soft[1] = -0.08813666
dot2[2] = -0.28125000 dot2_soft[2] = 0.97706115

hw_error: i = 90 output = 2 t_test_num = 1
sw_error: i = 90 output_soft = 2 t_test_num = 1
dot2[0] = 0.46875000 dot2_soft[0] = -4.02276182
dot2[1] = -0.53125000 dot2_soft[1] = -0.66237617
dot2[2] = 0.46875000 dot2_soft[2] = 1.72938108

sw_error: i = 91 output_soft = 2 t_test_num = 1
dot2[0] = -0.78125000 dot2_soft[0] = -3.85103607
dot2[1] = 0.15625000 dot2_soft[1] = -0.09844255
dot2[2] = -0.78125000 dot2_soft[2] = 0.42963967

sw_error: i = 95 output_soft = 2 t_test_num = 1
dot2[0] = -0.43750000 dot2_soft[0] = -4.07760668
dot2[1] = -0.03125000 dot2_soft[1] = -0.30057180
dot2[2] = -0.43750000 dot2_soft[2] = 0.90393031

hw_err_cnt = 9 sw_err_cnt = 20


↑このページのトップヘ