SlideShare a Scribd company logo
Copyright © Fixstars Group
フィックスターズによる
FPGAオンラインセミナー(第一回)
Aug 20,2021
Copyright © Fixstars Group
Copyright © Fixstars Group
Intel FPGA OpenCLフレームワークを
使ったシステム開発実践
18:05
Copyright © Fixstars Group
写真
Ryuji NISHIDA
西田 竜之
ソリューション第一事業部 シニアエンジニア
Copyright © Fixstars Group
 自己紹介
● 西田竜之
○ FPGAを用いたシステム開発に従事
○ ハードウェア開発をメインに担当
○ 略歴
■ 半導体ベンダ
● サーバー向けASIC開発
■ 映像事務機メーカー
● 高画質エンジンLSI 映像機器向けFPGA開発
■ フィックスターズ
● FPGAを用いた高速取引金融システム
● OpenCLによるアプリの高速化
Copyright © Fixstars Group
アジェンダ
● Intel FPGA OpenCLフレームワークについて
● サンプルシステム
○ Optical Flowアプリケーション
○ システム構成
● 実装解説
○ OpenCLカーネル実装
○ hostプログラム実装
○ pythonアプリ実装
● デモ実行
● まとめ
Copyright © Fixstars Group
Intel FPGA OpenCL
● FPGAアクセラレーションを実現するフレームワーク
● FPGAハードウェア :OpenCLカーネル
... Cベースの高位合成で実装
● hostからのFPGA制御 :hostプログラム
... OpenCL APIを利用して行う
● FPGAボード
… BSP(ボード・サポート・
 パッケージ)が準備された
   対応ボード上で動作可能
Copyright © Fixstars Group
● サンプルありか
<Install-Path>/intelFPGA_xxx/<version>/hld/
examples_aoc/optical_flow
● ファイル
構成
Optical Flowアプリケーション
※サンプル中ドキュメントより抜粋
 Source: Lucas_Kanade_optical_flow_with_OpenCL.pdf
● Optical Flow
○ 2枚の画像フレームから
物体の動き、速度を検出
○ 速度情報は速さ、向きに
応じて色付けして表示する
Copyright © Fixstars Group
● レイヤ&
ブロック図
システム構成
❏ pythonからhostプログラムを
呼び出す
pybind11を使用
❏ hostとFPGA間の画像データの読
み書きはPCIe経由でボード上
DRAMに配置して行う
❏ 画処理プロセスにはストリームで
データを流し込む
※LSU … Load Store Unit
Copyright © Fixstars Group
● OpenCLカーネル ソースコード内容
ハードウェア実装
カーネルの関数定義部
Global Memoryへの
ポインタを引数に設定
シフトレジスタで
画素データを順に送る
Global Memoryのポインタ
にアクセスして画素データ
を取得
ここがLSU(DMAC)動作になる
...
…
...
全画素データに対して繰り返す
ストリーム処理のための基本のループ
optical_flow.cl
Copyright © Fixstars Group
ハードウェア実装
● OpenCLカーネル ソースコード内容
   Optical flow演算コード
   (フィルタ演算ライクな処理)
…
…
タイル状の画素データが保持で
きていれば、それを組み合わせ
た演算はCと同等に記述できる
複雑な演算でも比較的容易に実
装可能
※サンプル中ドキュメントより抜粋
 Source:
Lucas_Kanade_optical_flow_with_OpenCL.pdf
Global Memoryに結果データを格納
LSU(DMAC)動作
ストリーム処理の
基本ループ終了
Copyright © Fixstars Group
● hostプログラムの構成
○ カーネル引数のパラメータ設定
○ 入力データをメモリに流し込む
○ カーネル起動→FPGAで処理
○ 結果データをメモリから回収
 ⇒ OpenCL APIを用いて実現
hostプログラム実装
● 提供されるサンプルプログラム
○ Cライクな記述 テストコードになっている
● C++ class化してアプリケーションとして
使いやすい形に整える
Copyright © Fixstars Group
hostプログラム実装
● hostプログラム ソースコード修正概要
…
pybind11 ヘッダファイルをイン
クルード
main関数を削除
全体をclass定義でくくる
グローバル変数はメンバ変数に、
サブルーチン関数はメンバ関数になる
Copyright © Fixstars Group
hostプログラム実装
● hostプログラム ソースコード修正概要
…
…
host側の初期化を分離
(初回一回だけ実行するため)
アクセラレーション実行用の
run()関数はpublic指定
入出力画像データのインターフェー
スとしてnumpy配列を引数に入れる
(pybind11で準備されている)
Copyright © Fixstars Group
Copyright © Fixstars Group
hostプログラム実装
● hostプログラム ソースコード修正概要
初期化ルーチンはコンストラクタに、
終了ルーチンはデストラクタに入れておく
pybind11用のラッパを追加
定型の記述方法を踏襲
Copyright © Fixstars Group
pythonアプリ実装
● Optical Flowアプリケーションpythonコード
○ OpenCVチュートリアルコードを流用
○ Optical Flow処理メソッドをOpenCLに差し替える
Source:
http://labs.eecs.tottori-u.ac.jp/sd/Member/oyamada/OpenCV/html/py_tutorials/py_video/py_lucas_kanade/py_lucas_kanade.html
Copyright © Fixstars Group
pythonアプリ実装
● python
コード
OpenCLのクラスを
インスタンス
OpenCLプログラムに
差し替えて実行
※前後処理(リサイズ、
 表示色調整)はpython
 内で実行
optical-flow.py
Copyright © Fixstars Group
Copyright © Fixstars Group
デモ実行
● 実行環境
○ CentOS 7.9
○ Quartus Prime Pro 19.3
○ gcc 6.3.0
○ python 3.6
○ ターゲットボード:
Stratix10 GX 評価ボード Source:
https://www.intel.co.jp/content/www/jp/ja/programmable/products/
boards_and_kits/dev-kits/altera/kit-s10-fpga.html
Copyright © Fixstars Group
デモ実行
● エミュレーション実行
※カーネルコードをCPU実行
○ ハードウェアビルド
○ ソフトウェアビルド
○ アプリ実行
$ aoc -DWINDOW_SIZE=7 -march=emulator device/optical_flow.cl
提供されている Makefile を編集し、 pybind11 用オプションを追加、変更
・変更:TARGET := OpticalFlowLib`python3-config --extension-suffix`
・追加:PYBINDFLAGS := `python3 -m pybind11 --includes` -shared
・追加: -o $(TARGET_DIR)/$(TARGET) に以下を追加
$(PYBINDFLAGS) -o $(TARGET_DIR)/$(TARGET)
$ make → ./bin以下に .so が生成される
$ cd ./bin/
$ python optical-flow.py
※画像サイズを1/16(320x200)、
 WINDOW7x7に縮小して実行
■ いずれも数秒で完了する
Copyright © Fixstars Group
デモ実行
● 実機実行
 ○ ハードウェアビルド
 ■ 合成結果(2hour程度で完了)
  ○ ソフトウェアビルド、
  アプリ実行手順は、
  エミュレーションと同等
$ aoc device/optical_flow.cl
ALUTs : 57639
Registers : 125,439
Logic utilization : 70,999 / 933,120 ( 8 % )
I/O pins : 165 / 1,152 ( 14 % )
DSP blocks : 43 / 5,760 ( < 1 % )
RAM blocks : 393 / 11,721 ( 3 % )
Actual clock freq : 463.333333333
※画像サイズ 1280x800
 WINDOW52x52
Copyright © Fixstars Group
まとめ
● Optical Flowのサンプルアプリを用いて、Intel FPGA OpenCLフレームワーク
を利用したシステム開発の実践的な方法について解説した。
● ハードウェア設計の知識を駆使することで、ハードウェア性能を引き出すこと
ができ、かつ検証、システム結合までシームレスに開発可能。
● hostプログラムとOpenCLカーネル実装の両方を一人の開発者が手がけることが
可能で、TAT、性能ともに高い効率でシステム開発ができる。
● hostプログラムまで実装できれば、アプリケーションに組み込む方法は
各種あり情報も多い。手法の概略イメージさえあれば、調査しながら
実現することは可能。
Copyright © Fixstars Group
高位合成によるFPGA開発のすすめ     
〜高速化入門〜
Copyright © Fixstars Group
Yuki MATSUDA
松田 裕貴
ソリューション第一事業部 リードエンジニア
写真
Copyright © Fixstars Group
自己紹介
● 松田 裕貴
● 高速化エンジニア
○ 主に FPGA開発 (Vivado/Vitis HLS, Verilog-HDL)
○ CPU / GPU (CUDA) 高速化を行うこともあり
● 略歴
○ 2016年 4月 フィックスターズ入社
■ FPGA による高解像度の画像処理システム開発、
ネットワーク処理のオフロードなどに着手
■ ACRiブログ にて「FPGAで始めるエッジディープラーニング 」を執筆 (全10回)
Copyright © Fixstars Group
高位合成 (HLS: High Level Synthesis) による開発とは
● RTL 開発には時間がかかる
○ 演算のスケジューリング設計
○ RTL ベースの検証は遅い
● HLS を用いて開発すると、
大幅に時間の短縮が可能となる
● Q. よく HLS だとソフトウェアと同じように
FPGA 開発が可能と言われるが、実際はどうなのか...?
○ A. なんとなく動く回路を作るだけなら、十分可能
○ A. FPGA の性能を十分引き出すには、
FPGA の内部アーキテクチャを意識した設計やコーディングが必要になることが多い
Source: https://www.legupcomputing.com/blog/index.php/benefits-of-high-level-synthesis-for-fpga-design/
Copyright © Fixstars Group
本セミナーの内容
● FPGA の RAM アーキテクチャの特徴が良く出る例として、
二次元フィルタの HLS 実装を紹介
● 二次元フィルタ処理の HLS 実装を通して、
○ FPGA のメモリアーキテクチャの柔軟性を理解する
○ HLS による実装時に考慮すべきポイントを理解する
Copyright © Fixstars Group
二次元フィルタ処理とは
● 各画素に対して、周辺画素の情報から出力画素を決定する処理
Source:
https://www.imaginationtech.com/blog/heterogeneous-co
mpute-case-study-image-convolution-filtering/
Copyright © Fixstars Group
二次元フィルタ処理 (cont.)
● コードとして書くと、以下のような4次ループになる
○ 以下は単なる移動平均フィルタ (box filter) の場合
for (int y = 0; y < HEIGHT; y++) { // Y ループ
for (int x = 0; x < WIDTH; x++) { // X ループ
int sum = 0; // 総和レジスタの初期化
for (int dy = 0; dy < FSIZE; dy++) {
for (int dx = 0; dx < FSIZE; dx++) {
sum += src[y+dy-FSIZE/2][x+dx-FSIZE/2]; //
}
}
dst[y][x] = sum / (FSIZE * FSIZE); // 平均値の計算
}
}
ループ方向
Copyright © Fixstars Group
二次元フィルタにおけるメモリアクセス
● 基本は、1ピクセルに対して周辺ピクセルを取得して計算する
○ DRAM に対するランダムアクセスが発生するので、効率が悪い
● CPU/GPU ではキャッシュやシェアードメモリ等のローカルメモリを用い、
画像の一部 (タイル) をローカルメモリに格納することで高速化する
○ DRAM に対するブロック単位アクセス、ローカルメモリに対するランダムアクセスが発生
メモリアクセスのイメージ
ローカルメモリを使って高速化した際のイメージ
(赤枠全てをキャッシュ )
Copyright © Fixstars Group
FPGA 内部のメモリアーキテクチャ
● FPGA の内部メモリアーキテクチャは、
独立して使用可能な SRAM を大量に持つことができるのが特徴
○ SRAM 毎にアクセスパターンを任意に設定可能
○ メモリ周りは CPU/GPU よりもかなり柔軟な設計が可能
● 例えば Alveo U250 アクセラレータカード内の FPGA だと、
○ BRAM (36bit x1024) 2688個, URAM (72bit x4096) 1280個を独立して使用可能
○ 公称値では、総容量54MB, 総スループット 38Tb/s
■ Source: https://japan.xilinx.com/products/boards-and-kits/alveo/u250.html#specifications
● いかに SRAM を上手に扱うかが FPGA 開発では重要
Copyright © Fixstars Group
2D Sliding Window
● FPGA で 2D フィルタ処理を実装する際は、
2D Sliding Window というアーキテクチャが良く用いられる
● Sliding Window ではフィルタ処理に必要な周辺行のみをラインバッファ (SRAM)
に格納する
● 不必要になったデータは捨てられていく
2D Sliding Window ラインバッファとウィンドウに
格納する範囲
Copyright © Fixstars Group
2D Sliding Window のメリット
● アクセスパターンがシーケンシャルで効率が良い
● 複数の処理を組み合わせても外部メモリアクセスが増えない
Source:
https://www.xilinx.com/support/documentation/i
p_documentation/dpu/v3_3/pg338-dpu.pdf
2D フィルタ処理
カメラ入出力を使用したシステムでの処理例
Copyright © Fixstars Group
Vitis HLS による 2D Sliding Window の実装
● HLS で回路を作る際には、基本的にはブロック図に書いたリソースを
そのまま C コード上で定義していくことが重要
○ 今回の例では、Line Buffer や Window の定義、その間のデータの流し方を書く
● レジスタによるタイミング調整はツールが自動で行うのであまり考慮しない
○ タイミングを満たさない場合には、計算方式の再検討が必要な場合もある
※簡単のため、今回の実装では入力画像は予めフィルタサイズ分のボーダーがつけられていると仮定
Copyright © Fixstars Group
2D Sliding Window の実装: 全体の構成
● まずはカーネル関数を定義する
○ ストリーム入出力のため、インターフェースにはストリーム型を置く
● フィルタのループ内には、#pragma HLS pipeline を書く (optional)
○ フィルタモジュールが毎サイクル
データを入出力できるようにする void box_filter_hls(hls::stream<uint8_t>& src,
hls::stream<uint8_t>& dst) {
// リソース定義: ラインバッファ・ウィンドウ
...
for (int y = 0; y < HEIGHT; y++) {
for (int x = 0; x < WIDTH; x++) {
#pragma HLS pipeline II=1
// ラインバッファ・ウィンドウの更新
...
// 計算処理
...
}
}
}
}
Copyright © Fixstars Group
2D Sliding Window の実装: リソース定義
● Line Buffer, Window を配列として定義する
● Line Buffer はフィルタサイズ (FSIZE) - 1 個の SRAM として定義する
○ #pragma HLS array_partition complete dim=1
● Window は全てレジスタに展開する
○ 1 サイクルに9個の値全てを使用したいため
○ #pragma HLS array_partition complete dim=0
void box_filter_hls(hls::stream<uint8_t>& src,
hls::stream<uint8_t>& dst) {
// リソース定義: ラインバッファ (FSIZE-1個)
static uint8_t linebuf[FSIZE - 1][WIDTH];
#pragma HLS array_partition variable=linebuf complete dim=1
// リソース定義: ウィンドウレジスタ
static uint8_t window[FSIZE][FSIZE];
#pragma HLS array_partition variable=window complete dim=0
for (int y = 0; y < HEIGHT; y++) {
for (int x = 0; x < WIDTH; x++) {
…
}
}
}
Copyright © Fixstars Group
2D Sliding Window の実装: データフローの記載
● 定義したリソース間の
データフローを書いていく
○ ラインバッファの更新は省略
● HLS にはノンブロッキング代入が
ないので、更新順には注意が必要
void box_filter_hls(hls::stream<uint8_t>& src,
hls::stream<uint8_t>& dst) {
...
for (int y = 0; y < HEIGHT; y++) {
for (int x = 0; x < WIDTH; x++) {
// スライディングウィンドウを進める処理(末尾以外)
for (int dy = 0; dy < FSIZE; dy++) {
for (int dx = 0; dx < FSIZE-1; dx++) {
window[dy][dx] = window[dy][dx+1];
}
}
// スライディングウィンドウを進める処理(末尾)
for (int dy = 0; dy < FSIZE; dy++) {
if (dy == FSIZE - 1) {
// 入力画素を入れる
window[dy][FSIZE-1] = src_pix;
} else {
// ラインバッファ先頭の画素を入れる
window[dy][FSIZE-1] = line_tops[dy];
}
}
// ラインバッファ更新処理 ...
...
Copyright © Fixstars Group
2D Sliding Window の実装: フィルタ計算
● 計算部は、単純にウィンドウ内の総和を取るだけ
● 毎サイクル FSIZE x FSIZE 回の加算が行われるよう、
自動で演算器は展開される
○ ループ外の pipeline で指示しているため
● タイミング制約を満たすための
レジスタ追加は、HLSが自動で行う
void box_filter_hls(hls::stream<uint8_t>& src,
hls::stream<uint8_t>& dst) {
...
for (int y = 0; y < HEIGHT; y++) {
for (int x = 0; x < WIDTH; x++) {
#pragma HLS pipeline II=1
...
// 計算処理
int sum = 0;
for (int dy = 0; dy < FSIZE; dy++) {
for (int dx = 0; dx < FSIZE; dx++) {
sum += window[dy][dx];
}
}
sum /= (FSIZE * FSIZE); // 平均の計算
...
}
}
}
Copyright © Fixstars Group
2D Sliding Window の実装: コード全体
● 今回書いたコードは 74行だけなので、
アーキテクチャを意識して書くといっても
RTL よりは大幅に楽に開発が可能
Copyright © Fixstars Group
2D Sliding Window の実装: 高位合成結果
● モジュールパラメータ
○ 画像サイズ: 1920x1080
○ フィルタサイズ: 5x5
○ 動作周波数: 300MHz (target: xcvu9p-flga2104-2L-e)
● 1 pixel/cycle の処理性能のため理論性能は 約300Mpix/sec -> 144.7 fps
● ベクトル化により pixel/cycle を向上すれば、更に性能向上も可能
シミュレーション波形
入力
出力
 合成結果
Copyright © Fixstars Group
まとめ
● HLS による開発を行う際には、
どのような回路を作りたいのか事前にイメージするのが大事
○ HLS は優秀なので、回路をあまり意識せず書いたコードでも(効率は悪いが) 動いてしまう
○ あくまで C/C++ を使って HW を書くイメージ
● 効率の良い回路を作るための最適化指示詞を知っておくのも大事
○ 処理性能を向上させるための指示詞(pipeline, unroll, dataflow, etc.)
○ リソースの構成に対する指示詞(array_partition, bind_storage, bind_op, etc.)
○ 詳細は UG1399 などを参照
● どうしても HLS では書けない処理もあるので、
設計段階での見極めも大事
Copyright © Fixstars Group
Thank you for your participation
ご参加いただきありがとうございました

More Related Content

What's hot

組み込み関数(intrinsic)によるSIMD入門
組み込み関数(intrinsic)によるSIMD入門組み込み関数(intrinsic)によるSIMD入門
組み込み関数(intrinsic)によるSIMD入門
Norishige Fukushima
 
組合せ最適化入門:線形計画から整数計画まで
組合せ最適化入門:線形計画から整数計画まで組合せ最適化入門:線形計画から整数計画まで
組合せ最適化入門:線形計画から整数計画まで
Shunji Umetani
 

What's hot (20)

最適輸送の解き方
最適輸送の解き方最適輸送の解き方
最適輸送の解き方
 
CPU / GPU高速化セミナー!性能モデルの理論と実践:理論編
CPU / GPU高速化セミナー!性能モデルの理論と実践:理論編CPU / GPU高速化セミナー!性能モデルの理論と実践:理論編
CPU / GPU高速化セミナー!性能モデルの理論と実践:理論編
 
モデル高速化百選
モデル高速化百選モデル高速化百選
モデル高速化百選
 
プログラムを高速化する話Ⅱ 〜GPGPU編〜
プログラムを高速化する話Ⅱ 〜GPGPU編〜プログラムを高速化する話Ⅱ 〜GPGPU編〜
プログラムを高速化する話Ⅱ 〜GPGPU編〜
 
PythonとPyCoRAMでお手軽にFPGAシステムを開発してみよう
PythonとPyCoRAMでお手軽にFPGAシステムを開発してみようPythonとPyCoRAMでお手軽にFPGAシステムを開発してみよう
PythonとPyCoRAMでお手軽にFPGAシステムを開発してみよう
 
[DL輪読会]Pay Attention to MLPs (gMLP)
[DL輪読会]Pay Attention to MLPs	(gMLP)[DL輪読会]Pay Attention to MLPs	(gMLP)
[DL輪読会]Pay Attention to MLPs (gMLP)
 
研究者のための Python による FPGA 入門
研究者のための Python による FPGA 入門研究者のための Python による FPGA 入門
研究者のための Python による FPGA 入門
 
近年のHierarchical Vision Transformer
近年のHierarchical Vision Transformer近年のHierarchical Vision Transformer
近年のHierarchical Vision Transformer
 
Singularityで分散深層学習
Singularityで分散深層学習Singularityで分散深層学習
Singularityで分散深層学習
 
TensorFlow計算グラフ最適化処理
TensorFlow計算グラフ最適化処理TensorFlow計算グラフ最適化処理
TensorFlow計算グラフ最適化処理
 
【DL輪読会】"A Generalist Agent"
【DL輪読会】"A Generalist Agent"【DL輪読会】"A Generalist Agent"
【DL輪読会】"A Generalist Agent"
 
分散システムの限界について知ろう
分散システムの限界について知ろう分散システムの限界について知ろう
分散システムの限界について知ろう
 
グラフニューラルネットワークとグラフ組合せ問題
グラフニューラルネットワークとグラフ組合せ問題グラフニューラルネットワークとグラフ組合せ問題
グラフニューラルネットワークとグラフ組合せ問題
 
いまさら聞けないarmを使ったNEONの基礎と活用事例
いまさら聞けないarmを使ったNEONの基礎と活用事例いまさら聞けないarmを使ったNEONの基礎と活用事例
いまさら聞けないarmを使ったNEONの基礎と活用事例
 
[DL輪読会] マルチエージェント強化学習と心の理論
[DL輪読会] マルチエージェント強化学習と心の理論[DL輪読会] マルチエージェント強化学習と心の理論
[DL輪読会] マルチエージェント強化学習と心の理論
 
ACRi HLSチャレンジ 高速化テクニック紹介
ACRi HLSチャレンジ 高速化テクニック紹介ACRi HLSチャレンジ 高速化テクニック紹介
ACRi HLSチャレンジ 高速化テクニック紹介
 
組み込み関数(intrinsic)によるSIMD入門
組み込み関数(intrinsic)によるSIMD入門組み込み関数(intrinsic)によるSIMD入門
組み込み関数(intrinsic)によるSIMD入門
 
PFN のオンプレML基盤の取り組み / オンプレML基盤 on Kubernetes 〜PFN、ヤフー〜
PFN のオンプレML基盤の取り組み / オンプレML基盤 on Kubernetes 〜PFN、ヤフー〜PFN のオンプレML基盤の取り組み / オンプレML基盤 on Kubernetes 〜PFN、ヤフー〜
PFN のオンプレML基盤の取り組み / オンプレML基盤 on Kubernetes 〜PFN、ヤフー〜
 
組合せ最適化入門:線形計画から整数計画まで
組合せ最適化入門:線形計画から整数計画まで組合せ最適化入門:線形計画から整数計画まで
組合せ最適化入門:線形計画から整数計画まで
 
計算機アーキテクチャを考慮した高能率画像処理プログラミング
計算機アーキテクチャを考慮した高能率画像処理プログラミング計算機アーキテクチャを考慮した高能率画像処理プログラミング
計算機アーキテクチャを考慮した高能率画像処理プログラミング
 

Similar to Fpga online seminar by fixstars (1st)

Apache cloudstack4.0インストール
Apache cloudstack4.0インストールApache cloudstack4.0インストール
Apache cloudstack4.0インストール
Yasuhiro Arai
 
ネットワークコマンド入力に対応したツール事例
ネットワークコマンド入力に対応したツール事例ネットワークコマンド入力に対応したツール事例
ネットワークコマンド入力に対応したツール事例
fumoto kazuhiro
 
NVIDIA Japan Seminar 2012
NVIDIA Japan Seminar 2012NVIDIA Japan Seminar 2012
NVIDIA Japan Seminar 2012
Takuro Iizuka
 
45分で理解する 最近のスパコン事情 斉藤之雄
45分で理解する 最近のスパコン事情 斉藤之雄45分で理解する 最近のスパコン事情 斉藤之雄
45分で理解する 最近のスパコン事情 斉藤之雄
Yukio Saito
 
High-speed Sorting using Portable FPGA Accelerator (IPSJ 77th National Conven...
High-speed Sorting using Portable FPGA Accelerator (IPSJ 77th National Conven...High-speed Sorting using Portable FPGA Accelerator (IPSJ 77th National Conven...
High-speed Sorting using Portable FPGA Accelerator (IPSJ 77th National Conven...
Takuma Usui
 

Similar to Fpga online seminar by fixstars (1st) (20)

Snapdragon-SCORER
Snapdragon-SCORERSnapdragon-SCORER
Snapdragon-SCORER
 
Apache cloudstack4.0インストール
Apache cloudstack4.0インストールApache cloudstack4.0インストール
Apache cloudstack4.0インストール
 
【関東GPGPU勉強会#4】GTX 1080でComputer Vision アルゴリズムを色々動かしてみる
【関東GPGPU勉強会#4】GTX 1080でComputer Visionアルゴリズムを色々動かしてみる【関東GPGPU勉強会#4】GTX 1080でComputer Visionアルゴリズムを色々動かしてみる
【関東GPGPU勉強会#4】GTX 1080でComputer Vision アルゴリズムを色々動かしてみる
 
ネットワークコマンド入力に対応したツール事例
ネットワークコマンド入力に対応したツール事例ネットワークコマンド入力に対応したツール事例
ネットワークコマンド入力に対応したツール事例
 
Apache CloudStack 4.0 インストール(ver0.5)
Apache CloudStack 4.0 インストール(ver0.5)Apache CloudStack 4.0 インストール(ver0.5)
Apache CloudStack 4.0 インストール(ver0.5)
 
NVIDIA Japan Seminar 2012
NVIDIA Japan Seminar 2012NVIDIA Japan Seminar 2012
NVIDIA Japan Seminar 2012
 
CPU / GPU高速化セミナー!性能モデルの理論と実践:実践編
CPU / GPU高速化セミナー!性能モデルの理論と実践:実践編CPU / GPU高速化セミナー!性能モデルの理論と実践:実践編
CPU / GPU高速化セミナー!性能モデルの理論と実践:実践編
 
Cell/B.E. プログラミング事始め
Cell/B.E. プログラミング事始めCell/B.E. プログラミング事始め
Cell/B.E. プログラミング事始め
 
OSC 2012 Hokkaido でのプレゼン資料
OSC 2012 Hokkaido でのプレゼン資料OSC 2012 Hokkaido でのプレゼン資料
OSC 2012 Hokkaido でのプレゼン資料
 
INF-001_詳説 Azure IaaS ~私はインフラが好きだ~
INF-001_詳説 Azure IaaS ~私はインフラが好きだ~INF-001_詳説 Azure IaaS ~私はインフラが好きだ~
INF-001_詳説 Azure IaaS ~私はインフラが好きだ~
 
45分で理解する 最近のスパコン事情 斉藤之雄
45分で理解する 最近のスパコン事情 斉藤之雄45分で理解する 最近のスパコン事情 斉藤之雄
45分で理解する 最近のスパコン事情 斉藤之雄
 
Xilinx SDSoC(2016.2)解体新書ソフトウェア編
Xilinx SDSoC(2016.2)解体新書ソフトウェア編Xilinx SDSoC(2016.2)解体新書ソフトウェア編
Xilinx SDSoC(2016.2)解体新書ソフトウェア編
 
OpenCLに触れてみよう
OpenCLに触れてみようOpenCLに触れてみよう
OpenCLに触れてみよう
 
マイクロソフトが考えるAI活用のロードマップ
マイクロソフトが考えるAI活用のロードマップマイクロソフトが考えるAI活用のロードマップ
マイクロソフトが考えるAI活用のロードマップ
 
インフラ野郎AzureチームProX
インフラ野郎AzureチームProXインフラ野郎AzureチームProX
インフラ野郎AzureチームProX
 
2014 1018 OSC-Fall Tokyo NETMF
2014 1018 OSC-Fall Tokyo NETMF2014 1018 OSC-Fall Tokyo NETMF
2014 1018 OSC-Fall Tokyo NETMF
 
Tremaで試すFirewall
Tremaで試すFirewallTremaで試すFirewall
Tremaで試すFirewall
 
FPGA+SoC+Linux実践勉強会資料
FPGA+SoC+Linux実践勉強会資料FPGA+SoC+Linux実践勉強会資料
FPGA+SoC+Linux実践勉強会資料
 
High-speed Sorting using Portable FPGA Accelerator (IPSJ 77th National Conven...
High-speed Sorting using Portable FPGA Accelerator (IPSJ 77th National Conven...High-speed Sorting using Portable FPGA Accelerator (IPSJ 77th National Conven...
High-speed Sorting using Portable FPGA Accelerator (IPSJ 77th National Conven...
 
2021 03-09-ac ri-nngen
2021 03-09-ac ri-nngen2021 03-09-ac ri-nngen
2021 03-09-ac ri-nngen
 

More from Fixstars Corporation

More from Fixstars Corporation (20)

製造業向け量子コンピュータ時代のDXセミナー_生産計画最適化_20220323.pptx
製造業向け量子コンピュータ時代のDXセミナー_生産計画最適化_20220323.pptx製造業向け量子コンピュータ時代のDXセミナー_生産計画最適化_20220323.pptx
製造業向け量子コンピュータ時代のDXセミナー_生産計画最適化_20220323.pptx
 
製造業向け量子コンピュータ時代のDXセミナー~ 最適化の中身を覗いてみよう~
製造業向け量子コンピュータ時代のDXセミナー~ 最適化の中身を覗いてみよう~製造業向け量子コンピュータ時代のDXセミナー~ 最適化の中身を覗いてみよう~
製造業向け量子コンピュータ時代のDXセミナー~ 最適化の中身を覗いてみよう~
 
製造業向け量子コンピュータ時代のDXセミナー ~見える化、分析、予測、その先の最適化へ~
製造業向け量子コンピュータ時代のDXセミナー ~見える化、分析、予測、その先の最適化へ~製造業向け量子コンピュータ時代のDXセミナー ~見える化、分析、予測、その先の最適化へ~
製造業向け量子コンピュータ時代のDXセミナー ~見える化、分析、予測、その先の最適化へ~
 
株式会社フィックスターズの会社説明資料(抜粋)
株式会社フィックスターズの会社説明資料(抜粋)株式会社フィックスターズの会社説明資料(抜粋)
株式会社フィックスターズの会社説明資料(抜粋)
 
Jetson活用セミナー ROS2自律走行実現に向けて
Jetson活用セミナー ROS2自律走行実現に向けてJetson活用セミナー ROS2自律走行実現に向けて
Jetson活用セミナー ROS2自律走行実現に向けて
 
量子コンピュータ時代の製造業におけるDXセミナー~生産工程効率化に向けた新たなご提案~
量子コンピュータ時代の製造業におけるDXセミナー~生産工程効率化に向けた新たなご提案~量子コンピュータ時代の製造業におけるDXセミナー~生産工程効率化に向けた新たなご提案~
量子コンピュータ時代の製造業におけるDXセミナー~生産工程効率化に向けた新たなご提案~
 
金融業界向けセミナー 量子コンピュータ時代を見据えた組合せ最適化
金融業界向けセミナー 量子コンピュータ時代を見据えた組合せ最適化金融業界向けセミナー 量子コンピュータ時代を見据えた組合せ最適化
金融業界向けセミナー 量子コンピュータ時代を見据えた組合せ最適化
 
株式会社フィックスターズ 会社説明資料(抜粋)
株式会社フィックスターズ 会社説明資料(抜粋)株式会社フィックスターズ 会社説明資料(抜粋)
株式会社フィックスターズ 会社説明資料(抜粋)
 
株式会社フィックスターズ 会社説明資料(抜粋)
株式会社フィックスターズ 会社説明資料(抜粋)株式会社フィックスターズ 会社説明資料(抜粋)
株式会社フィックスターズ 会社説明資料(抜粋)
 
ソフト高速化の専門家が教える!AI・IoTエッジデバイスの選び方
ソフト高速化の専門家が教える!AI・IoTエッジデバイスの選び方ソフト高速化の専門家が教える!AI・IoTエッジデバイスの選び方
ソフト高速化の専門家が教える!AI・IoTエッジデバイスの選び方
 
AIチップ戦国時代における深層学習モデルの推論の最適化と実用的な運用を可能にするソフトウェア技術について
AIチップ戦国時代における深層学習モデルの推論の最適化と実用的な運用を可能にするソフトウェア技術についてAIチップ戦国時代における深層学習モデルの推論の最適化と実用的な運用を可能にするソフトウェア技術について
AIチップ戦国時代における深層学習モデルの推論の最適化と実用的な運用を可能にするソフトウェア技術について
 
株式会社フィックスターズ 会社説明資料(抜粋)
株式会社フィックスターズ 会社説明資料(抜粋)株式会社フィックスターズ 会社説明資料(抜粋)
株式会社フィックスターズ 会社説明資料(抜粋)
 
第8回 社内プログラミングコンテスト 結果発表会
第8回社内プログラミングコンテスト 結果発表会第8回社内プログラミングコンテスト 結果発表会
第8回 社内プログラミングコンテスト 結果発表会
 
第8回 社内プログラミングコンテスト 第1位 taiyo
第8回社内プログラミングコンテスト 第1位 taiyo第8回社内プログラミングコンテスト 第1位 taiyo
第8回 社内プログラミングコンテスト 第1位 taiyo
 
第8回 社内プログラミングコンテスト 第2位 fy999
第8回社内プログラミングコンテスト 第2位 fy999第8回社内プログラミングコンテスト 第2位 fy999
第8回 社内プログラミングコンテスト 第2位 fy999
 
第8回 社内プログラミングコンテスト 第3位 logicmachine
第8回社内プログラミングコンテスト 第3位 logicmachine第8回社内プログラミングコンテスト 第3位 logicmachine
第8回 社内プログラミングコンテスト 第3位 logicmachine
 
株式会社フィックスターズ 会社説明資料(抜粋)
株式会社フィックスターズ 会社説明資料(抜粋)株式会社フィックスターズ 会社説明資料(抜粋)
株式会社フィックスターズ 会社説明資料(抜粋)
 
A challenge for thread parallelism on OpenFOAM
A challenge for thread parallelism on OpenFOAMA challenge for thread parallelism on OpenFOAM
A challenge for thread parallelism on OpenFOAM
 
マルチレイヤコンパイラ基盤による、エッジ向けディープラーニングの実装と最適化について
マルチレイヤコンパイラ基盤による、エッジ向けディープラーニングの実装と最適化についてマルチレイヤコンパイラ基盤による、エッジ向けディープラーニングの実装と最適化について
マルチレイヤコンパイラ基盤による、エッジ向けディープラーニングの実装と最適化について
 
DIC-PCGソルバーのpimpleFoamに対する時間計測と高速化
DIC-PCGソルバーのpimpleFoamに対する時間計測と高速化DIC-PCGソルバーのpimpleFoamに対する時間計測と高速化
DIC-PCGソルバーのpimpleFoamに対する時間計測と高速化
 

Recently uploaded

ビジュアルプログラミングIotLT17-オープンソース化されたビジュアルプログラミング環境Noodlの紹介
ビジュアルプログラミングIotLT17-オープンソース化されたビジュアルプログラミング環境Noodlの紹介ビジュアルプログラミングIotLT17-オープンソース化されたビジュアルプログラミング環境Noodlの紹介
ビジュアルプログラミングIotLT17-オープンソース化されたビジュアルプログラミング環境Noodlの紹介
miyp
 

Recently uploaded (8)

Linuxサーバー構築 学習のポイントと環境構築 OSC2024名古屋 セミナー資料
Linuxサーバー構築 学習のポイントと環境構築 OSC2024名古屋 セミナー資料Linuxサーバー構築 学習のポイントと環境構築 OSC2024名古屋 セミナー資料
Linuxサーバー構築 学習のポイントと環境構築 OSC2024名古屋 セミナー資料
 
本の感想共有会「データモデリングでドメインを駆動する」本が突きつける我々の課題について
本の感想共有会「データモデリングでドメインを駆動する」本が突きつける我々の課題について本の感想共有会「データモデリングでドメインを駆動する」本が突きつける我々の課題について
本の感想共有会「データモデリングでドメインを駆動する」本が突きつける我々の課題について
 
今さら聞けない人のためのDevOps超入門 OSC2024名古屋 セミナー資料
今さら聞けない人のためのDevOps超入門 OSC2024名古屋  セミナー資料今さら聞けない人のためのDevOps超入門 OSC2024名古屋  セミナー資料
今さら聞けない人のためのDevOps超入門 OSC2024名古屋 セミナー資料
 
エンジニアのセルフブランディングと技術情報発信の重要性 テクニカルライターになろう 講演資料
エンジニアのセルフブランディングと技術情報発信の重要性 テクニカルライターになろう 講演資料エンジニアのセルフブランディングと技術情報発信の重要性 テクニカルライターになろう 講演資料
エンジニアのセルフブランディングと技術情報発信の重要性 テクニカルライターになろう 講演資料
 
人的資本経営のための地理情報インテリジェンス 作業パターン分析と心身状態把握に関する実証事例
人的資本経営のための地理情報インテリジェンス 作業パターン分析と心身状態把握に関する実証事例人的資本経営のための地理情報インテリジェンス 作業パターン分析と心身状態把握に関する実証事例
人的資本経営のための地理情報インテリジェンス 作業パターン分析と心身状態把握に関する実証事例
 
Compute Units/Budget最適化 - Solana Developer Hub Online 6 #SolDevHub
Compute Units/Budget最適化 - Solana Developer Hub Online 6 #SolDevHubCompute Units/Budget最適化 - Solana Developer Hub Online 6 #SolDevHub
Compute Units/Budget最適化 - Solana Developer Hub Online 6 #SolDevHub
 
ビジュアルプログラミングIotLT17-オープンソース化されたビジュアルプログラミング環境Noodlの紹介
ビジュアルプログラミングIotLT17-オープンソース化されたビジュアルプログラミング環境Noodlの紹介ビジュアルプログラミングIotLT17-オープンソース化されたビジュアルプログラミング環境Noodlの紹介
ビジュアルプログラミングIotLT17-オープンソース化されたビジュアルプログラミング環境Noodlの紹介
 
【登壇資料】スタートアップCTO経験からキャリアについて再考する CTO・VPoEに聞く by DIGGLE CTO 水上
【登壇資料】スタートアップCTO経験からキャリアについて再考する  CTO・VPoEに聞く by DIGGLE CTO 水上【登壇資料】スタートアップCTO経験からキャリアについて再考する  CTO・VPoEに聞く by DIGGLE CTO 水上
【登壇資料】スタートアップCTO経験からキャリアについて再考する CTO・VPoEに聞く by DIGGLE CTO 水上
 

Fpga online seminar by fixstars (1st)

  • 1. Copyright © Fixstars Group フィックスターズによる FPGAオンラインセミナー(第一回) Aug 20,2021 Copyright © Fixstars Group
  • 2. Copyright © Fixstars Group Intel FPGA OpenCLフレームワークを 使ったシステム開発実践 18:05
  • 3. Copyright © Fixstars Group 写真 Ryuji NISHIDA 西田 竜之 ソリューション第一事業部 シニアエンジニア
  • 4. Copyright © Fixstars Group  自己紹介 ● 西田竜之 ○ FPGAを用いたシステム開発に従事 ○ ハードウェア開発をメインに担当 ○ 略歴 ■ 半導体ベンダ ● サーバー向けASIC開発 ■ 映像事務機メーカー ● 高画質エンジンLSI 映像機器向けFPGA開発 ■ フィックスターズ ● FPGAを用いた高速取引金融システム ● OpenCLによるアプリの高速化
  • 5. Copyright © Fixstars Group アジェンダ ● Intel FPGA OpenCLフレームワークについて ● サンプルシステム ○ Optical Flowアプリケーション ○ システム構成 ● 実装解説 ○ OpenCLカーネル実装 ○ hostプログラム実装 ○ pythonアプリ実装 ● デモ実行 ● まとめ
  • 6. Copyright © Fixstars Group Intel FPGA OpenCL ● FPGAアクセラレーションを実現するフレームワーク ● FPGAハードウェア :OpenCLカーネル ... Cベースの高位合成で実装 ● hostからのFPGA制御 :hostプログラム ... OpenCL APIを利用して行う ● FPGAボード … BSP(ボード・サポート・  パッケージ)が準備された    対応ボード上で動作可能
  • 7. Copyright © Fixstars Group ● サンプルありか <Install-Path>/intelFPGA_xxx/<version>/hld/ examples_aoc/optical_flow ● ファイル 構成 Optical Flowアプリケーション ※サンプル中ドキュメントより抜粋  Source: Lucas_Kanade_optical_flow_with_OpenCL.pdf ● Optical Flow ○ 2枚の画像フレームから 物体の動き、速度を検出 ○ 速度情報は速さ、向きに 応じて色付けして表示する
  • 8. Copyright © Fixstars Group ● レイヤ& ブロック図 システム構成 ❏ pythonからhostプログラムを 呼び出す pybind11を使用 ❏ hostとFPGA間の画像データの読 み書きはPCIe経由でボード上 DRAMに配置して行う ❏ 画処理プロセスにはストリームで データを流し込む ※LSU … Load Store Unit
  • 9. Copyright © Fixstars Group ● OpenCLカーネル ソースコード内容 ハードウェア実装 カーネルの関数定義部 Global Memoryへの ポインタを引数に設定 シフトレジスタで 画素データを順に送る Global Memoryのポインタ にアクセスして画素データ を取得 ここがLSU(DMAC)動作になる ... … ... 全画素データに対して繰り返す ストリーム処理のための基本のループ optical_flow.cl
  • 10. Copyright © Fixstars Group ハードウェア実装 ● OpenCLカーネル ソースコード内容    Optical flow演算コード    (フィルタ演算ライクな処理) … … タイル状の画素データが保持で きていれば、それを組み合わせ た演算はCと同等に記述できる 複雑な演算でも比較的容易に実 装可能 ※サンプル中ドキュメントより抜粋  Source: Lucas_Kanade_optical_flow_with_OpenCL.pdf Global Memoryに結果データを格納 LSU(DMAC)動作 ストリーム処理の 基本ループ終了
  • 11. Copyright © Fixstars Group ● hostプログラムの構成 ○ カーネル引数のパラメータ設定 ○ 入力データをメモリに流し込む ○ カーネル起動→FPGAで処理 ○ 結果データをメモリから回収  ⇒ OpenCL APIを用いて実現 hostプログラム実装 ● 提供されるサンプルプログラム ○ Cライクな記述 テストコードになっている ● C++ class化してアプリケーションとして 使いやすい形に整える
  • 12. Copyright © Fixstars Group hostプログラム実装 ● hostプログラム ソースコード修正概要 … pybind11 ヘッダファイルをイン クルード main関数を削除 全体をclass定義でくくる グローバル変数はメンバ変数に、 サブルーチン関数はメンバ関数になる
  • 13. Copyright © Fixstars Group hostプログラム実装 ● hostプログラム ソースコード修正概要 … … host側の初期化を分離 (初回一回だけ実行するため) アクセラレーション実行用の run()関数はpublic指定 入出力画像データのインターフェー スとしてnumpy配列を引数に入れる (pybind11で準備されている) Copyright © Fixstars Group
  • 14. Copyright © Fixstars Group hostプログラム実装 ● hostプログラム ソースコード修正概要 初期化ルーチンはコンストラクタに、 終了ルーチンはデストラクタに入れておく pybind11用のラッパを追加 定型の記述方法を踏襲
  • 15. Copyright © Fixstars Group pythonアプリ実装 ● Optical Flowアプリケーションpythonコード ○ OpenCVチュートリアルコードを流用 ○ Optical Flow処理メソッドをOpenCLに差し替える Source: http://labs.eecs.tottori-u.ac.jp/sd/Member/oyamada/OpenCV/html/py_tutorials/py_video/py_lucas_kanade/py_lucas_kanade.html
  • 16. Copyright © Fixstars Group pythonアプリ実装 ● python コード OpenCLのクラスを インスタンス OpenCLプログラムに 差し替えて実行 ※前後処理(リサイズ、  表示色調整)はpython  内で実行 optical-flow.py Copyright © Fixstars Group
  • 17. Copyright © Fixstars Group デモ実行 ● 実行環境 ○ CentOS 7.9 ○ Quartus Prime Pro 19.3 ○ gcc 6.3.0 ○ python 3.6 ○ ターゲットボード: Stratix10 GX 評価ボード Source: https://www.intel.co.jp/content/www/jp/ja/programmable/products/ boards_and_kits/dev-kits/altera/kit-s10-fpga.html
  • 18. Copyright © Fixstars Group デモ実行 ● エミュレーション実行 ※カーネルコードをCPU実行 ○ ハードウェアビルド ○ ソフトウェアビルド ○ アプリ実行 $ aoc -DWINDOW_SIZE=7 -march=emulator device/optical_flow.cl 提供されている Makefile を編集し、 pybind11 用オプションを追加、変更 ・変更:TARGET := OpticalFlowLib`python3-config --extension-suffix` ・追加:PYBINDFLAGS := `python3 -m pybind11 --includes` -shared ・追加: -o $(TARGET_DIR)/$(TARGET) に以下を追加 $(PYBINDFLAGS) -o $(TARGET_DIR)/$(TARGET) $ make → ./bin以下に .so が生成される $ cd ./bin/ $ python optical-flow.py ※画像サイズを1/16(320x200)、  WINDOW7x7に縮小して実行 ■ いずれも数秒で完了する
  • 19. Copyright © Fixstars Group デモ実行 ● 実機実行  ○ ハードウェアビルド  ■ 合成結果(2hour程度で完了)   ○ ソフトウェアビルド、   アプリ実行手順は、   エミュレーションと同等 $ aoc device/optical_flow.cl ALUTs : 57639 Registers : 125,439 Logic utilization : 70,999 / 933,120 ( 8 % ) I/O pins : 165 / 1,152 ( 14 % ) DSP blocks : 43 / 5,760 ( < 1 % ) RAM blocks : 393 / 11,721 ( 3 % ) Actual clock freq : 463.333333333 ※画像サイズ 1280x800  WINDOW52x52
  • 20. Copyright © Fixstars Group まとめ ● Optical Flowのサンプルアプリを用いて、Intel FPGA OpenCLフレームワーク を利用したシステム開発の実践的な方法について解説した。 ● ハードウェア設計の知識を駆使することで、ハードウェア性能を引き出すこと ができ、かつ検証、システム結合までシームレスに開発可能。 ● hostプログラムとOpenCLカーネル実装の両方を一人の開発者が手がけることが 可能で、TAT、性能ともに高い効率でシステム開発ができる。 ● hostプログラムまで実装できれば、アプリケーションに組み込む方法は 各種あり情報も多い。手法の概略イメージさえあれば、調査しながら 実現することは可能。
  • 21. Copyright © Fixstars Group 高位合成によるFPGA開発のすすめ      〜高速化入門〜
  • 22. Copyright © Fixstars Group Yuki MATSUDA 松田 裕貴 ソリューション第一事業部 リードエンジニア 写真
  • 23. Copyright © Fixstars Group 自己紹介 ● 松田 裕貴 ● 高速化エンジニア ○ 主に FPGA開発 (Vivado/Vitis HLS, Verilog-HDL) ○ CPU / GPU (CUDA) 高速化を行うこともあり ● 略歴 ○ 2016年 4月 フィックスターズ入社 ■ FPGA による高解像度の画像処理システム開発、 ネットワーク処理のオフロードなどに着手 ■ ACRiブログ にて「FPGAで始めるエッジディープラーニング 」を執筆 (全10回)
  • 24. Copyright © Fixstars Group 高位合成 (HLS: High Level Synthesis) による開発とは ● RTL 開発には時間がかかる ○ 演算のスケジューリング設計 ○ RTL ベースの検証は遅い ● HLS を用いて開発すると、 大幅に時間の短縮が可能となる ● Q. よく HLS だとソフトウェアと同じように FPGA 開発が可能と言われるが、実際はどうなのか...? ○ A. なんとなく動く回路を作るだけなら、十分可能 ○ A. FPGA の性能を十分引き出すには、 FPGA の内部アーキテクチャを意識した設計やコーディングが必要になることが多い Source: https://www.legupcomputing.com/blog/index.php/benefits-of-high-level-synthesis-for-fpga-design/
  • 25. Copyright © Fixstars Group 本セミナーの内容 ● FPGA の RAM アーキテクチャの特徴が良く出る例として、 二次元フィルタの HLS 実装を紹介 ● 二次元フィルタ処理の HLS 実装を通して、 ○ FPGA のメモリアーキテクチャの柔軟性を理解する ○ HLS による実装時に考慮すべきポイントを理解する
  • 26. Copyright © Fixstars Group 二次元フィルタ処理とは ● 各画素に対して、周辺画素の情報から出力画素を決定する処理 Source: https://www.imaginationtech.com/blog/heterogeneous-co mpute-case-study-image-convolution-filtering/
  • 27. Copyright © Fixstars Group 二次元フィルタ処理 (cont.) ● コードとして書くと、以下のような4次ループになる ○ 以下は単なる移動平均フィルタ (box filter) の場合 for (int y = 0; y < HEIGHT; y++) { // Y ループ for (int x = 0; x < WIDTH; x++) { // X ループ int sum = 0; // 総和レジスタの初期化 for (int dy = 0; dy < FSIZE; dy++) { for (int dx = 0; dx < FSIZE; dx++) { sum += src[y+dy-FSIZE/2][x+dx-FSIZE/2]; // } } dst[y][x] = sum / (FSIZE * FSIZE); // 平均値の計算 } } ループ方向
  • 28. Copyright © Fixstars Group 二次元フィルタにおけるメモリアクセス ● 基本は、1ピクセルに対して周辺ピクセルを取得して計算する ○ DRAM に対するランダムアクセスが発生するので、効率が悪い ● CPU/GPU ではキャッシュやシェアードメモリ等のローカルメモリを用い、 画像の一部 (タイル) をローカルメモリに格納することで高速化する ○ DRAM に対するブロック単位アクセス、ローカルメモリに対するランダムアクセスが発生 メモリアクセスのイメージ ローカルメモリを使って高速化した際のイメージ (赤枠全てをキャッシュ )
  • 29. Copyright © Fixstars Group FPGA 内部のメモリアーキテクチャ ● FPGA の内部メモリアーキテクチャは、 独立して使用可能な SRAM を大量に持つことができるのが特徴 ○ SRAM 毎にアクセスパターンを任意に設定可能 ○ メモリ周りは CPU/GPU よりもかなり柔軟な設計が可能 ● 例えば Alveo U250 アクセラレータカード内の FPGA だと、 ○ BRAM (36bit x1024) 2688個, URAM (72bit x4096) 1280個を独立して使用可能 ○ 公称値では、総容量54MB, 総スループット 38Tb/s ■ Source: https://japan.xilinx.com/products/boards-and-kits/alveo/u250.html#specifications ● いかに SRAM を上手に扱うかが FPGA 開発では重要
  • 30. Copyright © Fixstars Group 2D Sliding Window ● FPGA で 2D フィルタ処理を実装する際は、 2D Sliding Window というアーキテクチャが良く用いられる ● Sliding Window ではフィルタ処理に必要な周辺行のみをラインバッファ (SRAM) に格納する ● 不必要になったデータは捨てられていく 2D Sliding Window ラインバッファとウィンドウに 格納する範囲
  • 31. Copyright © Fixstars Group 2D Sliding Window のメリット ● アクセスパターンがシーケンシャルで効率が良い ● 複数の処理を組み合わせても外部メモリアクセスが増えない Source: https://www.xilinx.com/support/documentation/i p_documentation/dpu/v3_3/pg338-dpu.pdf 2D フィルタ処理 カメラ入出力を使用したシステムでの処理例
  • 32. Copyright © Fixstars Group Vitis HLS による 2D Sliding Window の実装 ● HLS で回路を作る際には、基本的にはブロック図に書いたリソースを そのまま C コード上で定義していくことが重要 ○ 今回の例では、Line Buffer や Window の定義、その間のデータの流し方を書く ● レジスタによるタイミング調整はツールが自動で行うのであまり考慮しない ○ タイミングを満たさない場合には、計算方式の再検討が必要な場合もある ※簡単のため、今回の実装では入力画像は予めフィルタサイズ分のボーダーがつけられていると仮定
  • 33. Copyright © Fixstars Group 2D Sliding Window の実装: 全体の構成 ● まずはカーネル関数を定義する ○ ストリーム入出力のため、インターフェースにはストリーム型を置く ● フィルタのループ内には、#pragma HLS pipeline を書く (optional) ○ フィルタモジュールが毎サイクル データを入出力できるようにする void box_filter_hls(hls::stream<uint8_t>& src, hls::stream<uint8_t>& dst) { // リソース定義: ラインバッファ・ウィンドウ ... for (int y = 0; y < HEIGHT; y++) { for (int x = 0; x < WIDTH; x++) { #pragma HLS pipeline II=1 // ラインバッファ・ウィンドウの更新 ... // 計算処理 ... } } } }
  • 34. Copyright © Fixstars Group 2D Sliding Window の実装: リソース定義 ● Line Buffer, Window を配列として定義する ● Line Buffer はフィルタサイズ (FSIZE) - 1 個の SRAM として定義する ○ #pragma HLS array_partition complete dim=1 ● Window は全てレジスタに展開する ○ 1 サイクルに9個の値全てを使用したいため ○ #pragma HLS array_partition complete dim=0 void box_filter_hls(hls::stream<uint8_t>& src, hls::stream<uint8_t>& dst) { // リソース定義: ラインバッファ (FSIZE-1個) static uint8_t linebuf[FSIZE - 1][WIDTH]; #pragma HLS array_partition variable=linebuf complete dim=1 // リソース定義: ウィンドウレジスタ static uint8_t window[FSIZE][FSIZE]; #pragma HLS array_partition variable=window complete dim=0 for (int y = 0; y < HEIGHT; y++) { for (int x = 0; x < WIDTH; x++) { … } } }
  • 35. Copyright © Fixstars Group 2D Sliding Window の実装: データフローの記載 ● 定義したリソース間の データフローを書いていく ○ ラインバッファの更新は省略 ● HLS にはノンブロッキング代入が ないので、更新順には注意が必要 void box_filter_hls(hls::stream<uint8_t>& src, hls::stream<uint8_t>& dst) { ... for (int y = 0; y < HEIGHT; y++) { for (int x = 0; x < WIDTH; x++) { // スライディングウィンドウを進める処理(末尾以外) for (int dy = 0; dy < FSIZE; dy++) { for (int dx = 0; dx < FSIZE-1; dx++) { window[dy][dx] = window[dy][dx+1]; } } // スライディングウィンドウを進める処理(末尾) for (int dy = 0; dy < FSIZE; dy++) { if (dy == FSIZE - 1) { // 入力画素を入れる window[dy][FSIZE-1] = src_pix; } else { // ラインバッファ先頭の画素を入れる window[dy][FSIZE-1] = line_tops[dy]; } } // ラインバッファ更新処理 ... ...
  • 36. Copyright © Fixstars Group 2D Sliding Window の実装: フィルタ計算 ● 計算部は、単純にウィンドウ内の総和を取るだけ ● 毎サイクル FSIZE x FSIZE 回の加算が行われるよう、 自動で演算器は展開される ○ ループ外の pipeline で指示しているため ● タイミング制約を満たすための レジスタ追加は、HLSが自動で行う void box_filter_hls(hls::stream<uint8_t>& src, hls::stream<uint8_t>& dst) { ... for (int y = 0; y < HEIGHT; y++) { for (int x = 0; x < WIDTH; x++) { #pragma HLS pipeline II=1 ... // 計算処理 int sum = 0; for (int dy = 0; dy < FSIZE; dy++) { for (int dx = 0; dx < FSIZE; dx++) { sum += window[dy][dx]; } } sum /= (FSIZE * FSIZE); // 平均の計算 ... } } }
  • 37. Copyright © Fixstars Group 2D Sliding Window の実装: コード全体 ● 今回書いたコードは 74行だけなので、 アーキテクチャを意識して書くといっても RTL よりは大幅に楽に開発が可能
  • 38. Copyright © Fixstars Group 2D Sliding Window の実装: 高位合成結果 ● モジュールパラメータ ○ 画像サイズ: 1920x1080 ○ フィルタサイズ: 5x5 ○ 動作周波数: 300MHz (target: xcvu9p-flga2104-2L-e) ● 1 pixel/cycle の処理性能のため理論性能は 約300Mpix/sec -> 144.7 fps ● ベクトル化により pixel/cycle を向上すれば、更に性能向上も可能 シミュレーション波形 入力 出力  合成結果
  • 39. Copyright © Fixstars Group まとめ ● HLS による開発を行う際には、 どのような回路を作りたいのか事前にイメージするのが大事 ○ HLS は優秀なので、回路をあまり意識せず書いたコードでも(効率は悪いが) 動いてしまう ○ あくまで C/C++ を使って HW を書くイメージ ● 効率の良い回路を作るための最適化指示詞を知っておくのも大事 ○ 処理性能を向上させるための指示詞(pipeline, unroll, dataflow, etc.) ○ リソースの構成に対する指示詞(array_partition, bind_storage, bind_op, etc.) ○ 詳細は UG1399 などを参照 ● どうしても HLS では書けない処理もあるので、 設計段階での見極めも大事
  • 40. Copyright © Fixstars Group Thank you for your participation ご参加いただきありがとうございました