実践的!FPGA開発セミナー vol.9(2022/04/27)

3.2K Views

April 27, 22

スライド概要

フィックスターズならではの「FPGA」に関する高速化手法、 効率的な開発ノウハウ、苦労話などについてお話しいたします。

<講演内容>

1、AlveoでLinuxを動かす その3
第7回に引き続き、FPGAでRISC-V CPUコアを動かし、Linuxを動作させるまでのあれこれについてお話します。
前回は最終的にAlveo U50での動作が確認できませんでしたが、現在ではACRiルームのAlveo U50で動作を確認できています。
今回は、CPUコアのパフォーマンス測定と改善、およびSMPやネットワーク接続 (間に合えば) の話を予定しています。

2、Ubuntu on Zynq UltraScale+ MPSoC + Vitis で組込みシステム開発
2021年12月に、Canonical と Xilinx の提携により、Zynq UltraScale+ MPSoC 評価ボード用の公式 Ubuntu イメージが公開されました。
これにより、容易に Ubuntu の導入が可能となり、リッチなパッケージ群やデスクトップ環境を用いた柔軟なシステム開発を行うことができます。
本イメージは Vitis AI 向けの構成となっていますが、ユーザが作成したVitis アプリケーションを導入することもできます。
今回、本Ubuntu環境にて自作の Vitis アプリケーションを動作させることを試したので、その過程で得られたノウハウを紹介します。


・当社技術ブログ 記事: https://proc-cpuinfo.fixstars.com/

・フィックスターズグループ/セミナー一覧: https://www.fixstars.com/ja/seminar

・フィックスターズのFPGAシステム開発: https://www.fixstars.com/ja/services/fpga

profile-image

フィックスターズは、コンピュータの性能を最大限に引き出すソフトウェア開発のスペシャリストです。車載、産業機器、金融、医療など、幅広い分野での開発経験があります。また、ディープラーニングや機械学習などの最先端技術にも力を入れています。 並列化や最適化技術を駆使して、マルチコアCPU、GPU、FPGA、量子アニーリングマシンなど、さまざまなハードウェアでソフトウェアを高速化するサービスを提供しています。さらに、長年の経験から培ったハードウェアの知識と最適化ノウハウを活かし、高精度で高性能なアルゴリズムの開発も行っています。       ・開催セミナー一覧:https://www.fixstars.com/ja/seminar   ・技術ブログ :https://proc-cpuinfo.fixstars.com/

シェア

またはPlayer版

埋め込む »CMSなどでJSが使えない場合

関連スライド

各ページのテキスト
1.

Fixstars Corporation www.fixstars.com 実践的!FPGA開発セミナー vol.9 2022/04/27 18:00~ Copyright © Fixstars Group Copyright © Fixstars Group

2.

Fixstars Corporation www.fixstars.com Ubuntu on Zynq UltraScale+ MPSoC + Vitis で 組込みシステム開発 Copyright © Fixstars Group Copyright © Fixstars Group

3.

Fixstars Corporation www.fixstars.com Who I am 写真 Masayoshi MATSUMURA 松村 将嘉 ソリューション第一事業部 シニアエンジニア 3 Copyright © Fixstars Group

4.

Fixstars Corporation www.fixstars.com 本日の内容 ● Zynq UltraScale+ MPSoC 評価ボード用 公式Ubuntuイメージのご紹介 ○ Ubuntuを利用するメリット ○ Ubuntuイメージに含まれるデフォルトプラットフォーム ● カスタムプラットフォームの組み込み方法 ○ PAC(Platform Asset Container) Config の配置 ○ xlnx-config を用いたブートイメージの生成 ○ Zynq MPSoC のブートの流れと xlnx-config がやっていること ● 動作デモ 4 Copyright © Fixstars Group

5.

Fixstars Corporation www.fixstars.com Zynq UltraScale+ MPSoC 評価ボード用 公式Ubuntuイメージ ● イメージ配布/ドキュメント URL ○ https://ubuntu.com/download/xilinx ○ https://xilinx-wiki.atlassian.net/wiki/spaces/A/pa ges/1413611532/Canonical+Ubuntu ● Canonical と Xilinx の提携によるリリース ● 下記の評価ボード向けに提供 ○ ZCU102, ZCU104, ZCU106 ○ Kria KV260 ● FPGA開発向けサポート ○ ドライバ組み込み済み (XRT/zocl 2020.2) ○ カスタムプラットフォームの デプロイ補助ツール (xlnx-config) 本日のメイン ● 使い方 ○ 1. イメージをダウンロード ○ 2. ddコマンド等でSDカードに書き込み ○ 3. SDカードを評価ボードにセット ○ ⇒ これだけでUbuntuが起動します! 5 Copyright © Fixstars Group

6.

Fixstars Corporation www.fixstars.com Ubuntuを利用するメリット ● リッチなパッケージ群 ○ ○ ○ もちろん apt や snap が利用可能 SW開発/デバッグ用ツール : gcc/g++, make, cmake, gdb, valgrind …etc 様々なライブラリ ■ ○ 自身でビルドが必要なSWの場合も、aptで入手できるツール/ライブラリを使ってビルドできるケースが多い emacsも使える ■ ただしc-mode/c++-modeはかなり重い.. font-lock-modeを切ればなんとか使える ● デスクトップ環境 ○ デフォルトでは GNOME3 ○ ■ その他はaptで導入可能 USBキーボード/マウス + ディスプレイ出力(ZCU102の場合:DisplayPort) or VNC経由での操作 ● 長期的なサポート ○ ○ 本イメージは 20.04 LTS なので 2030年 まで セキュリティが重要な本番運用にも適用可能 ⇒ より柔軟で効率的なHW/SW協調の組み込みシステム開発が可能 Copyright © Fixstars Group 6

7.

Fixstars Corporation www.fixstars.com Ubuntuイメージに含まれるデフォルトプラットフォーム ● ZCU102用イメージの場合 : Vitis AI v1.3 MPSoC DPU TRD https://xilinx-wiki.atlassian.net/wiki/spaces/A/pages/2037317633/Getting+Started+with+Certified+Ubuntu+20.04+LTS+for+Xilin x+Devices#%5BinlineExtension%5DOverview-of-the-Out-of-the-Box-Demos 自作のVitis アプリケーションを動かしたい ⇒ カスタムプラットフォームとして組み込み 7 Copyright © Fixstars Group

8.

Fixstars Corporation www.fixstars.com カスタムプラットフォームの組み込み ● 流れ ○ 0. Vitisアプリケーションの開発 ■ ■ ■ 通常のVitisフローによりアプリケーションを開発 Linkまで実施し Bitstream/xclbin を生成 (Hostプログラムのクロスコンパイル : 現時点で未実施. 今回はZCU102でネイティブコンパイル) ○ 1. 環境準備 (初回のみ) ■ ■ xlnx-config のインストール PAC(Platform Asset Container) 格納用ディレクトリの作成 ○ 2. PAC Config の作成 ■ PL Bitstreamとブートに必要なファイル一式をまとめてディレクトリに格納 ■ PAC Configに関する情報を記述したmanifestファイルを作成 ○ 3. PAC Config の切り替え ■ xlnx-config により実施 ○ 4. Reboot ○ 5. Hostプログラムのコンパイル /実行 8 Copyright © Fixstars Group

9.

Fixstars Corporation www.fixstars.com 想定環境 ● 評価ボード : ZCU102 FPGA Device Zynq Ultrascale+ MPSoC XCZU9EG-2FFVB1156 PL Resource LUT:600K, RAM:32.1Mbit, DSP:2520, IO:328 PS CPU/GPU ARM Cortex-A53 x 4Core / ARM Cortex-R5 x 2Core / Mali-400 MP2 PS DRAM DDR4 4GB ● 開発環境 CPU Core i7 6800K OS Ubuntu 20.04 FPGA開発ツール Vitis 2020.2 Vitis Embedded Base Platforms - ZCU102 Base 2020.2 Common images for Embedded Vitis platforms - ZYNQMP common image ● 以降のページに記載するコマンド例は、特記の無い限り ZCU102上で動作する Ubuntuで実行する ものとします Copyright © Fixstars Group 9

10.

Fixstars Corporation www.fixstars.com カスタムプラットフォームの組み込み ● 0. Vitisアプリケーションの開発 ○ 通常のVitisフローでアプリケーション開発を行う ■ ■ C/C++(HLS) or RTL によるKernelの実装 XRT (or OpenCL) 経由でKernelを実行するHostプログラムの実装 ● ■ ○ ただし、今回は後述の手順5でネイティブコンパイル (クロスコンパイル環境は未構築) (参考) チュートリアル: https://xilinx.github.io/Vitis-Tutorials/2020-2/docs-jp/index.html v++ で Kernel の Compile / Link を実行 (開発用PCで実行) $ v++ --compile -t hw --config zcu102.cfg -k kernel -I. kernel.cpp -o kernel.xo $ v++ --link -t hw --config zcu102.cfg kernel.xo -o kernel.xclbin ○ ⇒ PL Bitstream と xclbin が生成される ■ PL Bitstream: ./_x/link/int/system.bit ■ xclbin : ./kernel.xclbin 10 Copyright © Fixstars Group

11.

Fixstars Corporation www.fixstars.com カスタムプラットフォームの組み込み ● 1. 環境準備 (初回のみ) ○ xlnx-config のインストール $ sudo snap install xlnx-config --classic --channel=1.x ○ Platform Asset Container(PAC) 格納用ディレクトリの作成 ■ 下記のパスのうち、 “pac” のディレクトリ名のみ任意に変更しても良い $ sudo mkdir -p /usr/local/share/xlnx-config/pac/hwconfig/ ※ PAC: Bootイメージを生成するために必要なデータをまとめたもの. 次ページで説明します. 参考: xlnx-config のドキュメント (PACについての詳細も記載) https://xilinx-wiki.atlassian.net/wiki/spaces/A/pages/2057043969/Snaps+-+xlnx-config+Snap+for+Certified+Ubuntu+on+Xilinx+Devices 11 Copyright © Fixstars Group

12.

Fixstars Corporation www.fixstars.com カスタムプラットフォームの組み込み ● 2. PAC Config の作成 ○ PAC Config ディレクトリを作成 ■ ■ 手順1で作成したPAC格納用ディレクトリの下に作成 <Config名> は任意に設定 $ sudo mkdir -p /usr/local/share/xlnx-config/pac/hwconfig/<Config名>/zcu102 ○ 下図のような構成となるようにファイルを配置 pac/ └── hwconfig/ ├── <pac名>/ │ ├── manifest.yaml │ └── zcu102/ │ ├── bootgen.bif │ ├── bl31.elf │ ├── fsbl.elf │ ├── pmufw.elf │ ├── system.dtb | └── system.bit │ ファイル名 内容 入手元 manifest.yaml Manifest File ※新規作成 (次ページ参照) bootgen.bif Bootgen Config ※新規作成 (次ページ参照) bl31.elf ARM Trusted Firmware Vitis Embedded Base Platforms (ZCU102 Base) fsbl.elf First Stage Boot Loader (FSBL) pmufw.elf Platform Management Unit Firmware system.dtb Device Tree Blob ※ これらのファイルは xilinx_zcu102_base_202020_1/sw/xilinx_zcu102_base_202020_1/ に格納されている - bl31.elf / fsbl.elf / pmufw.elf : boot/ - system.dtb : xrt/image/ system.bit PL Bitstream Vitis アプリケーションのLink時に生成されるもの 12 Copyright © Fixstars Group

13.
[beta]
Fixstars Corporation

www.fixstars.com

カスタムプラットフォームの組み込み
● 2. PAC Config の作成 (続き)
○ Manifest File (manifest.yaml) の作成
■
■

PAC Config を識別するための情報を記述
例: Config名=vadd の場合

name: vadd
description: Boot assets for vadd design
revision: 1
assets:
zcu102: zcu102

○

・name / description / revision は任意に設定可能
- name はディレクトリ名と合わせておくと分かりやすく、他と競合が起きる心配が無い
・assets は評価ボードと対応するディレクトリ名の関係を記載
- フォーマットは <評価ボード>:<対応ディレクトリ>
- 評価ボードは zcu102, zcu104, zcu106, zcu111, zcu208, zcu216, kv260 のいずれか
- 複数の評価ボードに対応させる場合、改行して複数記述することも可

Bootgen Config (bootgen.bif) の作成
■
■

Bootgen により BOOT.bin を生成する際の設定
下記のように記述 (基本的に変更する必要は無い)

the_ROM_image:
{
[bootloader, destination_cpu=a53-0] fsbl.elf
[pmufw_image] pmufw.elf
[destination_device=pl] system.bit
[destination_cpu=a53-0, exception_level=el-3, trustzone] bl31.elf
[destination_cpu=a53-0, load=0x00100000] system.dtb
[destination_cpu=a53-0, exception_level=el-2] /usr/lib/u-boot/xilinx_zynqmp_virt/u-boot.elf
}
Copyright © Fixstars Group

13

14.

Fixstars Corporation www.fixstars.com カスタムプラットフォームの組み込み ● 3. PAC Config の切り替え / 4.Reboot ○ PAC Config の確認 : 手順2で追加した vadd が見える $ xlnx-config -q PAC configurations present in the system: | PAC Cfg |Act| zcu102 Assets Directory --------------------------------------------------------------------------------------------------------------| vadd | | /usr/local/share/xlnx-config/pac/hwconfig/vadd/zcu102 --------------------------------------------------------------------------------------------------------------- ○ PAC Config の切り替え $ sudo xlnx-config -a vadd ○ 切り替え後の確認 : “Act” にマークが付く $ xlnx-config -q PAC configurations present in the system: | PAC Cfg |Act| zcu102 Assets Directory --------------------------------------------------------------------------------------------------------------| vadd | * | /usr/local/share/xlnx-config/pac/hwconfig/vadd/zcu102 --------------------------------------------------------------------------------------------------------------- 14 ⇒ 切り替え後、Rebootが必要 (実際に有効になるのは Reboot後) Copyright © Fixstars Group

15.

Fixstars Corporation www.fixstars.com カスタムプラットフォームの組み込み ● 5. Hostプログラムのコンパイル /実行 ○ 必要に応じて apt でツールやライブラリをインストール ○ コンパイル時は , XRTのヘッダやライブラリを使うための Flagsを追加 $ g++ -I/usr/include/xrt -o app.o host.cpp $ g++ -o app.exe app.o -lxrt_coreutil ○ 生成されたHostプログラムのバイナリを実行 15 Copyright © Fixstars Group

16.

Fixstars Corporation www.fixstars.com Zynq MPSoC のブートの流れと xlnx-config がやっていること ● Zynq MPSoC のブートの流れ ○ BOOT.BIN に含まれる Boot loader / Firmware / PL Bitstream 等をロード Power On [BOOT.BIN] - First Stage Boot Loader - ARM Trusted Firmware - PMU Firmware - Device Tree - PL Bitstream - U-Boot Load FSBL PMUの内部ROM Load PL Bitstream (Configure PL) Load ATF FSBL Load U-Boot Boot Linux U-Boot 参考: https://www.slideshare.net/ssuser479fa3/zynq-mp-58490589 Copyright © Fixstars Group 16

17.

Fixstars Corporation www.fixstars.com Zynq MPSoC のブートの流れと xlnx-config がやっていること ● 本Ubuntu イメージを使用する場合 ○ ○ ○ ※ BOOT10x0.binのxは ボード種により決定 ZCU102:2, ZCU104:4, ZCU106:6 配布イメージには BOOT.BIN と BOOT10x1.BIN (= Golden Boot Image) の2種類が含まれる BOOT.BIN にはImage Selector 機能付きに改造された FSBLのみが格納 ⇒ BOOT10x0.BIN or BOOT10x1.BIN を自動選択 xlnx-config のメインの役割は PACから BOOT10x0.bin (= Custom Boot Image) を生成すること Power On [BOOT.BIN] - First Stage Boot Loader (Image Selector機能を実装) xlnx-config の役割 - PAC Config の管理 - PAC Config からCustom Boot Imageを生成し配置 (bootgenを使用) - Golden Boot Imageに戻す場合、配置済みのCustom Boot Imageを削除 Load FSBL (w Image Selector) PAC Get Board ID No [BOOT10x1.BIN] =Golden - First Stage Boot Loader - ARM Trusted Firmware - PMU Firmware - Device Tree - PL Bitstream - U-Boot Is BOOT10x0.bin Available? Use BOOT10x1.BIN 配布イメージに含まれる 参考: https://xilinx-wiki.atlassian.net/wiki/spaces/A/pag es/2036826124/Booting+Certified+Ubuntu+20.04+LTS+fo r+Xilinx+Devices xlnxconfig boot gen ※ bootgenはXilinx提供の Boot Image生成ツール (詳細はUG1283等を参照) Yes Use BOOT10x0.BIN Load PL Bitstream (Configure PL) Load ATF Load U-Boot Boot Linux Copyright © Fixstars Group [BOOT10x0.BIN] =Custom - First Stage Boot Loader - ARM Trusted Firmware - PMU Firmware - Device Tree - PL Bitstream - U-Boot xlnx-config(bootgen)で生成 17

18.

Fixstars Corporation www.fixstars.com 動作デモ ● Full HD(1920x1080) Color Detection のFPGAオフロード ○ https://xilinx.github.io/Vitis_Libraries/vision/2020.2/overview.html#id9 ○ ○ Host Programは自作 閾値(HSVで指定)の範囲内の色の部分を抽出する処理 CPU(OpenCV) で同等の処理をした場合と比較 ZCU102 USB 画像処理部分のスループット (FPS) CPU使用率 ■ ■ Zynq Ultra Scale+ MPSoC DP ■ SD FPGAオフロード (HLS実装:Vitis Vision Libraryを使用) BGR2HSV Thresholding Erode Dilate Dilate Erode xf::cv:: bgr2hsv xf::cv::color Thresholding xf::cv:: erode xf::cv:: dilate xf::cv:: dilate xf::cv:: erode Ubuntu ※ Erode:収縮 / Dilate:膨張 XRT XRT CPU処理 (Host Program) Y 画像取得 cv::Video Capture FPGA Offload? N BGR2HSV Thresholding Erode Dilate Dilate Erode cv::cvtColor cv::inRange cv::erode cv::dilate cv::dilate cv::erode USBカメラ (1920x1080 30p) この部分の処理時間を計測 : 30回ごとの平均 (=カメラFPSより高くなることもある) Copyright © Fixstars Group 結果画像(2値Mask) と元画像を合成 854x480 に縮小 cv::copyTo cv::resize 画面出力 cv::imshow CPU使用率計測時は 画面出力処理(前処理含む)を無効化 18

19.

Fixstars Corporation www.fixstars.com 動作デモ ● xlnx-config の確認 (既に color_detect を有効化済み ) ● USBカメラで撮影したフレームの一例 19 Copyright © Fixstars Group

20.

Fixstars Corporation www.fixstars.com 動作デモ 閾値の設定 Low : (H, S, V) = (51, 0, 0) High: (H, S, V) = (90, 255, 158) ● Color Detect CPU処理 の場合 スループット: 20 [fps] CPU使用率 : 130 [%] (画面出力On時) 120 [%] (画面出力Off時) 20 Copyright © Fixstars Group

21.

Fixstars Corporation www.fixstars.com 動作デモ 閾値の設定 Low : (H, S, V) = (51, 0, 0) High: (H, S, V) = (90, 255, 158) ● Color Detect FPGA Offload処理 の場合 スループット: 30 [fps] CPU使用率 : 105 [%] (画面出力On時) 90 [%] (画面出力Off時) CPU処理と比較して .. - スループット: 約1.5倍 - CPU使用率 : 約0.8倍 21 Copyright © Fixstars Group

22.

Fixstars Corporation www.fixstars.com AlveoでLinuxを動かす その3 Copyright © Fixstars Group Copyright © Fixstars Group

23.

Fixstars Corporation www.fixstars.com Who I am Kenta IDA 写真 井田 健太 ソリューション第一事業部 シニアエンジニア 23 Copyright © Fixstars Group

24.

Fixstars Corporation www.fixstars.com 前回までのおさらい & 今回の内容 24 Copyright © Fixstars Group

25.

Fixstars Corporation www.fixstars.com 前回までのおさらい • セミナー第6回 • • • Alveo U50でLinux on VexRiscvを動かす…つもりだったが 移植が間に合わなかったので LiteFury (Artix7のボード) で動かした LinuxのブートとDhrystoneの動作まで確認 このときの開発フローはVivadoフロー 出典: https://github.com/RHSResearchLLC/NiteFury-and-LiteFury Copyright © Fixstars Group 25

26.

Fixstars Corporation www.fixstars.com 前回までのおさらい • セミナー第7回 • • 今度こそAlveo U50で動かす このときの開発フローはVitisフロー • • • • ACRiルームのU50でも動かしたい→Vivadoフローは使用不可 VitisのUser Controlled RTL KernelとしてVexRiscvを配置 XRTを用いてPCから カーネルイメージ等をU50上のHBMに転送 しかしLinuxブート中にpanicで間に合わず… 26 Copyright © Fixstars Group

27.

Fixstars Corporation www.fixstars.com 今回の内容 • セミナー第9回 • • • • Alveo U50で動いた! • 動かなかった原因は後程説明 • • • MACの組み込み ドライバの開発 いざ動作確認 動作周波数の割に遅いので原因調査と対策 ネットワークにつなぐ 次回 (あれば) の展望 27 Copyright © Fixstars Group

28.

Fixstars Corporation www.fixstars.com 対象のボード (再掲) • Alveo U50 (今回こそちゃんとAlveo U50!) • • • • • • • PCIe Gen3x16 or Gen4x8接続のアクセラレータカード QSFP28スロットを1つ搭載 (写真はES品なのでSFP-DD2つになっている) • 100GbEが使える • 4[GiB]のブロック x2 標準でVitisによる開発フローをサポート HBM 8[GiB]搭載 LUT 872J, FF 1743K, DSP 5952 (参考)前回使ってたボード↓ LiteFury (https://github.com/RHSResearchLLC/NiteFury-and-LiteFury) • • • Artix-7 XC7A100T-L2FGG484EとDDR3 256[MiB]搭載したFPGAボード M.2 2280 M key形状 PCIe Gen2 x4接続可能 出典: https://github.com/RHSResearchLLC/NiteFury-and-LiteFury 28 Copyright © Fixstars Group

29.

Fixstars Corporation www.fixstars.com システム構成 (再掲) • • • 前回LiteFuryに入れた時と同じ クロックだけ125[MHz]→300[MHz] ターゲット • CPUコア:VexRiscv@300[MHz] MMUあり構成 メモリ :HBM (256[MiB]) タイマー:ACLINTのうち タイマー機能を最低限実装 (IPIはなし) UART: Xilinx AXI UART 16550 • • JTAG信号生成:AXI GPIO (ホストCPU制御) UART: Xilinx AXI UART 16550 • XDMA (Vitis Platform Shell側) • • • • • デバッグ ホストインターフェース 29 Copyright © Fixstars Group

30.

Fixstars Corporation www.fixstars.com Alveo U50での動作確認 (つづき) 30 Copyright © Fixstars Group

31.

Fixstars Corporation www.fixstars.com Alveo U50での動作確認 (続き) • 第7回では Alveo U50 でLinuxを起動し、Dhrystoneを実行するところまでたどり着けなかった Linux起動時のわりと早い段階でKernel Panicが発生 • 原因 • デバイスツリーでのメモリサイズ指定を間違っていた • • 256[MiB]のところが512[MiB]になっていた Alveo U50にはHBMが4[GiB]x2の合計8[GiB]搭載されているが 内部的には256[MiB]のブロックに分かれている 2ブロック割り当てるつもりでデバイスツリーを書いたが そのことを忘れて1ブロックしか割り当てなかった • • 誤 正 31 Copyright © Fixstars Group

32.

Fixstars Corporation www.fixstars.com Vitisフローでシステムデザインの作成 (再掲) • Vitisのリンク処理の設定をする • • • • DRAMとしてHBM[8]を使うように指定する HBMは番号ごとにアドレスが固定になっており、HBM[8]は0x8000_0000から256[MiB] VexRiscvは0x8000_0000から実行開始するのでHBM[8]の必要あり ChipScope Debugを有効にしてデバッグ可能にしておく 32 Copyright © Fixstars Group

33.

Fixstars Corporation www.fixstars.com Alveo U50での動作確認 (続き) • • デバイスツリーの指定を256[MiB]に修正してLinuxが起動することを確認 ACRiルームのAlveo U50でも動作確認済み 33 Copyright © Fixstars Group

34.

Fixstars Corporation www.fixstars.com VexRiscvのパフォーマンス調査 34 Copyright © Fixstars Group

35.

Fixstars Corporation www.fixstars.com 現行の構成でのパフォーマンス • • Dhrystone 10万回イテレーションで測定 VexRiscvのコアの構成など: • • • • • 結果 動作周波数:300[MHz] I-Cache: 4[kiB], 64[Bytes/Line], 512[bit] bus D-Cache: 4[kiB], 64[Bytes/Line], Direct Map, Write Through, 32[bit] bus • • ウェイ数は増やせるが今は1-wayなのでDirect Map WTなので外部バス幅を増やせない • • 単一サイクル整数乗算 32サイクル除算 RV32IMAC Microseconds for one run through Dhrystone: 24.7 Dhrystones per Second: 40485.8 • • 40485[Dhrystones/s] = 23.029[DMIPS] → 0.07[DMIPS/MHz] ものすごくおそい! • • 参考: STM32F2xx (Cortex-M3) - 1.25[DMIPS/MHz] VexRiscvの公式説明では 1.44[DMIPS/MHz]でているらしい Copyright © Fixstars Group 35

36.

Fixstars Corporation www.fixstars.com 原因調査 • おそらく公式説明の性能達成時はメモリにSRAMを使っている • • レイテンシ 1[Cycle]、バス幅と同じスループット 今回のシステムではDキャッシュは4[kiB]のWrite Through構成 • • WTなのでバス幅がCPUデータバス幅と同じになっている HBMまでのレイテンシとHBMのレイテンシがそこそこ長い • • • おそらく合計で数十サイクルあるのではないか? 4[kiB]ダイレクトマップ構成なのでキャッシュミス率が高い キャッシュミス時のペナルティがとても大きい 36 Copyright © Fixstars Group

37.

Fixstars Corporation www.fixstars.com ILAで確認 • • • VitisでもILAでAXI周りの信号を確認できる (第7回にも記載) リードアクセス時のレイテンシを測定 下の例だと73[cycles] → 思ったより長い… 37 Copyright © Fixstars Group

38.

Fixstars Corporation www.fixstars.com ILAで確認 • • • VitisでもILAでAXI周りの信号を確認できる (第7回にも記載) リードアクセス時のレイテンシを測定 下の例だと155[cycles] → 思ったよりかなり長い… 38 Copyright © Fixstars Group

39.

Fixstars Corporation www.fixstars.com 対策 • VexRiscvのD-Cacheの設定を変更 • キャッシュミス率を低減 • • • VexRiscvのD-Cacheの設計変更 • WBキャッシュにして外部バス幅をキャッシュライン幅にする • • 2-Wayセットアソシアティブにして キャッシュライン数を増やす 変更内容が大きい 外にもう1段キャッシュを付ける • そういえば何かXilinxのIPがあったような…? 39 Copyright © Fixstars Group

40.

Fixstars Corporation www.fixstars.com 外部キャッシュの追加 • System Cache IPを追加する 40 Copyright © Fixstars Group

41.

Fixstars Corporation www.fixstars.com 外部キャッシュの追加 System Cache IPを追加する • • Write Back構成のAXI4接続可能なキャッシュ 主にMicroBlazeと組み合わせて使う用 System Cache (L2) VexRiscv Data Bus Interconnect • Copyright © Fixstars Group 41

42.

Fixstars Corporation www.fixstars.com 外部キャッシュの追加 • 注意点 • • • • Write Allocationを無効化しておかないとハングアップする • • • バグなのか? VexRiscvだけでなくXDMAに繋いだ時にも起きたので何かしらありそう… 内部信号調べたところ、アロケーション時のキャッシュのパージ処理で死んでそう • 4’b01xx →Read Allocated, No Write Allocated アロケーションの設定はAXI4のAxCACHEの値を上書きして書き換える Readアクセス時にキャッシュミスしたらラインを確保する Writeアクセス時にはキャッシュミスしてもラインを確保しない ARCACHE 上書き AWCACHE 上書き 42 Copyright © Fixstars Group

43.

Fixstars Corporation www.fixstars.com キャッシュ追加後のパフォーマンス • • Dhrystone 10万回イテレーションで測定 VexRiscvのコアの構成など: • • • • 動作周波数:300[MHz] I-Cache: 4[kiB], 64[Bytes/Line], 512[bit] bus L1 D-Cache: 4[kiB], 64[Bytes/Line], Direct Map, Write Through, 32[bit] bus • • ウェイ数は増やせるが今は1-wayなのでDirect Map WTなので外部バス幅を増やせない • • 単一サイクル整数乗算 32サイクル除算 RV32IMAC • L2 D-Cache: 512[kiB], 64[Bytes/Line], 2-Way Set Associative, Write Back, 512[bit] bus • 結果 Microseconds for one run through Dhrystone: 8.8 Dhrystones per Second: 114285.7 • • 114285[Dhrystones/s] = 65.046[DMIPS] → 0.21[DMIPS/MHz] マシにはなったがもっとキャッシュ周りの改善が必要 Copyright © Fixstars Group 43

44.

Fixstars Corporation www.fixstars.com この後の方針 • VexRiscvのD-Cacheの設定を変更 • キャッシュミス率を低減 • • • VexRiscvのD-Cacheの設計変更 • WBキャッシュにして外部バス幅をキャッシュライン幅にする • • 2-Wayセットアソシアティブにして キャッシュライン数を増やす 変更内容が大きい 内蔵でもっと本格的な構成のキャッシュを持つコアに変更する • Rocket ChipやBOOMなど 44 Copyright © Fixstars Group

45.

Fixstars Corporation www.fixstars.com ネットワークにつなぐ 45 Copyright © Fixstars Group

46.

Fixstars Corporation www.fixstars.com 背景 • • VexRiscv on Alveo U50でLinuxが動く用にはなったが、 外部とのやり取りがほぼできない • • コンソールの入出力 JTAG • つなげられれば実用的な用途が生まれる可能性あり? どうせならネットワークにつないでみたい • • e.g. Linuxのソフト資産 + 通信のアクセラレータ 繋いでみよう 46 Copyright © Fixstars Group

47.

Fixstars Corporation www.fixstars.com 方針 • • • ネットワーク接続以外はACRiルームでも試せる構成とする • Vitisフローでの開発 • 25Gb/100Gbと比べて機材が安価なため ネットワーク接続は10Gb Ethernetとする 第5回のFPGAセミナーでやった内容 • Xilinx Network ExampleのVitis Kernelで100GbE経由のUDP通信を 無償10GbE MACを使って安価に試す • 第5回でやったことを組み合わせる • 必要な作業 • 10GbE MAC用のLinuxドライバを開発する • MACはつくってあるけどドライバが無い… • VexRiscv Vitisカーネルに10GbE MACを組み込む 47 Copyright © Fixstars Group

48.

Fixstars Corporation www.fixstars.com ネットワークドライバの開発 • • 今回使うMAC: xg_mac • • https://github.com/fixstars/xg_mac Tech Blog記事用に空き時間で作った簡易10G Ethernet MAC IP • もともとFPGA (PL) でHLS等から使用することを想定 Xilinxの10GMACであればLinux向けドライバがあるがxg_macのLinuxドライバはない • 今回はVexRiscv上のLinuxから使うためにドライバが必要なので開発する • 方針 • • とりあえず動くことを目標にし、パフォーマンスは度外視する 適当にパケットバッファをDMAで転送する • バッファリストを作って流し続けられるようにするとかは考えない 48 Copyright © Fixstars Group

49.

Fixstars Corporation www.fixstars.com ドライバ開発用デザインの作成 • • • • 最終的にはAlveo U50上のVexRiscvで動作させるが、開発には使いにくい • • コンパイラやビルドツール、カーネルのソースなどはrootfsに入れていない CPU性能そんなに高くない • お行儀よく書けばaarch64向けとRISC-V(RV32IMAC)で同じコードが動くはず まずはドライバをZynq Ultrascale+のPS上で動作させその後VexRiscv向けに移植 手元にある手軽なZynq Ultrascale+搭載ボードとしてUltra96を使用 10GMACは載せられないので、 MACへのデータ転送用DMAとFIFOのみのループバックデザインを作成 49 Copyright © Fixstars Group

50.

Fixstars Corporation www.fixstars.com ドライバ開発デザインのブロックデザイン • 10GMACは載せられないので、 MACへのデータ転送用DMAとFIFOのみのループバックデザインを作成 50 Copyright © Fixstars Group

51.

Fixstars Corporation www.fixstars.com ドライバ開発デザインのブロックデザイン • 10GMACは載せられないので、 MACへのデータ転送用DMAとFIFOのみのループバックデザインを作成 AXI Stream Data FIFO AXI DMA 51 Copyright © Fixstars Group

52.

Fixstars Corporation www.fixstars.com ドライバ開発デザインのブロックデザイン • • AXI DMAはDirect Register Modeで使用 (Scatter Gatherはしない) アライメントがずれたアドレスのバッファ転送をするので Unaligned Transferを有効に AXI Stream Data FIFO AXI DMA 52 Copyright © Fixstars Group

53.

Fixstars Corporation www.fixstars.com ドライバ開発デザインのブロックデザイン • • FIFOの深さをEthernet1フレーム分 (1518[octet]) 以上にする (256×16=4096) Enable packet modeをYesにする → TLASTが来るまでデータを流さない AXI Stream Data FIFO AXI DMA 53 Copyright © Fixstars Group

54.

Fixstars Corporation www.fixstars.com Ultra96上での開発 • ikwzmさんのZynqMP-FPGA-LinuxからUltra96用のUbuntu 20.04を持ってきて入れる • 基本的なドライバ開発環境が整っているので非常に便利 • 毎回リブートするのは面倒なので Device Tree Overlayでテストデザインをコンフィグレーション • ドライバの開発(コーディング、ビルド、デバッグ) はUltra96上で行う • Zynq Ultrascale+はaarch64なのでVSCodeのRemote SSH接続が可能。快適 54 Copyright © Fixstars Group

55.

Fixstars Corporation www.fixstars.com ドライバの動作確認 • ドライバをロード後、ifconfigで適当なIPを設定 • • • • 192.168.4.1/24など tcpdumpでインターフェースを指定してEthernetフレームを監視 同一ネットワーク (192.168.4.2など) にpingを送る ハードウェア側は単純なループバックなのでpingの応答は帰ってこないが、 tcpdumpでARPのEthernetフレームが届くことを確認できる 55 Copyright © Fixstars Group

56.

Fixstars Corporation www.fixstars.com 追加の確認 • ループバックだけだと不安なので、HLS実装のARP/ICMPコアを入れて応答を確認 • • pingに応答するロジック 外部と通信しているのと同等のEthernetフレームを生成する ARP/ICMP 応答コア(HLS) DMA Zynq PS 56 Copyright © Fixstars Group

57.

Fixstars Corporation www.fixstars.com 動作確認 • • ドライバをロードしてIPアドレスを設定 ハードウェアで固定に設定したIP (192.168.4.2) にping 57 Copyright © Fixstars Group

58.

Fixstars Corporation www.fixstars.com ドライバの内容 • • XilinxのEtherMAC Lite用のドライバを参考に AXI DMAを制御するドライバを作成 • そんなに記述量は多くない (450行弱) • https://github.com/ciniml/fpga_network_loopback/blob/main/xg_mac_driver/xgmac.c 主要処理はバッファ受け取ってDMAセットアップするくらい DMA転送用に物理アドレスを取得 転送元アドレスをレジスタに設定 転送バイト数を設定 (転送開始) 58 Copyright © Fixstars Group

59.

Fixstars Corporation www.fixstars.com 10GMAC組込み後のカーネル • • • バッファ転送用のDMAを追加(ドライバ開発デザインと同様) 10G MAC(xg_mac)を追加 10G PCS/PMAを追加 59 Copyright © Fixstars Group

60.

Fixstars Corporation www.fixstars.com 10GMAC組込み後のカーネル バッファ転送用のDMAを追加(ドライバ開発デザインと同様) 10G MAC(xg_mac)を追加 10G PCS/PMAを追加 Interconnect to HBM • • • 10G PCS/PMA 10G MAC FIFO (TX) AXI DMA FIFO (RX) Copyright © Fixstars Group 60

61.

Fixstars Corporation www.fixstars.com Vitisでのリンク処理の修正 • PCS/PMAとGTの接続や、PCS/PMAのフリーランニングクロック (100[MHz])を 行うためのポストリンクスクリプトを書く • • Xilinx Network Exampleで行っているのと同様 IP IntegratorのTCLのコマンド列を書けばいい 61 Copyright © Fixstars Group

62.

Fixstars Corporation www.fixstars.com Vitisでのリンク処理の修正 • • Alveo U50でQSFPへのトランシーバを使うために カーネルをSLR[1]に配置するように設定 ポストリンクスクリプトを呼ぶように変更 62 Copyright © Fixstars Group

63.

Fixstars Corporation www.fixstars.com デバイスツリーの修正 • • 10GMACへのDMAへアクセスできるように定義を追加 Ultra96で作ったカーネル・モジュールをロードできるようにcompatibleを設定 63 Copyright © Fixstars Group

64.

Fixstars Corporation www.fixstars.com 動作確認!!! • 割り込みが!うごかない! • • • RISC-VではSiFiveが作っているPLIC (Platform Local Interrupt Controller) が割り込みコントローラとしてよく用いられる PLICの使いやすそうな実装がなかったので、CPUコアの外部割込み直結にしたが どうもLinuxではその使い方はできなさそう? • • • ドライバで割り込み番号を取得する部分で WARN_ON に引っかかる 使用不可能の扱いになっている模様 PLICのOSS実装を見つけたので急遽組み込んでみたが、間に合わず… • • • ここまでで外部割込みは動作確認していなかった… 組み込んで起動したらOpenSBIの起動中に停止 おそらくOpenSBIが割り込みを有効にした段階で おかしな挙動 (割り込み入りっぱなしなど)になっている また次回あれば動かすところまでもっていきます… 64 Copyright © Fixstars Group

65.

Fixstars Corporation www.fixstars.com 今後の方針 • VexRiscv以外のLinux動作可能コアを試す • • • Rocket ChipやBOOMなど HLS等で書いたネットワークアクセラレータを制御するLinux環境として 比較的まともな性能のものがあるとうれしい ネットワークドライバを動かす • • • PLIC実装を動くようにする ドライバをとりあえず割り込み無しで動くように修正する Rocket ChipやBOOMなど、 PLIC相当の割り込みコントローラを含んでいるものを使う 65 Copyright © Fixstars Group

66.

Fixstars Corporation www.fixstars.com Thank You お問い合わせ窓口 : [email protected] Copyright © Fixstars Group Copyright © Fixstars Group