Kria Robotics Stack(ROS2をFPGAで動かす)
はじめに
前回動かしてみたvadd_publisher
について、今回はもう少し詳しく見ていこうと思います。
colcon について
colcon
はソフトウェアパッケージのセットをビルドするためのコマンドラインツールになります。ROS2パッケージをビルドする際にもcolcon
が使われます。
Kria Robotics Stack(KRS)では、FPGAハードウェアアクセラレーションフローをROS2 CLIツールに統合し、それを管理するためにcolcon acceleration
のビルドツール拡張がなされています。
select
select
はFPGAアクセラレーションのファームウエアを選択するコマンドになります。
colcon acceleration select kv260
選択されるファームウエアはcolcon build --merge-install
で生成されたkrs_ws/acceleration/firmware/kv260
ディレクトリ内にあります。
list
select
で選択されているファームウエアを確認するコマンドになります。
以下の例ではkv260のファームウエアが選択されていることを示しています。
colcon acceleration list
kv260*
ここではkv260
の1種類しかファームウエアがありませんが、他のデバイスや異なるバージョンなど複数のファームウエアの管理・選択ができるようになります。
linux
ファームウェアによって生成されたSDカードのRAWイメージに、Linuxカーネル(イメージファイル、ブートスクリプト、デバイスツリーなど)を設定して、sd_card.imgファイルにまとめます。
colcon acceleration linux vanilla --install-dir install-kv260
doublevadd_publisher をCPUで動かす
前回vadd_publisher
を試し、10Hzでループ動作することを確認しました。
次はdoublevadd_publisher
で試してみます。
こちらのコードは以下に示す通り2重ループ構造を取り、vadd_publisherと比較して演算量が増えていることが確認できます。
#define DATA_SIZE 4096
// TRIPCOUNT identifier
const int c_size = DATA_SIZE;
extern "C" {
void vadd(
const unsigned int *in1, // Read-Only Vector 1
const unsigned int *in2, // Read-Only Vector 2
unsigned int *out, // Output Result
int size // Size in integer
)
{
for (int j = 0; j < size; ++j) { // stupidly iterate over
// it to generate load
#pragma HLS loop_tripcount min = c_size max = c_size
for (int i = 0; i < size; ++i) {
#pragma HLS loop_tripcount min = c_size max = c_size
out[i] = in1[i] + in2[i];
}
}
}
}
[補足] #pragma HLS loop_tripcount
はFPGA高位合成のプラグマで、ループ反復回数が変数で不定だとコンパイラが最適化できないので、明示的に最大値を指定してあげる事で最適化度合を判断させるために必要。
こちらを前回と同じ手順でビルドしてKV260で動かしてみます。
# 設定
cd ~/krs_ws
source /tools/Xilinx/Vitis/2021.2/settings64.sh
source /opt/ros/rolling/setup.bash
source install/setup.bash
colcon build --merge-install
colcon acceleration select kv260
# ビルド
colcon build --build-base=build-kv260 --install-base=install-kv260 --merge-install --mixin kv260 --packages-select ament_vitis ament_acceleration doublevadd_publisher tracetools_acceleration adaptive_component vitis_common
# SDカードイメージ作成
colcon acceleration linux vanilla --install-dir install-kv260
Etcherを立ち上げて~/krs_ws/acceleration/firmware/kv260/sd_card.img
をSDカードに書き込みます。SDカードをKV260に差し込み、USB/UART/JTAG FTDIアダプターを介してKV260評価ボードとコンピューターを接続し、電源を入れます。
PetaLinuxにログインして、
PetaLinux 2021.2 xilinx-k26-som-2021_2 ttyPS1
xilinx-k26-som-2021_2 login: petalinux
You are required to change your password immediately (administrator enforced)
New password:
Retype new password:
doublevadd_publisher
プログラムを起動します。
source /usr/bin/ros_setup.bash
. /krs_ws/local_setup.bash
ros2 topic hz /vector --window 10 &
ros2 run doublevadd_publisher doublevadd_publisher
結果は以下の通りとなります。
vadd_publisher
はaverage_rate=10Hzで処理できていたのに対し、doublevadd_publisher
は演算量が増えているためもちろんaverage_rate=2.2Hzと遅くなっていることが分かります。
doublevadd_publisher をFPGAで動かす
doublevadd_publisher
をFPGAで動かしていきます。
サンプルコードは~/krs_ws/src/acceleration/acceleration_examples/nodes/offloaded_doublevadd_publisher
にあります。CMakeLists.txt
の以下のスクリプトのTYPE
の項目をhw
に設定することでFPGAアクセサレーションでビルドしてくれるみたいです。
# vadd kernel
vitis_acceleration_kernel(
NAME vadd_offloaded
FILE src/vadd.cpp
CONFIG src/kv260.cfg
INCLUDE
include
TYPE
# sw_emu
# hw_emu
hw
LINK
PACKAGE
)
今回ビルド時にバックグラウンドでHLSを動かしますが、IP生成時に問題が発生するために以下のページを参考にパッチを事前にあてておきます。
パッチをあてたらビルドしてみます。
# 設定
source /tools/Xilinx/Vitis/2021.2/settings64.sh
source /opt/ros/rolling/setup.bash
export PATH="/usr/bin":$PATH
colcon build --merge-install
source install/setup.bash
colcon acceleration select kv260
# ビルド
colcon build --build-base=build-kv260 --install-base=install-kv260 --merge-install --mixin kv260 --packages-select ament_acceleration ament_vitis vitis_common ros2acceleration offloaded_doublevadd_publisher
そうするとHLS合成でエラーが出ます。エラー内容を確認します。
more ~/krs_ws/build-kv260/offloaded_doublevadd_publisher/v++_vadd_offloaded.log
・・・
****** vpl v2021.2 (64-bit)
**** SW Build 3363252 on 2021-10-14-04:41:01
** Copyright 1986-2020 Xilinx, Inc. All Rights Reserved.
INFO: [VPL 60-839] Read in kernel information from file '/home/kino/krs_ws/build-kv260/offloaded_doublevadd_publisher/_x/link/int/kernel_
info.dat'.
INFO: [VPL 60-423] Target device: kv260_custom_platform
INFO: [VPL 60-1032] Extracting hardware platform to /home/kino/krs_ws/build-kv260/offloaded_doublevadd_publisher/_x/link/vivado/vpl/.loca
l/hw_platform
[01:01:30] Run vpl: Step create_project: Started
Creating Vivado project.
[01:01:33] Run vpl: Step create_project: Failed
[01:01:33] Run vpl: FINISHED. Run Status: create_project ERROR
ERROR: [VPL 60-773] In '/home/kino/krs_ws/build-kv260/offloaded_doublevadd_publisher/_x/link/vivado/vpl/vivado.log', caught Tcl error: E
RROR: [Board 49-71] The board_part definition was not found for xilinx.com:k26c:part0:1.1. The project's board_part property was not set,
but the project's part property was set to xck26-sfvc784-2LV-c. Valid board_part values can be retrieved with the 'get_board_parts' Tcl
command. Check if board.repoPaths parameter is set and the board_part is installed from the tcl app store.
ERROR: [VPL 60-704] Integration error, Failed to rebuild a project required for hardware synthesis. The project is 'prj'. The rebuild scr
ipt is '.local/hw_platform/prj/rebuild.tcl'. The rebuild script was delivered as part of the hardware platform. Consult with the hardware
platform provider to investigate the rebuild script contents. An error stack with function names and arguments may be available in the '
vivado.log'.
ERROR: [VPL 60-1328] Vpl run 'vpl' failed
・・・
見るとboard_part definition was not found for xilinx.com:k26c:part0:1.1.
とあり、ボードファイルが無い事が原因のようです。
Githubからボードファイルをダウンロードしてきます。ただし今回必要なのはk26c/1.1
のボードファイルであり、リビジョン2021.1にしか無いので、こちらからダウンロードしてみます。
ダウンロード完了したら、k26c
とsom240
のボードファイルをVivadoのボードファイルディレクトリにコピーします。
unzip XilinxBoardStore-2021.1.zip
sudo cp -r ./XilinxBoardStore-2021.1/boards/Xilinx/k26c/1.1 /tools/Xilinx/Vivado/2021.2/data/xhub/boards/XilinxBoardStore/boards/Xilinx/k26c/
sudo cp -r ./XilinxBoardStore-2021.1/boards/Xilinx/som240 /tools/Xilinx/Vivado/2021.2/data/xhub/boards/XilinxBoardStore/boards/Xilinx/
この状態でもう一度ビルドをしてみます。そうするとビルドが成功します。
colcon build --build-base=build-kv260 --install-base=install-kv260 --merge-install --mixin kv260 --packages-select ament_acceleration ament_vitis vitis_common ros2acceleration offloaded_doublevadd_publisher
・・・・
[Processing: offloaded_doublevadd_publisher]
[Processing: offloaded_doublevadd_publisher]
[Processing: offloaded_doublevadd_publisher]
[Processing: offloaded_doublevadd_publisher]
[Processing: offloaded_doublevadd_publisher]
[Processing: offloaded_doublevadd_publisher]
[Processing: offloaded_doublevadd_publisher]
[Processing: offloaded_doublevadd_publisher]
[Processing: offloaded_doublevadd_publisher]
[Processing: offloaded_doublevadd_publisher]
Finished <<< offloaded_doublevadd_publisher [11min 50s]
Summary: 5 packages finished [11min 52s]
BOOT.BINを生成し、SDカードイメージを作成します。
生成されたsd_card.imgをEtcherでSDカードに書き込みます。
cd ~/krs_ws/build-kv260/offloaded_doublevadd_publisher
bootgen -arch zynqmp -image vadd_offloaded.bif -o ./package/BOOT.BIN
cd ~/krs_ws
colcon acceleration linux vanilla --install-dir install-kv260
KV260にSDカードを挿して起動します。ターミナルソフトからdoublevadd_publisher
を実行します。offloaded_doublevadd_publisher
のMAIN関数で読み込むXCLBINファイル名がvadd.xclbin
に指定されていますが、実際にはvadd_offloaded.xclbin
という名前で生成されているので、vadd.xclbin
という名前でファイルのコピーを作っておきます。
sudo su
source /usr/bin/ros_setup.bash
. /krs_ws/local_setup.bash
ros2 acceleration stop; ros2 acceleration start
ros2 acceleration list
ros2 acceleration select offloaded_doublevadd_publisher
cd /krs_ws/lib/offloaded_doublevadd_publisher
cp vadd_offloaded.xclbin vadd.xclbin
ros2 topic hz /vector_acceleration --window 10 &
ros2 run offloaded_doublevadd_publisher offloaded_doublevadd_publisher
実行結果は以下の通りとなります。
今回はdoublevadd_publisher
をFPGAにオフロードして実行しました。
CPU処理するdoublevadd_publisher
のaverage_rate=2.2Hzに対し、doublevadd_publisher
ではのaverage_rate=2.115Hzと処理速度が低下する結果となります。
性能を出すためにはFPGA動作周波数アップや並列化の最適化が必要になってくるようです。
次回、そちらについて見ていきたいと思います。
Discussion