2.5K Views
February 24, 22
スライド概要
フィックスターズならではの「FPGA」に関する高速化手法、 効率的な開発ノウハウ、苦労話などについてお話しいたします。
<講演内容>
1、Alveo!でLinuxを動かす
前回に引き続き、FPGAでRISC-V CPUコアを動かし、Linuxを動作させるまでのあれこれについてお話します。
前回未達だったAlveo U50での動作確認やSMP構成、U-Bootによる柔軟なブートシーケンスの実現についての話を予定しています。
2、AI Engine を用いたアプリケーション開発
Versal は、Xilinx の開発した ACAP (Adaptive Compute Acceleration Platform) という
新しいデバイスの最初のシリーズです。
Versal では既存の FPGA に加え、新しくチップに NoC を内蔵したことやAI Engine という新たな演算ユニットの追加など、様々なアップデートがされています。
本セミナーでは AI Engine について、そのアーキテクチャを概説し、どのように効率のよい処理を実装していくのか解説します。
・当社技術ブログ 記事: https://proc-cpuinfo.fixstars.com/
・フィックスターズグループ/セミナー一覧: https://www.fixstars.com/ja/seminar
・フィックスターズのFPGAシステム開発:https://www.fixstars.com/ja/services/fpga
・フィックスターズのFPGAシステム開発: https://www.fixstars.com/ja/services/fpga
フィックスターズは、コンピュータの性能を最大限に引き出すソフトウェア開発のスペシャリストです。車載、産業機器、金融、医療など、幅広い分野での開発経験があります。また、ディープラーニングや機械学習などの最先端技術にも力を入れています。 並列化や最適化技術を駆使して、マルチコアCPU、GPU、FPGA、量子アニーリングマシンなど、さまざまなハードウェアでソフトウェアを高速化するサービスを提供しています。さらに、長年の経験から培ったハードウェアの知識と最適化ノウハウを活かし、高精度で高性能なアルゴリズムの開発も行っています。 ・開催セミナー一覧:https://www.fixstars.com/ja/seminar ・技術ブログ :https://proc-cpuinfo.fixstars.com/
Fixstars Corporation www.fixstars.com 実践的!FPGA開発セミナー vol.7 2022/02/24 18:00~ Copyright © Fixstars Group Copyright © Fixstars Group
Fixstars Corporation www.fixstars.com AI Engine を用いた アプリケーション開発 Copyright © Fixstars Group Copyright © Fixstars Group
Fixstars Corporation www.fixstars.com Who I am Yuki MATSUDA 写真 松田 裕貴 ソリューション第一事業部 リードエンジニア 3 Copyright © Fixstars Group
Fixstars Corporation www.fixstars.com 自己紹介 • • 松田 裕貴 FPGA エンジニア • • 主に Xilinx FPGA を使用 略歴 • 2016年 4月 フィックスターズ入社 • • • • FPGA による高解像度の画像処理 ネットワーク処理のオフロード AIE を用いた画像処理の高速化 などを着手 Copyright © Fixstars Group 4
Fixstars Corporation www.fixstars.com 本日のセミナーの内容 • Versal で新しく追加された AI Engine アーキテクチャの概説 • • 本セミナーでは、通常の AI Engine (not AI Engine-ML) について取り扱います サンプルアプリケーションとして FIR Filter の作り方を紹介し、 また、AI Engine の性能を引き出すためのチューニング方法も紹介 Copyright © Fixstars Group 5
Fixstars Corporation www.fixstars.com Agenda • • • AIE のアーキテクチャ AIE のプログラミング方法 AIE を使ったサンプルアプリ: FIR Filter • • • naive な実装 チューニング後の実装 まとめ Copyright © Fixstars Group 6
Fixstars Corporation www.fixstars.com Versal ACAPとは • Xilinx の新しいアーキテクチャのチップ • 従来の FPGA に以下のアップデートを実施 • • • • チップ内に NoC(Network on Chip)の追加 → 配線効率上昇 AI Engine の追加 / DSP の更新 (DSP58) → 演算効率向上 DDR, CMAC, PCIe 等の ハードマクロ化 → PL リソースの削減 その他色々 https://japan.xilinx.com/products/silicon-devices/acap/versal-ai-core.html Copyright © Fixstars Group 7
Fixstars Corporation www.fixstars.com Why AI Engine? • FPGA を計算用のデバイスとして見た場合、 GPU 等の他チップと比べると次のようなメリット/デメリット • メリット • • • デメリット • • • I/O との密結合 => 低レイテンシ カスタムなパイプラインを組むことでの処理効率の向上 再構成可能であるが故のロジック集積効率の悪さ 特に演算器 (DSP) の集積率が低く、総演算性能が低い DNN 等、最近は演算負荷が高い処理が増えている傾向 → 演算器を高密度に集約した AI Engine が FPGA に追加された https://japan.xilinx.com/support/documentation/white_papers/j_wp506-ai-engine.pdf Copyright © Fixstars Group 8
Fixstars Corporation www.fixstars.com AI Engine とは • チップ上に搭載された新たな計算用エンジン • • PL の開発とは異なり、C言語ベースの SW でプログラミングを行う 複数のコアをメッシュ状に繋いだメニーコア • • 各コアは VLIW の SIMD プロセッサ 各コアに隣接したローカルメモリによる高帯域なメモリアクセス • • キャッシュなどはなし => 演算器の密度を向上させられる PL (Programmable Logic) と AXI4-Stream IF で密結合 → I/O とも PL を介して密結合が可能 → FPGA のメリットを維持しつつ、高い演算性能を達成 https://japan.xilinx.com/products/silicon-devices/acap/versal-ai-core.html Copyright © Fixstars Group 9
Fixstars Corporation www.fixstars.com AI Engine Array • AI Engine はメッシュ配置の複数のコアから構成 • • 各コアに命令メモリがあるので、 コア毎に異なる処理を実行させることができる • • 右図は 9 コアだけだが、 最大で 400 コアのモデルもある データ並列だけでなくタスク並列な処理も可能 AI Engine のコア間は高速なローカルメモリで 接続される (後述) https://japan.xilinx.com/products/silicon-devices/acap/versal-ai-core.html Copyright © Fixstars Group 10
Fixstars Corporation www.fixstars.com AI Engine コアのアーキテクチャ • AI Engine のコアは、 VLIW (Very-Long Instruction Word) の ベクタープロセッサ • • • 1命令でロード・ストア・演算等を同時に実行 ベクターユニットがプロセッサ内にある AI Engine の性能を十分に発揮するには、 ベクターユニットを使用する必要がある • C プログラム上でそのように記載する (後述) https://japan.xilinx.com/products/silicon-devices/acap/versal-ai-core.html Copyright © Fixstars Group 11
Fixstars Corporation www.fixstars.com AI Engine のメモリアーキテクチャ • AI Engine の 1つのコアからは、 4 つのメモリに直接アクセス可能 • • • ローカルメモリへのアクセスは高帯域 • • サイクルあたり 256bit load x2, store x1 ローカルメモリは コア間のデータ共有にも使用可能 • • 赤色のコア -> 黄色のメモリ メモリあたり 32KB データ並列/タスク並列どちらも可能 他にも stream (黒) , cascade (緑) などもあるが本セミナーでは省略 https://japan.xilinx.com/support/documentation/architecture-manuals/j_am009-versal-ai-engine.pdf Copyright © Fixstars Group 12
Fixstars Corporation www.fixstars.com AI Engine と外部とのインターフェース • AI Engine へのインターフェース は以下の 2つ • • • GMIO ではDDR へのブロックアクセスが可能 • • GMIO: to/from DDR (NoC 経由) PLIO: to/from PL (AXI4-Stream) ホストからアドレス, サイズを指定して転送する PLIO では任意の PL Kernel とやり取りが可能 • • プロトコルは AXIS 32bit/64bit/128bit PL 上でデータを整形 (eg: 転置) し、 AIE には計算だけさせるような分担も可能 https://japan.xilinx.com/support/documentation/architecture-manuals/j_am009-versal-ai-engine.pdf Copyright © Fixstars Group 13
Fixstars Corporation www.fixstars.com Agenda • • • AIE のアーキテクチャ AIE のプログラミング方法 AIE を使ったサンプルアプリ: FIR Filter • • • naive な実装 チューニング後の実装 まとめ Copyright © Fixstars Group 14
Fixstars Corporation www.fixstars.com AIE のプログラミング方法 • AIE を使ったシステムを作成するには、以下のものが必要 • • • 各コア上で動くカーネル カーネルを繋いで一つの処理を実現するグラフ (PL を使う場合) グラフにデータを供給する PL カーネル FPGA PL AIE Graph 1 mm2s krnl1 krnl2 s2mm NOC/DDR AIE を使う典型的なシステム Copyright © Fixstars Group 15
Fixstars Corporation www.fixstars.com カーネル / グラフの作成 カーネルの定義 入出力が特殊な以外は普通の C コード AIE Graph 1 window は隣接したローカルメモリを表す krnl1 グラフの定義 - adf::kernel::create でカーネル定義 - adf::connect でカーネル間/入出力を繋ぐ krnl2 Copyright © Fixstars Group 16
Fixstars Corporation www.fixstars.com カーネル / グラフの作成 (cont.) • aiecompiler というコマンドでコンパイルができ、次の処理が行われる • • • AIE 向けの命令コードの生成 カーネルの AIE コアへのマッピング 下図は前ページのグラフをコンパイルし、vitis_analyzer で可視化したもの Copyright © Fixstars Group AIE コア (8x50) へのマッピング 17
Fixstars Corporation www.fixstars.com AIE と PL の結合 • AIE と PL は、 Vitis のビルドフローに則って結合される • 下図は Vitis-Tutorials 内のプロジェクトのビルドフロー https://xilinx.github.io/Vitis-Tutorials/2021-1/build/html/docs/AI_Engine_Development/Feature_Tutorials/05-AI-engine-versal-integration/README.html Copyright © Fixstars Group 18
Fixstars Corporation www.fixstars.com AIE と PL の結合 • AIE と PL は、 Vitis のビルドフローに則って結合される • 下図は Vitis-Tutorials 内のプロジェクトのビルドフロー 結合後のシステム https://xilinx.github.io/Vitis-Tutorials/2021-1/build/html/docs/AI_Engine_Development/Feature_Tutorials/05-AI-engine-versal-integration/README.html Copyright © Fixstars Group 19
Fixstars Corporation www.fixstars.com Agenda • • • AIE のアーキテクチャ AIE のプログラミング方法 AIE を使ったサンプルアプリ: FIR Filter • • • naive な実装 チューニング後の実装 まとめ Copyright © Fixstars Group 20
Fixstars Corporation
www.fixstars.com
FIR Filter on AI Engine
•
FIR (Finite Impulse Response) Filter
•
•
入力信号に対して、
有限回のインパルス応答を適用するフィルタ
演算としては、
有限の区間の重み付き和を求めることに等しい
https://en.wikipedia.org/wiki/Finite_impulse_response
•
AIE で解くにはどうやるか?
FIR Filter
for (i = 0; i < N; i++) {
sum = 0;
for (j = 0; j < FIR_SIZE; j++) {
sum += x[i - j] * b[j];
}
y[i] = sum;
}`
Copyright © Fixstars Group
21
Fixstars Corporation www.fixstars.com FIR Filter on AI Engine • • AIE で解く場合、ローカルメモリに上限がある(32KiB/mem) → 1回の実行でデータ全ては処理できない ローカルメモリにある程度データが溜まるたびに、 AIE でデータを処理していく Copyright © Fixstars Group 22
Fixstars Corporation www.fixstars.com FIR Filter: 評価用デザインの作成 • FIR Filter を AIE 上に配置し、 PL カーネルと繋いだシステムを作成した • PL 側 • • • • 動作周波数: 200MHz ストリームデータ幅: 128bit 入出力レート: 1.6 G samples/sec (int16 換算) AIE 側 • • 動作周波数: 1.25 GHz カーネル: FIR Filter 用のコアが 1つだけ FPGA PL AIE Graph 1 mm2s FIR Filter s2mm NOC/DDR Copyright © Fixstars Group 23
Fixstars Corporation www.fixstars.com FIR Filter: 実機での実行結果 • 以下のパラメータで FIR (Finite Impulse Response) Filter を実行した • • • • 入力: 4M samples / int16 出力: 4M samples / int16 フィルタサイズ: 63 実行結果 実装 実行時間 処理レート (samples/sec) 処理レート (cycles/sample) naive 実装 1888.16 ms 2.22 Msamples / sec 562.71 • AIE は naive な実装だと全然速くないので、 SIMD 化が重要になる Copyright © Fixstars Group 24
Fixstars Corporation www.fixstars.com SIMD による高速化 • SIMD (Single-Instruction Multiple-Data) は1つの命令で複数のデータを処理すること • • 他にボトルネックがない場合、単純に演算器の数だけ性能が向上する FIRの場合、複数の Y の計算を同時に行うことで簡単に並列化可能 • • • • Y[i+0] = X[i+0-j] * b[j] Y[i+1] = X[i+1-j] * b[j] Y[i+2] = X[i+2-j] * b[j] Y[i+3] = X[i+3-j] * b[j] https://en.wikipedia.org/wiki/Single_instruction,_multiple_data Copyright © Fixstars Group 25
Fixstars Corporation www.fixstars.com AI Engine における SIMD の使い方 • AI Engine にはベクターユニットが乗っているので、これを活用する • • int16 の場合、cycle あたり 64 回の Mul/Add 演算が可能 => これを使うだけで64倍高速 ベクターユニットを使うには、 カーネルコードで明示的にベクトル化する必要がある • Intrinsics, AIE API (2021.2 以降) の2つの書き方が可能 intrinsics: https://www.xilinx.com/html_docs/xilinx2021_2/aiengine_intrinsics/intrinsics/index.html AIE API: https://www.xilinx.com/html_docs/xilinx2021_2/aiengine_api/aie_api/doc/index.html Copyright © Fixstars Group 26
Fixstars Corporation www.fixstars.com FIR Filter on AI Engine: SIMD 化 (cont.) • SIMD により 16 要素の Y の計算を同時に行う場合の例 • • mac16 で、16要素の乗加算を 1命令で行う 可読性を重視したため、最適化率は低め 総和部分の SIMD化 Copyright © Fixstars Group 27
Fixstars Corporation www.fixstars.com FIR Filter on AI Engine: SIMD 化 (cont.) • SIMD 化後の処理性能 • • 8倍弱程度の性能向上 演算器の性能としては SIMD の あり/なしで 64倍ほど性能が変わるので、 ちゃんとチューニングすればもう 8倍くらいは達成の余地あり 実装 実行時間 処理レート (samples/sec) 処理レート (cycles/sample) naive 実装 1888.16 ms 2.22 Msamples / sec 562.71 SIMD 版 254.609 ms 16.47 Msamples / sec 75.90 • SIMD の あり / なしで劇的に性能が変わるため、 ちゃんと適用していくことが大事 Copyright © Fixstars Group 28
Fixstars Corporation www.fixstars.com FIR Filter on AI Engine: その他チューニング • 今回は 1 コアしか使っていないが、AIE はコア数が膨大なため、 複数コアを使うと当然性能は向上する • • • 今回は複数コアまでは行えず データ並列、タスク並列性などを抽出していくのが大事 とはいっても、カーネル毎のチューニングとか 複数コアに載せるとか一からやっていくのは大変... → Xilinx 提供のライブラリを使いましょう Copyright © Fixstars Group 29
Fixstars Corporation www.fixstars.com Xilinx 提供のライブラリ • AI (DNN) 処理 • Vitis-AI で DPU が提供されている • • https://github.com/Xilinx/Vitis-AI AI 処理以外 • Vitis Libraries にいくつかのライブラリが提供されている • https://xilinx.github.io/Vitis_Libraries/ • DSP / Vision のライブラリが現在提供されている • 今回実装した FIR も Vitis Libraries 内にあります Copyright © Fixstars Group 30
Fixstars Corporation www.fixstars.com まとめ • AI Engine は FPGA のいいところを残しつつ 演算性能を強化できる面白いアーキテクチャ • • • PL との密結合 VLIW SIMD プロセッサで構成されるメニーコア AI Engine の性能を十分に引き出すには、 AI Engine 側のプログラムのチューニングがかなり重要 • • SIMD の使用 複数コアの使用 • • • • データ並列 タスク並列 PL 側で AIE が処理しやすいような形に整形するのも大事 AI Engine のチューニングは大変なので Vitis Libraries 等を活用していくのも大事 Copyright © Fixstars Group 31
Fixstars Corporation www.fixstars.com Alveo!でLinuxを動かす Copyright © Fixstars Group Copyright © Fixstars Group
Fixstars Corporation www.fixstars.com Who I am Kenta IDA 写真 井田 健太 ソリューション第一事業部 シニアエンジニア Copyright © Fixstars Group 33
Fixstars Corporation www.fixstars.com FPGA上でLinuxを動かす(再掲) • Linuxで動作する豊富なソフトウェア資産を使いたい • • 現実的には、各FPGAベンダーのCPU内蔵FPGA製品を使う • • e.g. ドライバ、ネットワークスタック、ライブラリ Xilinx: Zynq等, Intel: Cyclone V SoC等 CPU内蔵ではないFPGAの場合 • 各社が提供するソフトCPUコアを使う • • • Xilinx: Microblaze (MMU構成) Intel: Nios II/f ベンダが提供する方法に従えば、比較的簡単に動作する Copyright © Fixstars Group 34
Fixstars Corporation www.fixstars.com ベンダ提供ツールが用意してくれるもの(再掲) • ベンダ提供のLinux環境構築ツールは様々なものを自動的に用意してくれる • • • • • • • • ハードウェア構成を表すデバイスツリー ファームウェアをロードして実行するブートローダー デバイスツリーに基づいて 基本的なハードウェアの初期化を行うファームウェアやセカンドブートローダー 対象のハードウェア上で動作するように設定されたLinuxカーネルイメージ システムの動作に必要なものが含まれているルートファイルシステムイメージ 上記のものに含まれるプログラムをコンパイルするための クロスコンパイル用ツールチェイン ターゲット上のプログラムをデバッグするためのデバッガ ベンダはYocto Projectや YoctoをカスタマイズしたものをLinux環境構築ツールとして提供 • Xilinx: PetaLinux Copyright © Fixstars Group 35
Fixstars Corporation www.fixstars.com RISC-VのCPUコア(再掲) • RISC-V: オープンソースの命令セットアーキテクチャ(ISA) • 実装自体はオープン、クローズド、有償、無償、どちらもある • • • ISAがロイヤリティ・フリーのため コアのライセンス料が他のCPUより安いことが期待されることが多い ISAを独自拡張して実験してもOKなので、 CPUアーキテクチャの研究にも良く用いられる (というかそれが目的で作られた) 現在ではFPGAで動作するソフトCPUコアや、 実際にSoC上に実装されたものどちらも容易に入手可能 実際にLinuxが動作する SoC SiFive Freedom U740搭載 ボード (SiFive HiFive Unmatched) RISC-Vのページに記載されている SoCやCPUコア一覧 出典: https://www.sifive.com/boards/hifive-unmatched 出典: https://riscv.org/exchange/cores-socs/ Copyright © Fixstars Group 36
Fixstars Corporation www.fixstars.com Linuxの動作に必要な機能 (再掲) • 最低限の命令セットサポート • • • • • MMUによる仮想メモリのサポート • • RISC-V 32bitの基本命令 (I) 乗算命令 (M) アトミック命令 (A) 圧縮命令 (C) は必須ではない (カーネルの設定で無効化可能) 厳密にはMMU無しの構成も可能だが、実用性に欠く タイマーによる時刻取得と指定時刻での割り込み • スケジューリングに必要 Copyright © Fixstars Group 37
Fixstars Corporation www.fixstars.com Linuxの動作に必須ではないがほしい機能 (再掲) • コンソール入出力 • • • デバッガ接続機能 • • • フレームバッファによるコンソール出力、キーボードによる入力 シリアル(UART)通信による入出力 トラブルシューティングにデバッガが無いとかなりキビシイ FPGAなので内部信号の観測ロジックなどを埋め込め無くはないが非効率的 比較的高速なOSイメージの転送手段 • ルートファイルシステムやカーネルのイメージを何度も更新するので Copyright © Fixstars Group 38
Fixstars Corporation www.fixstars.com VexRiscv (再掲) https://github.com/SpinalHDL/VexRiscv • オープンソースのRISC-V実装 • SpinalHDLで記述されている • • • • 基本機能のコアに対してプラグイン方式で機能拡張が行える • • • • Chiselから派生したハードウェア記述言語 Chisel同様ScalaのDSL 文法はChiselとかなり異なる印象 基本機能:RV32IA (RISC-V 32bitの基本命令+アトミック命令) MMUの有無、乗算器の構成、除算器の構成、圧縮命令のサポート、CSRのサポート デバッガインターフェースもプラグインでサポート可能 FPGA向けの実装として、FPGAでよく使われるバスIFをサポート • Wishboneだけでなく、AXI4やAvalonMMをサポートしている • • Vivadoぽちぽちまんに優しい設計 LiteXというFPGA向けシステム設計ツールのCPUコアとしてLinux動作実績あり Copyright © Fixstars Group 39
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 Copyright © Fixstars Group 40
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側) デバッグ ホストインターフェース Copyright © Fixstars Group 41
Fixstars Corporation www.fixstars.com Alveo向けデザインの開発フロー • 2つの開発フローをサポート • • • Vivadoフロー Vitisフロー Vivadoフロー • • • 従来の、RTLやIP Integratorを用いたIPベース設計によるフロー フルカスタムの設計が可能 Vitisフローに比べて手間がかかる (ということになっている) • • ホストとの通信機能の実装など Vitisフロー • • • • Vitisを用いたHLSを軸としたアクセラレータ開発フロー ボードごとに用意されたシェル上で、目的とする演算を行うカーネルをHLSで開発 ホストからカーネルをPCIe経由で書き換える機能が標準で提供される カーネルへのデータ転送などはシェル側の機能で行う • • XRTと呼ばれるホスト側のランタイム環境が標準で提供される カーネルの起動やデータ転送はXRTの関数を呼べば実行できる Copyright © Fixstars Group 42
Fixstars Corporation www.fixstars.com Vitisフローの利点 • • 開発が楽になるかどうか…は内容によるので置いておく PCIe経由での安全なコンフィグレーション機能が便利 • PCIeを扱うデザインの開発時… • 誤操作でPCIeコアがハングアップ、そのままホストも一緒にフリーズ • • リモートワーク中だと、誰かに再起動をお願いすることに… Vitis (というかXRT) の場合 • • • PCIeコア自体はユーザーが開発する部分の外側にある • • Xilinxが提供するシェルと呼ばれるデザインに含まれている ユーザーのカーネルはシェルのPRリージョンにPRでコンフィグレーションされる • AXI FIrewall: スレーブ側が応答を返さないなどの場合、 タイムアウトしてダミー応答を返すIP PCIeコア周辺にAXI Firewall等のハングアップ対策コアが入っている XRT管理コマンド経由でカーネルのリセットをアサートしたりできる • 復帰する仕組みが初めから用意されている Copyright © Fixstars Group 43
Fixstars Corporation www.fixstars.com VexRiscvはVitisフローでうごかせるのか? • • • • 動かせる VitisにはHLSで記述したカーネルだけでなく、RTLで記述したカーネルもサポート • そのまま、RTLカーネルと呼ばれる • このあたりは UG1393 に記載されている ただし、何でもRTLカーネルに出来るわけではなく、いくつかの制約がある ポート (インターフェース) • • • • • • クロック入力 リセット入力 (Active Low) 割り込み出力 (Active High) AXI4 Lite Slave • ホストからのレジスタアクセス • FPGA上のメモリへのアクセス • ホスト-カーネル間や、カーネル-カーネル間の通信 AXI4 Master AXI4 Stream (Master/Slave) UG1393: https://docs.xilinx.com/r/en-US/ug1393-vitis-application-acceleration/RTL-Kernels Copyright © Fixstars Group 44
Fixstars Corporation www.fixstars.com Vitisにおけるカーネルの実行制御 • AXI4 Lite Slaveの制御レジスタによる制御 • • • • • 0x10番地移行はカーネルのパラメータ用に使用 カーネルのAXI Masterが使用するFPGA側メモリのアドレス指定にも利用 • • HLSで出てくる ap_ctrl_hs と同様 Controlレジスタ(右図) での実行制御 ap_startに1を書き込んで実行開始 void kernel(const uint32_t* in, uint32_t* out); とすれば in と out のFPGA上メモリのアドレスがレジスタに設定される …という約束を守る以外にも、 User Managed RTL Kernel というものがある UG1393: https://docs.xilinx.com/r/en-US/ug1393-vitis-application-acceleration/RTL-Kernels Copyright © Fixstars Group 45
Fixstars Corporation www.fixstars.com User Managed RTL Kernel • • XRTにカーネルを制御してもらうのではなく、自分で制御する • • • 独自構成の制御レジスタで実行制御する そもそも実行制御とかない などなど • • ただし、s_axi_control のレジスタはXRTは使用しない AXI Masterなど他のインターフェースは同様に利用可能 外部インターフェースとしてはXRT Managedなカーネルと同様 Copyright © Fixstars Group 46
Fixstars Corporation www.fixstars.com VexRiscvシステムのUser Managed Kernel化 • LiteFury向けに作成したブロックデザインを改変してIP化する Copyright © Fixstars Group 47
Fixstars Corporation www.fixstars.com VivadoのPackage IP機能でRTLカーネルを作成 • Block Designを含むプロジェクトで[Tools->Create and Package New IP] を選択 • ウィザードで BDをパッケージ化する オプションを選ぶ Copyright © Fixstars Group 48
Fixstars Corporation www.fixstars.com VivadoのPackage IP機能でRTLカーネルを作成 • [Compatibility] タブで “Package for Vitis”にチェックを付ける • • Control protocolを “user_managed” にする [Ignore Freq_Hz] にチェックを付ける Copyright © Fixstars Group 49
Fixstars Corporation www.fixstars.com VivadoのPackage IP機能でRTLカーネルを作成 • 自動認識のレジスタ定義を全部消してレジスタを定義しなおす • レジスタ空間: 0x0000~0xffff の 0x10000 の範囲 (64[kiB]) • 後述するが、現状64[kiB]以上は使えない模様 Copyright © Fixstars Group 50
Fixstars Corporation www.fixstars.com VivadoのPackage IP機能でRTLカーネルを作成 • ダミーのメモリポインタレジスタを定義する • • 定義しないとVitisがAXI Masterポートを認識してくれない ASSOCIATED_BUSIFパラメータを追加して、対象のAXI Masterポート名を設定 • この場合は m_axi_mem Copyright © Fixstars Group 51
Fixstars Corporation www.fixstars.com VivadoのPackage IP機能でRTLカーネルを作成 • ダミーのレジスタを定義する • 定義しないとVitisがAXI Slaveポートを認識してくれない Copyright © Fixstars Group 52
Fixstars Corporation www.fixstars.com できあがり!? • • クロック、リセット、レジスタアクセス、メモリアクセスを持つカーネルが完成 vexriscv_vitis.xo という名前で保存 と思ったら罠が待っていた Copyright © Fixstars Group 53
Fixstars Corporation www.fixstars.com kernel.xmlの修正 • • • vexriscv_vitis.xoなど *.xo は例のごとくzipファイル 中に kernel.xml という名前でカーネルの定義が書かれている このカーネル定義のAXI Slaveポートのレジスタ範囲が正しくない • • rangeを0x10000 (64k) に設定したのに、なぜか固定で 0x1000 で出てくる 仕方ないので手動で修正 (画像は修正後) • xoをunzipで展開→修正→zipで再圧縮 Copyright © Fixstars Group 54
Fixstars Corporation www.fixstars.com Vitisフローでシステムデザインの作成 • 作成した vexriscv_vitis.xo をVitisのカーネルプロジェクトにImport • src以下に入れないと認識しない模様 Copyright © Fixstars Group 55
Fixstars Corporation www.fixstars.com Vitisフローでシステムデザインの作成 • Vitisのリンク処理の設定をする • 手動で --user_ip_repo_paths で、VexRiscvコアの場所を指定する Copyright © Fixstars Group 56
Fixstars Corporation www.fixstars.com Vitisフローでシステムデザインの作成 • Vitisのリンク処理の設定をする • • • • DRAMとしてHBM[8]を使うように指定する HBMは番号ごとにアドレスが固定になっており、HBM[8]は0x8000_0000から256[MiB] VexRiscvは0x8000_0000から実行開始するのでHBM[8]の必要あり ChipScope Debugを有効にしてデバッグ可能にしておく Copyright © Fixstars Group 57
Fixstars Corporation www.fixstars.com Vitisフローでシステムデザインの作成 • リンク処理を行うと、 カーネルを含むブロックデザインが生成&合成&配置配線される • • • • カーネル本体 ホストとのレジスタアクセス用のAXI4 Lite接続 デバッグ用のSystem ILA FPGA側メモリへのAXI4接続 Copyright © Fixstars Group 58
Fixstars Corporation www.fixstars.com 合成したデザインの書き込み • • • • 通常の演算カーネルは、XRTを用いてホスト側のソフトウェアを作成する 今回は勝手に動いているCPUコアなのでホスト側ソフトウェア不要 代わりにXRTに付属する xbutil プログラムを使ってデザインを書き込む xbutil reset –device (デバイス) でターゲットをリセット Copyright © Fixstars Group 59
Fixstars Corporation www.fixstars.com 合成したデザインの書き込み • xbutil program –device (デバイス) -u (xclbin)で書き込み • ILAを使うためのケーブルサーバーを立ち上げておく • Hardware ManagerからAdd Xilinx Virtual Cableで追加できる Copyright © Fixstars Group 60
Fixstars Corporation www.fixstars.com Hardware Managerでの接続とILAの動作 • JTAG接続と同様に使用可能 Copyright © Fixstars Group 61
Fixstars Corporation www.fixstars.com カーネルイメージなどのDRAMへの配置 • • • 図の配置になるように、あらかじめホストからDRAM上にイメージを書き込んでおく 注意点:デバイスツリーはLinux Kernelイメージより 上位の領域に配置する必要がある XRTのアンマネージド転送機能を使って指定したアドレスに データを転送しておく • • xclUnmgdPwrite/xclUnmgdPread ※アプリケーションからむやみに使うなと書いてある Copyright © Fixstars Group 62
Fixstars Corporation www.fixstars.com カーネルイメージなどのDRAMへの配置 • メモリ配置通りにDRAM転送してベリファイ • • • • • BOOTROM Device Tree OpenSBI Kernel RootFS Copyright © Fixstars Group 63
Fixstars Corporation www.fixstars.com 動作確認結果 • カーネル起動中にpanicとなり、正常動作は確認できなかった • • • 前回Device Treeの配置を間違ったときの現象に似ているが… CPUからみた構成はLiteFuryで動作したものと変わっていないはず… 今後の検証課題として継続調査予定 Copyright © Fixstars Group 64
Fixstars Corporation www.fixstars.com Thank You お問い合わせ窓口 : [email protected] Copyright © Fixstars Group Copyright © Fixstars Group