43.3K Views
April 26, 22
スライド概要
2022/4/25に開催した「TIER IV 自動運転向け RTL-FPGA 開発 テックミートアップ」の資料です。
TIER IV 自動運転向け RTL-FPGA Meetup オープンな資産とFPGAを活用して 領域特化型プロセッサを作ろう! MURAKAMI DAICHI 村上 太一 略歴: ~2013: 東大 (理) 情報科学科卒 2019: 東 大院CS(修士)中退 2020~: 社会人 2022 / 04 / 25 仕事: プロセッサを作ること 特技: プロセッサを作ること 趣味: プロセッサを作ること
TIER IV 「動く”アクセラレータ”をつくって!」 なんてリクエストがあるかもしれませんね! どうやって実装/実証しよう ~(-_-`c もっと知りたい!を多数いただきましたら、 誠心誠意前向きに対応検討いたします TIER IV Tech Blogの記事となります! https://tech.tier4.jp/ (あたりまえだが、自動運転の記事が多い) アンケートからどうぞ! がんばる~
TIER IV テーマ: プロセッサ PoC をしたい [前半] 設計から実装へ!設計を使い回して楽をするぞ! 共通の設計で、様々な適用範囲を! 自動運転とApplication Specific SIMT そういえばSIMT、どうやって実装するもんだ...? [後半] 実装から実証へ!動かないと始まらない! RISC-V採用の恩恵 “ソフトウェア”が”プロセッサ”で動くまで Autowareと、つなげて楽しい、プロセッサ
TIER IV JANUARY / 2021 設計から実装へ! 設計を使い回して楽をするぞ! JANUARY / 2021 TITLE
TIER IV 設計を使いまわすためには? Autowareはまことに多くのApplicationの集合体 [課題]実装したものを多方面に適用したい Data/Thread並列 Localization Planning/Control Sensor Processing [方針]ソフトウェアで処理を変更可能 CNN Detect/Track/Predict [手段]RISC-V ISAの解釈系の実装 [観察]データ並列/スレッド並列の処理が多い その他にもいっぱい! Safety Application Hard Deadline Application Hardware Controller [方針]並列の制御自体 = 共 通設計化 [手段]Application Specific SIMT [結論] RISC-Vな Application Specific SIMT
TIER IV Appendix: 時系列でAutowareをのぞいてみると...? Perception (LiDAR) Locilazation Camera Data Processing Localization LiDAR Data Preprocessing LiDAR Data Preprocessing Planning/Control Planning/Control Perception (Camera) LiDAR Data Preprocessing / Localization (赤) は比較的まとまった CPU占有がある (どちらも) データ/スレッド並列処理である
TIER IV 一つの設計で二つの領域をカバー Data/Thread並列 単精度SIMT for Localization 整数SIMT for Sensor Processing Localization Planning/Control Sensor Processing FPU有 並列度中 [現状] 単精度/整数の2パターンでカバー より多くのパターンが実現できる [適用の可能性] 今後どのような(データ/スレッド並列があっても) 共通化された並列設計を転用可能 FPU無 並列度高 Application Specific SIMT という唯一の実装 RISC-V ISAの汎用SIMT
TIER IV Application Specific SIMT: Computing Unit Computing Unit Internal Bus Controller Banked Scratch Pad Local Memory ● ● Kernel Register (CSR) As a Scratch Pad Memory As an Instruction Memory Load Store Unit (Embedded Atomic Memory) Branch Controller (execution mask, activity counter) Wavefront Controller APPLICATION SPECIFIC PROCESSOR LANES ID Register (CSR) Register file
TIER IV Application Specific SIMT: Overview ETH PHY Top Module AXI SLV1 AXI MST AXI SLV2 Packet Converter CU Management Unit AXI <-> Internal Bus Internal BUS Application Specific CU0 PEs REGFILE Local SPM Application Specific CU2 PEs REGFILE Local SPM CU0 Gate CU1 Gate CU2 Gate CU3 Gate CU Controller Application Specific CU1 Local SPM REGFILE PEs Application Specific CU3 Local SPM REGFILE PEs
TIER IV FPGAを利用したHornet/Dragonflyの実装 Target Device VCK190 LiDAR ETH (PL) Packet Converter SPM UDP Block Interrupt (Kicking kernel polar ~ outlier) PL (DF) 整数SIMT Polar to Cartesian Cropping (vehicle) Cropping (side mirror) Transform Cropping (farrange) Voxel Grid Filter 単精度 SIMT NDT Random Sampler right/outlier_filtere d/pointclo ud EKF Distortion Correction left/outlier_filte red /po intcloud Ground Filter Ring Outlier Filter top/outlier_filte red/pointcloud Scan Interrupt ETH (PS) DRAM SCAN DATA (top/rectified/pointcloud) top/rectified/pointc lou d PS SCAN DATA (dow nsample/pointcloud) downsample/pointcloud Filtered Flag AI Engine (Centerpoint)
TIER IV
APPENDIX
LOCALIZATIONの例: NDT SCAN MATCHING
地図点群
参照点
Voxel分割+分布計算
センサ点群
入力点
近傍Voxelを取得
(木探索..空間ハッシュ...etc…)
位置/姿勢の尤度関数に対してニュートン法
(各点の自由度は6 [=回転3並進3])
疑似コード
// ス コア値が一定以下になるまでまわす
while (matching score < target score)
{
// 約 2,000 入力点群について並列計算
for each point in Sensor Points {
// 地 図点群(ボクセル)から近傍を取得
voxels = find_near_voxels_in_map(map, point);
// 各 点に対してヘッセ行列を計算
// ヘ ッセ行列のサイズは6*6
point.hessian = [update hessian matrix]
}
// 求めたヘッセ行列から、poseをちょっとずらす
pose = [update pose]
// スコア値を計算
score = [calc score]
}
上記計算は、単精度浮動小数
TIER IV SIMT Architectureの一般的な装例の例 キーポイントはたった2つ 1. 経時マルチスレッディング機構 a. Application Specific Unitのレイテンシ(データ依存)隠蔽 b. 複雑な依存解決の機構を排除しつつ、Unitの稼動率 ↑ 1. 分岐機構 a. 一つの命令流で、分岐を実現する方法
TIER IV 経時マルチスレッディング (Temporal Multhithreading) ● Unit EXEC Cycle = 2 pc=N thread 0 writeback DF thread 1 EX EX WB DF EX EX WB DF EX EX WB DF EX EX WB DF EX EX WB DF EX EX DF EX thread 2 data fetch thread 3 pc=N+4 Unit thread 0 thread 1 thread 2 thread 3 REGISTER FILE DF cycle [方法] 各サイクル毎に、別スレッドの同じPCの命令を発行していく [利点] 複雑な依存解決の仕組みが無い [効能] (後述の分岐が無い限り) Unitを毎サイクル使用することができる
TIER IV
分岐器の実現
if (thread_id > 1) {
ret = -1;
} else {
ret = 1;
}
Activity Counter
thread 0
thread 1
thread 2
thread 3
0
0
0
0
1
1
0
0
0
0
0
0
0
0
1
1
0
0
0
0
push
push & pop
PC Stack
PC Stack
pop
PC Stack
実行
[仕組み] Activity Counterが0以外のスレッド = 演算UnitをOFF (WritebackもOFF)
[汎用性] ネストされたif文, while loop等は、activity counterが増加 (2..3…)
[分岐時] 条件を満たさない -> PC Stackへpushしactivity counterをインクリメント
[合流時] Current PC == PC Stack.topの時、popし、activity counterをデクリメント
TIER IV 分岐器の実現 (初期状態) ● UNIT数 = 4 (横方向), 経時マルチスレッディングのスレッド数 = 4 (時間方向) の場合 Thread 0 Thread 1 Thread 2 Thread 3 Thread 4 Thread 5 Thread 6 Thread 7 Thread 8 Thread 9 Thread 10 Thread 11 Thread 12 Thread 13 Thread 14 Thread 15 経時方向 斉時方向
TIER IV 分岐器の実現 (Taken Path実行中) ● UNIT数 = 4 (横方向), 経時マルチスレッディングのスレッド数 = 4 (時間方向) の場合 Thread 0 Thread 1 Thread 2 Thread 3 Thread 4 Thread 5 Thread 6 Thread 7 Thread 8 Thread 9 Thread 10 Thread 11 Thread 12 Thread 13 Thread 14 Thread 15 経時方向 斉時方向
TIER IV 分岐器の実現 (Untaken Path実行中) ● UNIT数 = 4 (横方向), 経時マルチスレッディングのスレッド数 = 4 (時間方向) の場合 Thread 0 Thread 1 Thread 2 Thread 3 Thread 4 Thread 5 Thread 6 Thread 7 Thread 8 Thread 9 Thread 10 Thread 11 Thread 12 Thread 13 Thread 14 Thread 15 経時方向 斉時方向
TIER IV 分岐器の実現 (合流) ● ● ● 斉時スレッド数 = 4 x 経時スレッド数 = 4 (= 16スレッド) この16スレッド一まとまりを、CUDA用語にてWarp, OpenCL用語にてWavefrontと呼び (注) この中での分岐は、できるだけ回避すべき Thread 0 Thread 1 Thread 2 Thread 3 Thread 4 Thread 5 Thread 6 Thread 7 Thread 8 Thread 9 Thread 10 Thread 11 Thread 12 Thread 13 Thread 14 Thread 15 経時方向 斉時方向 注 : 実装がこうであるとは限らない
TIER IV RISC-V ISAを SIMT アーキテクチャに(そのまま)適用する 各スレッドからみたら、SIMTアーキテクチャも一つのCPUである ● 算術命令: ADD… そのまま実装すればよい ● メモリ命令: LOAD, STORE… ● 同期命令: Fence, A拡張 メモリ領域を限定したり、調停したり多コア用の一般的な工夫は 必要 ● 制御命令: BRANCH, JAL, JALR BRANCHの分岐度(Divergence)は2, JALRはWFなどある
TIER IV RISC-Vに是非拡張したい命令例 空間木と条件ムーブ 演算器使用率がぐっと減 BNEZ Condition B1: MV Next Addr, R-Tree Addr B1: BEQZ Condition B2: MV Next Addr, L-Tree Addr B2: 一命令で可能。演算器使用率も不変 CMOVE Next, Condition, R-Tree Addr, L-Tree Addr もちろんメモリのアクセス等、 他にも考えることは多い X方向に分割 Y方向に分割
TIER IV JANUARY / 2021 実装から実証へ! 動かないと始まらない! ソフトウェアを動作させる道のり... コンパイラからロードまで JANUARY / 2021 TITLE
TIER IV RISC-Vのススメ [SW的なメリット] RISC-V (一般的なISA) を採用する! LLVM (Compiler Infrastructure) を使って、ソフトウェア的な開発がはかどる! 以下の必須級のツール群がもれなく使える! ● ● ● ● [コンパイラ] Clang (フロント), LLC (アセンブラ) [デバッガ] LLDB (Debugger) [各バイナリツール] Objcopy, Objdump, Readelf… [リンカ] LLD RISC-V 命令セットの実装自体が単純明快 Test Case等、開発にほしいものが広く公開されいる ● 様々な面でゼロベースの開発にならない RISC-V Test Case (例)https://github.com/riscv-software-src/riscv-tests 単純すぎてそのまま実装してもいいプロセッサにならない マイクロアーキテクチャの手腕を問われる
TIER IV LLVMのススメ 例えばPOWER命令を以下のように定義する Power; fs2^(fs1): FPOW.S FD FS1 FS2 Opcode: OP_FP = 7'b1010011 ● FUNCT7: 7'b0110000 (FPOW.S) llvm-project/llvm/lib/Target/RISCV/RISCVInstrInfo.tdに上の3行を追加するだけで CompilerやDisassembler、Debuggerなどが全て対応され、例えばインラインアセンブラの形 で対応できる。(推論させたい命令はもっと難しいが...)
TIER IV ソフトウェアを動作させる3項 1. スタートアップルーチンの設定 真に驚くべきことに、 これだけで処理を呼ぶだけなら可能。 4行目でスタックの設定 5行目でmainにjmp 6行目でAcceleratorの終了 (CSRの拡張) スタートアップルーチンでは、 特にC標準ライブラリと併用するには、 - 4行目 _lspm_end シンボルは次のリンカで定義されている 初期化ルーチン (Signal Handler初期化等) メモリ領域のクリア など行うべき事柄は多い。 ただ、実際は必要になったら考える形でいい。 ライブラリが要らないPoCはこんなもんさ!
TIER IV ソフトウェアを動作させる3項 entryのシンボル 2. リンカスクリプトの構築 リンカスクリプトの基本は2つ 1. メモリ定義 (MEMORY) 2. セクションとメモリの関係の記述 (SECTIONS) 最悪動作させるだけなら、コード/データをどう配置す るかだけでよく、左の例でいくと cram だけを抜粋し たものだけでよい。 メモリ定義 シンボルの定義はC言語からは extern int _signature; int * signature = &_signature; のように利用することができる。 引数データの受け渡し等はこの仕組みで行われる。 section map と シンボル配置
TIER IV ソフトウェアを動作させる3項 3. アセンブラによる、RISC-Vから拡張した機能の使用 自分のスレッドIDを取得する関数 CSRの特定のアドレスにMAPされている CSR Readが実態 上記のようなインラインアセンブラで記述したものを、ライブラリ化してしまう 他の方法について、LLVMにbuiltinで実装してしまえば、ライブラリ化する必要は無い
TIER IV 完成!こんなプログラムが動作する! ライブラリ 例: コンパイルコマンド: $ clang -nodefaultlibs ¥¥ ラリは無し -fno-builtin ¥¥ -march=rv32imaf ¥¥ -mabi=ilp32f ¥¥ るbit幅 -T lscript.ld ¥¥ リプト指定 -static ¥¥ -I./ -L./ ¥¥ -laccelerator ¥¥ のリンク sample.c startup.s #標準ライブ #c拡張はサポート無 #型に対応す #リンカスク #ライブラリ
TIER IV FPGA上へロードさせて、動作させよう! HOST PC Autoware Autoware(ETH) Scan Matching (Rviz, Autoware) Debug Console FPGA Control Console Debug Console (Serial) FPGA (Zynq) ある種の通信でHostのAutowareと接続する UART, ETH (TCP/IP), PCIe… 今回はそこそこのデータ転送に耐え、可搬性に 富み、(PCIeよりとっつきやすかった) ETH (TCP/IP) で接続
TIER IV ZYNQ向けTOP Moduleのススメ I/O Module, Crossbar は用意されている 弊社IP様 できるだけIRQやAXI命名規則を あわせてTOPにしておく 各用途のAXIバス+IRQのみで 十分PoCは可能 → これでZYNQのPS(ARM)につな IPをPackage化 がる! Auto Infer Interface: I/F自動推論 → Vivado (Block Design) Vivado (Package Manager) C言語で簡単(?)にPoCできる
TIER IV FPGA上へロードさせて、動作させよう! HOST PC ZYNQ DRIVER (NDT_SCAN_MATCHER) 1. Initialization 2. Data Loading (地図等のロード) 3. Code Loading 4. for each LiDAR Data Rosbag Play sensing a. b. c. d. 5. RViz Trans. Data Kernel Exec Wait IRQ Receive Result T C P / I P PS (ARM) lwIP Application TCP/IP上のProtocolと AXI Busの受け渡し A X I PL IP IRQ Publish as ROS2 topic EKF ZYNQのサンプルApp. として Lightweight IPを使用したApplicationが提供されている これを改造することで、TCP/IPとAXI(Accelerator IP) の橋渡しを実現できる。 このTCP/IP上の(何らかの)プロトコルと、ROS2の橋渡 しを行うドライバをHOST PCに実装すれば Autowareと動作するシステムが構築できる
TIER IV 或いはKRIAなら...? HOST PC KRIA Rosbag Play D D S sensing DRIVER (NDT_SCAN_MATCHER) 1. Initialization 2. Data Loading (地図等のロード) 3. Code Loading 4. for each LiDAR Data a. b. c. d. 5. RViz EKF Trans. Data Kernel Exec Wait IRQ Receive Result A X I PL IP IRQ Publish as ROS2 topic 理想としては、DDS (Data Distribution Service) = Autowareのノード間通信 まで、FPGA側に寄せる。 既存のAutoware (ROS2 Application) の実装のままに、FPGAでの実証が可能 Xilinx社製品として、このようなROS2用SDKを搭載した製品(Kria)が登場した https://www.xilinx.com/products/som/kria.html ほしい!
TIER IV LLDB/GDB Remote Protocolのススメ UIやFile Parseを自作する必要が無い Frontend Backend Native Machine (一般的な使い方) Terminal GDB/LLDB ↓多 分できるんじゃないかなぁ...? VSCode等 色々な実行主体に対応! 何らか のIF RSP TCP TCP/IP UART TCP RSP TCP/IP Remote Machine (違うマシン、例えばFPGAとかでもOK) Accelerator Simulator (プログラム実行はシミュレーターでもOK) Backendに必要なこと: TCP@12345あたりでListenし、TCP上のプロトコル(ほぼASCII文字列)を解釈する。=> Socketプログラミングだけ プログラムのデバッグでは無く、プロセッサ開発自身のデバッガとしても使用できる!
TIER IV LLDB/GDB RSP (Remote Serial Protocol)の例 LLDBでtest1を対象に起動 -> remoteにconnect software simulatorをport 12345で待受 プロトコルの未実装で、変数が読めていないところ(実装せねば...)
TIER IV LLDB/GDB RSP (Remote Serial Protocol)の例 LLDBの画面 Simulatorの画面 まぁまぁの数の プロトコルを実装する 必要はある 地道に実装だ...! ステップ実行 スレッドの切り替え disassembler frameの確認 こういったインターフェースを自 作するのは骨がおれる... LLDBを使えば...!
TIER IV LLDB/GDB RSP (Remote Serial Protocol)の例 # 基本メッセージフォーマット (下層はTCP/IPやUARTを想定) [+/-]$[payload]#[hex 8-bit crc of payload] (先頭の[+/-]は AckMode のみ、+は要求受け入れ-は再送要求) +単体等をconnect時に送信したりする。再送の時は-を要求する。 TCP/IPにおいては、全く必要ない。 プロトコル自体は以下に仕様がある。割と量はある。がんばろう! ● ● GDB Remote Serial Protocol: https://sourceware.org/gdb/onlinedocs/gdb/Remote-Protocol.html https://github.com/llvm/llvm-project/blob/main/lldb/docs/lldb-gdb-remote.txt (LLDB)
TIER IV Appendix: qRegisterInfoについて ● ● qRegisterInfo ○ Formatとしては、以下のようなyaml形式で返却をする ○ 0番レジスタの例 ■ name:x0;bitsize:32;offset:0;format:hex;set:General Purpose Registers; ○ 1番レジスタの例 ■ name:x1;bitsize:32;offset:4;format:hex;set:General Purpose Registers; そして、上記だけでは不十分であり、以下の特殊レジスタについては、補足情報が必要になる。 ○ SP (RISC-V ISA ではGPRの2番) ■ name:x2;bitsize:32;offset:8;format:hex;set:General Purpose Registers;generic:sp; ○ FP (RISC-V ISAではGPRの8番) ■ name:x8;bitsize:32;offset:32;format:hex;set:General Purpose Registers;generic:fp; ○ PC (仮 想的に32番レジスタを追加し、それをPCとする) ■ name:pc;bitsize:32;offset:128;format:hex;set:General Purpose Registers;generic:pc; RISC-VにおいてPCはGPRとしては無いが、仮想的に32番レジスタを割り当てられている ため、qRegiseterInfoの返却に含める必要がある。 ちなみにFPRの0番レジスタは、33番レジスタ扱い
TIER IV 一番下にPCが見えている
TIER IV Verilator RTL Simulator: https://www.veripool.org/verilator/ 並列プロセッサの恩恵が受けられる! (Big3: 超有名なSimulatorのこと) Verilatorでは、Verilogのサブセットとなる #5や、##10等のタイミングコントロール系が使えない
TIER IV VerilatorのInstall (Macでもお手軽?RTL開発!) # Verilator ● apt install verilator (Linux, WSL) ● brew install verilator (Mac) # GTK Wave (波形Viewer) ● apt install gtkwave (Linux, Windowsではappが有) ● brew install --cask gtkwave (Mac)
TIER IV Verilatorのススメ ● ● make TARGET=test1 make view # ELF実行Fileのtest1を対象にverilatorを起動 # viewer (GTK-Wave)を起動 みたいにしておくと便利。testbench自体はC言語なので、ELFのパースも簡単 RISC-Vの命令が実行されていく ← が このあたり 動いている様子 Simulation上の開発だけであれば、必要十分! 今すぐはじめられそう!
TIER IV Verilatorのススメ (おまけ: Makefile) 非常に楽
TIER IV Verilatorのススメ (Pitfall) ● Testbenchとのコンパイル(リンク)時に、未定義シンボルエラーが出る ○ ○ C言語で記述するTestbenchで、実装しなければならないものがある 特に $time() system functionは double sc_time_stamp() 関数を、C言語上、実装しなければならない ● Logic [0:7] a; ○ Up-ToなシグナルについてWarningが出る。 ○ 実際これでWarningがいっぱい出た (それでも動く) ● 普段使いのTOOLでは通る曖昧な構文たち... ○ 例: 符号つきの計算の挙動 ■ genvar iとして、i - 3 < 0 は真にならない。 (あるToolでは真になり得ず、他のToolでは真になる。どっちが正しかったっ け...?) ○ 明示する: $signed(i - 3) < 0
TIER IV まとめ: 汎用からはじめる専用化! ● 既存資産、OSSを使い倒す、汎用からのアプローチ! ○ もちろん、使ったOSSには貢献しよう (自戒...) ● 専用化に必要なものは、ただ一向なApplicationの理解! ○ 僕の仕事は、自動運転のアルゴリズムを読み解くこと ○ (というかTIER IVの本業はこっち) ● 自動運転は専用化の宝庫! ○ 意味のあるプロセッサの開発ができる。とってもうれしい。 ● RTLじゃなくたっていい!来たれプロセッサラバー! ○ スタックを積みたい人が向いているような?はてさて...
TIER IV 本当のまとめ おいでよ!ティアフォー! 応募はこちらから! 16_完全自動運転向けハードウェアIP研究開発エンジニア(FPGA, ASIC)
TIER IV JANUARY / 2021 SPECIAL THANKS to Kazuhide UCHIYAMA Yuta SAKAMOTO and… You! JANUARY / 2021 TITLE