1.8K Views
October 26, 22
スライド概要
フィックスターズならではの「FPGA」に関する高速化手法、 効率的な開発ノウハウ、苦労話などについてお話しいたします。
<講演内容>
1、続 Intel®️ Agilex™️ 開発キットを用いた各種機能トライアル~Agilex™️をもっと体感する~
6月に開催した Intel®️ Agilex™️ の各種機能トライアル( https://www.docswell.com/s/fixstars/598G7X-20220629 )に続く第 2 弾です。
前回、うまくできなかった HPS (Hard Processor System = ARMコア) 上での Linux 起動に再度チャレンジします。
また、前回は 40Gbps にとどまっていた ネットワーク I/O 性能を 100Gbps にアップグレードした結果についても報告します。
その他、Tips、ノウハウも共有できればと思いますので、前回参加された方も、そうでない方も是非ご聴講下さい。
2、AI Engine を使ったマルチコアプログラミング ~行列積アプリケーションの作成~
AI Engine は、最大で 400 近くのコアを搭載したメニーコアのプロセッサです。
これまでのセミナーでは AI Engine をシングルコアで使った際の情報を紹介してきましたが、
今回のセミナーでは AI Engine の複数コアを使うことを目的として、
大規模な行列に対する行列積を AI Engine で解く方法について紹介します。
AI Engine の複数コア間のデータ共有方法や、PLIO を使って AI Engine と PL の間でデータを
効率よく受け渡しする方法についても時間の限り解説したいと思います。
・当社技術ブログ 記事: https://proc-cpuinfo.fixstars.com/
・フィックスターズグループ/セミナー一覧: https://www.fixstars.com/ja/seminar
・フィックスターズのFPGAシステム開発: https://www.fixstars.com/ja/services/fpga
フィックスターズは、コンピュータの性能を最大限に引き出すソフトウェア開発のスペシャリストです。車載、産業機器、金融、医療など、幅広い分野での開発経験があります。また、ディープラーニングや機械学習などの最先端技術にも力を入れています。 並列化や最適化技術を駆使して、マルチコアCPU、GPU、FPGA、量子アニーリングマシンなど、さまざまなハードウェアでソフトウェアを高速化するサービスを提供しています。さらに、長年の経験から培ったハードウェアの知識と最適化ノウハウを活かし、高精度で高性能なアルゴリズムの開発も行っています。 ・開催セミナー一覧:https://www.fixstars.com/ja/seminar ・技術ブログ :https://proc-cpuinfo.fixstars.com/
実践的!FPGA開発セミナー vol.15 2022/10/26 18:00~ Copyright© Fixstars Group
続 Intel® Agilex™ 開発 キットを用いた 各種機能トライアル ~Agilex™をもっと体感する~ Copyright© Fixstars Group
Who I am Ryuji NISHIDA 写真 西田 竜之 ソリューション第四事業部 シニアエンジニア Copyright© Fixstars Group
自己紹介 ● 西田竜之 ○ ○ ○ FPGAを用いたシステム開発に従事 ハードウェア開発をメインに担当 略歴 ■ 半導体ベンダ ● サーバー向けASIC開発 ■ 映像事務機メーカー ● 高画質エンジンLSI 映像機器向けFPGA開発 ■ フィックスターズ ● FPGAを用いた高速取引金融システム ● OpenCLによるアプリの高速化 Copyright© Fixstars Group
本日のAgenda 1. 前回 Intel® Agilex™ トライアル振り返り 2. Intel® Agilex™ 追加トライアル 2.1. 100Gbps ネットワーク I/O 性能 2.2. HPS Linux 起動 3. デバッグ体験&ノウハウ共有 4. まとめ Copyright© Fixstars Group
Agilex™ トライアル振り返り ● 前回の各種機能トライアル結果 ○ コア性能 ALM しきつめ回路で合成試行 ⇒ 98% Utilization, Fmax 848MHz を達成 ○ ネットワーク I/O 性能 E-Tile Transceiver 40Gbps (10Gbps x 4ch) ⇒ 安定した通信動作を確認 ○ HPS 試行 Agilex™ SoC Golden System Reference Design を移植 ⇒ Linux起動失敗... Copyright© Fixstars Group 6
使用評価ボード ● Intel® Agilex™ F シリーズ FPGA 開発キット ○ AGFB014R24A2E3VR0 ※ ES 品のため PCIe Gen4 未対応 ○ 2 x QSFP-DD(2 x 200Gbps) ○ 3 x DDR4 DIMM for FPGA, 1 x DDR4 DIMM for HPS ※ DIMM はユーザーが装着する 参照URL: https://www.intel.com/content/www/us/en/products/details/fpga/development-kits/agilex/f-series.html 7 Copyright© Fixstars Group
開発環境 ● 合成ツールバージョン ○ Quartus® Prime Pro ver 22.3 ■ 最新バージョン 2022/9/23 リリース ■ ただし、Programmer は ver 20.4 を使用 (.sof ファイルの config に失敗するため) ● 合成マシン ○ CPU : AMD Ryzen Threadripper 3960X 24コア/48スレッド ○ メモリ : 256GB ○ OS : CentOS 7.9 8 Copyright© Fixstars Group
Agilex™ 100GbE ネットワーク I/O 性能 ● 前回からのアップデート ○ 100GbE 対応のケーブルを使用 ■ FS 標準 3m Mellanox MCP1600-C003 互換 100G QSFP28 銅製Twinaxケーブル(DAC) ~¥8,000 参照URL: https://www.fs.com/jp/products/72704.html?attribute=1423&id=182001 ○ E-Tile Hard IP for Ethernet を 100GbE に変更 ○ 主な特徴 ■ MAC + PCS, PCS only, FlexE, OTN ■ 100GbE, 25GbE, 10GbE ■ RS-FEC, PTP (Precision Time Protocol) を使用可能 ■ 有償ライセンスではない Copyright© Fixstars Group
Agilex™ 100GbE ネットワーク I/O 性能 ● E-Tile Hard IP for Ethernet 100GbE 設定 100GbE に設定 RSFEC を有効 E-Tile Toolkit を使うため Copyright© Fixstars Group
Agilex™ 100GbE ネットワーク I/O 性能 ● 100GbE 試行デザイン ○ Example デザインを流用 ● Example デザインは 1port のみインスタンス ● Internal LoopBack or TX -> RX LoopBack モジュールを使う前提 ○ 2port 分をインスタンスするように変更 ケーブル接続で実動作に近い評価を行うことが目的 2port Design TX RX Example Design E-Tile ToolKit JTAG TX RX E-Tile ToolKit JTAG TX RX Copyright© Fixstars Group 100GbE Cable 11
Agilex™ 100GbE ネットワーク I/O 性能 ● E-Tile Toolkit 実行結果 ○ PRBS31 ○ No Error で実行可能 E-Tile Toolkit 実行手順 1. 2. 3. 4. 5. 6. 全 TX & RX を PRBS31 に設定 TX を Start RX を Serial Loopback として、Stop -> Start -> Stop (一回動作させる ※Warning メッセージに従う) RX を Loopback mode Off RX の Adaptation mode を Initial Adaptation にして Start One-Time を実行 RX を Start して開始 (初回エラーが検出された時は Reset してクリア) Copyright© Fixstars Group 12
Agilex™ 100GbE ネットワーク I/O 性能 ● E-Tile Toolkit Eye scan 結果 ■ ■ 十分な Eye 開口と言える なお RS-FEC OFF としても同等の結果 E-Tile Toolkit の評価対象に RS-FEC は含まれない様子 Copyright© Fixstars Group 13
Agilex™ HPS 試行 ● Agilex™ Hard Processor System ○ Cotrtex-A53 クアッドコア 参照URL: https://www.intel.com/content/www/us/en/docs/programmable/683567/21-3/hps-block-diagram-falconmesa-stratix-10.html https://www.intel.com/content/www/us/en/docs/programmable/683567/21-3/cortex-a53-mpcore-block-diagram-stratix.html Copyright© Fixstars Group 14
Agilex™ HPS 試行 Linux ビルド情報 ○ RocketBoard.org 2通りの記載がある A. “Agilex SoC Golden System Reference Design” https://www.rocketboards.org/foswiki/Documentation/AgilexSoCGSRD ₋ 一括ビルドコマンドを利用した簡単な手順 B. “Building Bootloader for Stratix 10 and Agilex” https://www.rocketboards.org/foswiki/Documentation/BuildingBootloader ₋ Boot Loader, Linux イメージを個別にマニュアル実行する詳細な手順 ○ ソースコード ■ GHRD (Golden Hardware Reference Design) https://github.com/altera-opensource/ghrd-socfpga ■ GSRD (Golden Software Reference Design) ← A. で使用 https://github.com/altera-opensource/gsrd-socfpga ■ 個別リポジトリ ₋ ₋ ← B. で使用 Boot Loader https://github.com/altera-opensource/u-boot-socfpga https://github.com/altera-opensource/arm-trusted-firmware Yocoto Linux https://git.yoctoproject.org/poky https://git.yoctoproject.org/meta-intel-fpga https://github.com/altera-opensource/linux-socfpg Copyright© Fixstars Group 15
Agilex™ HPS 試行 ● フロー概要 Agilex™ HPS Linux ビルド手順 ○ ○ ■ 今回、gsrd-socfpga を使った一括ビルドフローで実行 ただし、Boot Loader は個別ビルドして差し替え ソフトウェアのビルドは、Docker 上の Ubuntu 20.04 で実行 通常手順 ■ 適用手順 Copyright© Fixstars Group 16
Agilex™ HPS 試行 GHRD ハードウェアビルド ● デザイン生成 ○ Intel® Agilex™ F-Series Transceiver-SoC Development Kit 用 デザインがデフォルト ○ ghrd-socfpga リポジトリでは、今回の ターゲットボードがサポートされている (前回はマニュアルポーティング) ○ Make 設定で各種変更が可能 ■ ボード、デバイス設定 ■ Toripple Speed Ethernet IP の削除 ■ DDR4 DRAM ECC 有無 etc. $ make BOARD_TYPE=pcie_devkit QUARTUS_DEVICE=AGFB014R24A2E3VR0 \ HPS_SGMII_EMAC2_EN=0 ENABLE_HPS_EMIF_ECC=0 \ BOARD_PWRMGT=linear generate_from_tcl 参照URL: https://www.intel.com/content/www/us/en/products/details/fpga/development-kits/agilex/f-series-transceiver.html https://github.com/altera-opensource/ghrd-socfpga/tree/master/agilex_soc_devkit_ghrd Copyright© Fixstars Group 17
Agilex™ HPS 試行 GHRD ハードウェアビルド ● デザイン合成 ○ Platfrom Designer 起動 ⇒ DDR4 DRAM I/F IP設定変更(詳細は後述) $ make qsys_edit ○ 合成&配置配線実行 ⇒ xxx.sof、xxx_hps_debug.sof が生成される $ make sof ※ xxx_hps_debug.sof には、デバッグ用の一時的な HPS コードが埋め込まれている (HPS コードが含まれない .sof ファイルは焼き込みできない) • .rbf ファイル生成 ○ v20.4 を使って実行した (QSPI からの起動失敗を回避するワークアラウンド) $/opt/intelFPGA_pro/20.4/quartus/bin/quartus_pfg \ -c ghrd_agfb014r24a2e3vr0_hps_debug.sof ghrd_agfb014r24a2e3vr0.jic \ -o device=MT25QU02G -o flash_loader=AGFB014R24A2E3VR0 -o mode=ASX4 -o hps=1 ⇒ ハードウェアビルド完了! Copyright© Fixstars Group 18
Agilex™ HPS 試行 GHRD ハードウェアビルド ● DDR4 DRAM I/F IP 設定変更 ○ ○ ユーザーが DIMM モジュールを挿入して使用する 使用 DIMM : Micron 社製 PC4-2133 8GB ○ EMIF IP 設定を変更必要 ボード設定、データシートに従って設定する ※ Mem I/O 設定は記載省略 Copyright© Fixstars Group 19
Agilex™ HPS 試行 GHRD ハードウェアビルド ● (補足)GHRD マニュアルポーティング ○ ○ DDR4 DRAM I/F を残して最小限構成のデザインをベースする ボードに合わせて以下を変更 ■ ■ HPS I/O ボード情報 HPS ペリフェラル機能 ■ DDR4 DRAM EMIF 設定変更 デバイス情報、ピン配置修正 HPS IP 設定 Copyright© Fixstars Group 20
Agilex™ HPS 試行 Boot Loader ビルド ● HPS First ブートフロー ○ FSBL (First Stage Boot Loader) ■ ■ ■ ○ uboot-spl & Arm Trusted Firmware が起動 HPS 上の On-Chip RAM で動作 HPS ペリフェラル初期化 HPS DDR4 DRAM 初期化 SSBL (Second Stage Boot Loader) ■ ■ ■ Linux 起動用 uboot が動作 OS を RAM に展開起動する FPGA コア領域をコンフィグする ※ FSBL 動作までであれば、DRAM 不要 FPGA コンフィグはブートフロー後半で完了 参照URL: https://www.intel.com/content/www/us/en/docs/programmable/683389/21-4/boot-flow-overview.html Copyright© Fixstars Group 21
Agilex™ HPS 試行 Boot Loader ビルド ● Boot Loaderビルド実行 ○ RocketBoards.org の Building Bootloader 手順に従う https://www.rocketboards.org/foswiki/Documentation/BuildingBootloader#Stratix_10_SoC_and_Agilex ■ ただし、QSPI ブート対応のため、以下の箇所のみコメントアウト # only boot from SD, do not try QSPI and NAND # sed -i 's/u-boot,spl-boot-order.*/u-boot\,spl-boot-order = \&mmc;/g' arch/arm/dts/socfpga_stratix10_socdk-u-boot.dtsi ⇒ u-boot-spl-dtb.hex が生成される ○ ブートローダ―含む .jic ファイル生成 ■ v20.4 を使って実行した(QSPI からの起動失敗を回避するワークアラウンド) $/opt/intelFPGA_pro/20.4/quartus/bin/quartus_pfg -c ghrd_agfb014r24a2e3vr0.sof ghrd_agfb014r24a2e3vr0.jic \ -o hps_path=u-boot-spl-dtb.hex -o device=MT25QU02G -o flash_loader=AGFB014R24A2E3VR0 -o mode=ASX4 -o hps=1 ■ ○ ブートローダ―含む .sof ファイル生成 ■ JTAG 経由のダウンロードで FSBL を起動可能 $quartus_pfg -c -o hps_path=u-boot-spl-dtb.hex ghrd_agfb014r24a2e3vr0.sof ghrd_agfb014r24a2e3vr0_uboot.sof Copyright© Fixstars Group 22
Agilex™ HPS 試行 GSRD ソフトウェアビルド
●
Linux カーネル & rootfs ビルド実行
○ RocketBoards.org の Agilex SoC GSRD手順に従う
https://www.rocketboards.org/foswiki/Documentation/AgilexSoCGSRD#Building_the_GSRD
■
■
Yocto Project 4.0 Kirkstone (2 番目の LTS)
ただし、Tripple Speed Ethernet を削除したため、該当する device tree を
読み込まないように修正した
₋ gsrd_socfpga/meta-intel-fpga-refdes/recipes-bsp/device-tree/device-tree.bb 内
# GSRD DTB Generation
# MMC, QSPI
cp ${STAGING_KERNEL_DIR}/arch/${ARCH}/boot/dts/intel/socfpga_agilex_socdk.dts ${WORKDIR}
#
sed -i '/\#include \"socfpga_agilex.dtsi\"/a \#include \"socfpga_agilex_ghrd_sgmii.dtsi\"'
${WORKDIR}/socfpga_agilex_socdk.dts
⇒ Linux カーネルイメージ & rootfs が生成される
○
QSPI ブートイメージを生成
■
■
FSBL の U-boot は Boot Loader ビルドで生成した .hex ファイルに差し替える
quartus_pfg コマンドは v20.4 を使用して、jic ファイルを生成する
Copyright© Fixstars Group
23
Agilex™ HPS 試行 Linux ブート試行 ● QSPI ブート Copyright© Fixstars Group 24
デバッグ体験&ノウハウ共有 ● デバッグ経緯 ○ 前回現象 ■ QSPI ブート後 Config done LED OFF Power Good LED OFF ⇒ 全く動いていない・・・クロック、リセット、電源? ○ SDM 設定確認 ⇒ 問題なし ○ 切り分け ■ ■ ■ xxx_hps_debug.sof を Programmer で焼く ⇒ OK コンフィグされる xxx_hps_debug.sof を .jic に変換、QSPI ブート ⇒ NG Power Good OFF のまま L チカデザインを .jic に変換、QSPI ブート ⇒ NG Power Good OFF のまま ⇒ ツールのES品対応があやしいことに気付く ○ ワークアラウンド ■ .jic 変換を Quartus Prime v20.4 で実行 Copyright© Fixstars Group ⇒ QSPI ブートできた! 25
デバッグ体験&ノウハウ共有 ● Boot Loader 起動ワークアラウンド ○ 切り分け ■ シンプルな DDR4 DRAMも含まない HPS のみのデザイン + FSBL ⇒ NG DDR4 DRAM は無関係 ■ u-boot を入れた .sof を Programmer で焼く ⇒ NG ツールバージョンも無関係 HPS 上で動く .hex の問題 ⇒ FSBL を変更してみることに気付く ○ ワークアラウンド ■ RocketBoards Building Bootloader 手順の u-boot-spl.hex に差し替え ⇒ FSBL U-boot が起動した! ○ その後、DDR4 DRAM I/F IP設定デバッグ、デバイスツリー修正を実行 ⇒ Linux 起動まで到達! Copyright© Fixstars Group 26
デバッグ体験&ノウハウ共有 ● デバッグで意識していること ○ 「デバッグは現象把握が9割」 ■ ×:一体、何が起きているんだろう?? ⇒ 分からないことが起こっているから困っている (大抵、思いもよらないことが起こっている) ■ 〇:何が起きているのか、観測する方法はなんだろう? 現象を少しでも把握するのに、何ができるんだろう? ⇒ 切り分け、正常状態との差を見る、など 手を止めずに進められる Copyright© Fixstars Group 27
まとめ ● Agilex™ 評価ボードを用いて、以下の各種試行を実施した。 ○ 100GbE ネットワーク I/O 性能 ○ HPS Linux 起動 ● ネットワーク I/O 性能確認において、安定した100Gbps x 2portの 通信が確認出来た ● HPS Linux ビルド上、各種ワークアラウンドを施して、 Linux の起動を確認した Copyright© Fixstars Group 28
AI Engine を使った マルチコアプログラミング ~行列積アプリケーションの作成~ Copyright© Fixstars Group
Who I am Yuki MATSUDA 写真 松田 裕貴 ソリューション第四事業部 リードエンジニア Copyright© Fixstars Group
今回のセミナーについて ● ● これまで何回かに渡り AI Engine の基礎・使い方について解説してきました ○ Vol. 7: AI Engine を用いたアプリケーション開発 ○ Vol. 13: AI Engine の使い方とシミュレーション方法の解説 ○ Vol. 14: ACRi ルームで無償利用可能なVersal 開発カード VCK5000 を試す 今回は初のマルチコア編として、行列積をターゲットに AI Engine での実装のポイントについて紹介していきます Copyright© Fixstars Group
行列積 ● ● ● DNN など多くのカーネルの主要な演算を占める処理 naive な実装だとメモリ帯域ネックだが、 チューニングすると計算性能ネックとなる AI Engine で実装すると... ○ ○ メリット ■ AI Engine は演算性能の高さが強みなのでPL時と比較して大幅な性能向上が見込める 課題 ■ AI Engine の限られたメモリ空間上にどのように問題を置くか? (32KB / Tile) ■ どのように効率よくたくさんの AIE にデータを供給するか? ● AIE 間の IF ● PL <-> AIE の IF Copyright© Fixstars Group
行列積のブロック化 ● 前提として、行列積はブロック化することが可能 ○ 少ない DRAM アクセス回数で問題が解ける ○ アクセラレータのメモリ領域に合わせて、適切なサイズでブロック化するのが良い Copyright© Fixstars Group
1 つの AIE で作ってみる ● ローカルメモリ (32KB) に A/B/C のブロックを格納する ○ データ type: float (4B) ○ ブロックサイズ: 32x32 (4KiB) AIE のバッファは基本ダブルバッファなので、 ■ A/B/C 合計で 24KiB ● PL からブロック単位で読んでデータを供給する ○ PL 側の BRAM はキャッシュとして使えるので、 32x32 より大きいブロックで読めるとより効率が良い ● 作るもの ○ PL kernel (read_a, read_b, write_c) ○ AIE kernel & graph Copyright© Fixstars Group
複数のコア間でどのようにデータをやり取りするか? ● AI Engine には大量のコアが存在 ○ ● VCK5000 だと 400 一番 naive な複数コアの使い方 ○ 1 コアでやった行列積と同じ処理を横に並べる (PL 含む) ○ この実装だと、AIE <-> PL の帯域が枯渇しすぐ限界が来る ■ 400コアを使い切るには 400 個の PL 側のメモリロジックが必要になる... ■ => もう少し賢い方式を考えてみる xN Copyright© Fixstars Group
AI Engine のコア間インターフェース ● ● 3種類のインターフェースを使用可能 Window Interface (赤色) ○ ○ ○ ● Stream Interface (黒色) ○ ○ ● AI Engine 内のローカルメモリを使う IF 256bits/cycle read x2, 256bits/cycle write x1 サイズに上限あり (32KB/Tile) 遠距離のコア間を接続可能。FIFO として動く 32bits/cycle x2 Cascade Interface (緑色) ○ ○ ○ AI Engine 内のアキュムレータを渡す IF ■ アキュムレータ: 計算結果を格納するための 幅広な専用レジスタ (48bit, etc.) 隣接方向は1方向 384bits/cycle https://japan.xilinx.com/products/technology/ai-engine.html Copyright© Fixstars Group
今回使うインターフェース ● Window Interface (赤色) ○ ● Stream Interface (黒色) ○ ● ブロック単位の A/B/C を格納するために使用 計算が終わった C を追い出すために使用 Cascade Interface (緑色) ○ 今回は未使用 https://japan.xilinx.com/products/technology/ai-engine.html Copyright© Fixstars Group
参考: Cascade Interface を使う実装 ● Vitis Libraries の行列積実装では Cascade Interface を使用している ● C[i][j] = A[i][K1]*B[K1][j] + A[i][K2]*B[K2][j] の形で並列化する ● 中間結果 C[i][j] が cascade で渡される ● accumulator を渡すので、整数型だと乗加算の広いビットのまま渡せる Copyright© Fixstars Group
今回作る並列化方式: Systolic Array ● NxN の AIE を並べて大きな演算ブロックを作る ● 各 AIE は 32x32x32 の行列積を解く ● これを 4x4 にして、128x128x128 を解く Copyright© Fixstars Group
Systolic Array の動き ● PL からのデータ a00, b00 が (0, 0) のWindow Buffer に入り、 Core(0, 0) が動き始める ○ ● Window Buffer は省略しています Core(0, 0) が部分積を計算し、 途中結果は Window Buffer に保存する ○ こちらも省略しています Copyright© Fixstars Group
Systolic Array の動き ● Core(0, 0) が計算完了後、 a00, b00 を Window Buffer にコピー ○ CPU がコピーするように カーネルに記載 ● Core(0, 1), Core(1, 0) が データが揃うので計算開始 ● Core(0, 0) は引き続き動く Copyright© Fixstars Group
Systolic Array の動き ● 以下繰り返し Copyright© Fixstars Group
Systolic Array の動き ● 全ての演算完了後、各 Core 内のローカルメモリに 計算済みの C が揃う ● 揃ったデータは、Stream Interface で PL まで持っていく ○ 接続だけ定義すれば ツールが勝手に 出力してくれます https://japan.xilinx.com/products/technology/ai-engine.html Copyright© Fixstars Group
なぜ Systolic Array が良いのか? ● メリット ○ ○ ● AIE 内でのデータの再利用性が高いため、 PL <-> AIE への転送量が少なく済み、PL 側がボトルネックになりにくい ■ AIE/PL 間の IF は port あたり 128bit (複数port 定義可能)。 ■ PL の周波数が遅いので、AIE 的には port あたり 32bit/cycle でしかデータが来ない 複数 AIE で大きなブロックを解く感じになるので、 DRAM へのアクセス単位も大きくできて効率 up ■ PL 側は 128x128 のブロック単位で read し、 それを BRAM に入れて AIE に必要な部分を渡す デメリット ○ ○ AIE の HW 的に systolic array のデータコピーは実現できないので、 CPU でコピーする必要がある AIE のコア 1 つ 1 つに計算結果の C[i][j] が残るので、それを出すのが大変 ■ ストリームで出すだけと書きましたが、 AIE -> PL 側のストリーム数にも限度があるので、内部で束ねて出したりしました... Copyright© Fixstars Group
Systolic Array の実装: AIE のカーネル ● カーネルには計算部分、 データコピー等を書く ● 必要な処理 ○ (最初のiterのみ) 内部バッファのリセット ○ 計算処理 ○ (最後のiterのみ) 計算結果を 出力用 window buffer に格納 ○ ● A, B を隣のコアに渡す 詳細は省略 Copyright© Fixstars Group
Systolic Array の実装: AIE のグラフ ● グラフにはカーネル間の接続を書く ● 必要な処理 ○ カーネルの定義 (NxN 個) ○ カーネルに対する配置制約 ○ ■ systolic array の形になる用に制約する ■ adf::location<adf::kernel>(x) = (col, row) PL との接続 ■ 端のカーネルだけ入力をPL と繋ぐ ■ 全カーネルの C をストリームで出す Copyright© Fixstars Group
Systolic Array の実装: PL Kernel ● read_a: ○ Systolic Array 全体分の領域を まとめて読み出し BRAM に入れる (ライン単位でバンク分けしておく) ○ 複数ラインを同時に読み出してAIE に渡す ■ AIE と PL の間には Vitis の構文で FIFOを入れておく ○ dataflow で AXI MM の読み出しと BRAM からの出力が同時に動くと尚良し ■ 大きいサイズを解くときに データ供給効率 UP Copyright© Fixstars Group
AIE Graph View (2x2) ● 2x2 時の Graph View。k_array が乗加算ブロックで、それが計4個ある ● c_out はそのまま外に出すと 8x8 時にエラーとなるので、 packet merge という機構で束ねて出力 Copyright© Fixstars Group
AIE Array View (8x8) ● 現状だと左の8x8 全体にカーネルを詰めている ● 横は50 あるので、systolic array の形を非対称にしたり、 cascade stream を使った方式と組み合わせるとより並列度を稼げそう? Copyright© Fixstars Group
動かしてみる ● ボード: VCK5000 ○ ● ACRi ルームで動くようにしたかったが間に合わず... データサイズ: ○ (K, K) x (K, K) の対称行列 (256 の倍数) ■ ○ ● (M, K) x (K, N) の総 ops は M * N * K * 2 として計算 (256, K) x (K, 256) の行列積で K が可変 (256の倍数) 目標性能: ○ ○ コアあたりが 1.25 GHz * 16 FOPS/cycle = 20 GFLOPS ■ mac (mul + add) を 2ops 換算 ■ 実際は計算以外にもA/B の出力処理があるので多少ペナルティがかかる (10%程度) 64 コア時: 1280 GOPS Copyright© Fixstars Group
結果 ● (256, 65536) x (65536, 256) 以外は残念な結果に... (弁明あり) 目標ライン Copyright© Fixstars Group
反省点 (弁明) ● 現状の作りだと、1回の PL kernel 実行で (256, K)x(K, 256) の行列積を実行 ○ ○ ● Host 側の作りが甘いため、 1回目の C の書き出しまで全て終わってから2回目の処理が開始される ○ ○ ● K は自由に設定可能 (512, 512) x (512, 512) とか解くには 4回 PL kernel を実行する C の書き出しカーネルは実装をサボって 32bit/cycle の性能にしたから凄く時間がかかる... ちゃんとオーバーラップさせれば C の書き出し時間は無視できるようになる見込み ■ それにしても 32bit だと遅すぎたかも (256, K) x (K, 256) の K を凄く大きくした場合でも 50% 程度しか出ないのは原因調査中 ○ HW emulation を実施中... Copyright© Fixstars Group
HW emulation 時の波形 ● (256,1024)x(1024,256)時: C の Write が物凄く遅い... Copyright© Fixstars Group
AI Engine で行列積を実装してみた所感 ● ● AI Engine の計算が速すぎるので PL 側がすぐボトルネックになる ○ 今回だと (32, 32)x(32, 32) の演算に 4096 cycle (8並列) ○ AIE vs PL でクロック換算すると 4:1 くらいはあるのでPL 的には 1024 cycle で計算完了 ○ PL は 1024 cycle の間に 32x32 の入力データ x2 を用意する必要がある ■ AIE のコア数が増えると更に必要なレートは増えていく... ■ systolic array にしてデータの再利用性を高めるなどにして、転送量を減らす必要あり 上記の理由より、PL 側の設計はちゃんとしておく必要がある ○ データ幅, ポート数, DRAM 帯域, etc. ○ AIE <-> PL が 128bit だから DRAM 側も 128 bit にしたら全然性能が足りませんでした... Copyright© Fixstars Group
まとめ ● AIE の複数コアを使って行列積を実装してみた ○ Systolic Array 型のアーキテクチャにより、 AIE 内で効率よくデータを再利用した ○ ● 性能は理論の 50% 程度しか出ていないので、要プロファイリング PL 側がボトルネックになりがちなので、 ちゃんと数値ベースで検討することがすごく大事 ● AIE も PL も自由度が高いアーキテクチャなので、 もっと効率の良い解き方はありそうな印象 ○ cascade を使用して K ループ方向の並列性を抽出, etc. ○ 色々と考えてみると面白いかもしれません Copyright© Fixstars Group
Thank you! お問い合わせ窓口 : [email protected] Copyright © Fixstars Group