SlideShare una empresa de Scribd logo
1 de 42
Polyphony の並列化
有限会社シンビー
Polyphonyはこんなツール
特徴
● Pythonで書いたコードをHDL(Verilog)に
変換するためのコンパイラ
● オープンソース
得意なこと
● 動くものを早く作る
苦手なこと
● クロックレベルの記述(<=今後の改善点)
Polyphonyの紹介:
Q: Can Polyphony accept any Python code?
A: No, Polyphony accepts only restricted Python code.
Python
Polyphony
(is a subset of Python)
Function
Class
List(Fixed size)
Tuple
For/While
If/Else
...
String
Dictionary
Set
Builtin funcs
...
Python のすべてをカバーしているわけではない
Polyphonyのデザイン・フロー:
コンパイラは何をやっているのか?
def AND(x1, x2):
w1, w2, theta = 2, 2, 3
tmp = x1*w1 + x2*w2
if tmp <= theta:
return 0
elif tmp > theta:
return 1
実際に「ゼロから作るDeep Learning: Pythonで学ぶディープラーニングの理論と実装」を
読みながらPolyphonyで合成してみた例。
コンパイラは何をやっているのか?
tmp = x1*w1 + x2*w2
pp_temp0 = x1*w1
pp_temp1 = x2*w2
tmp = pp_temp0 + pp_temp1
処理を分解
IR と SSA
コンパイラは何をやっているのか?
tmp = x1*w1 + x2*w2
pp_temp0 = x1*w1
pp_temp1 = x2*w2
tmp = pp_temp0 + pp_temp1
pp_temp0 = x1*w1
pp_temp1 = x2*w2
tmp = pp_temp0 + pp_temp1
コンパイラは何をやっているのか?
tmp = x1*w1 + x2*w2
pp_temp0 = x1*w1
pp_temp1 = x2*w2
tmp = pp_temp0 + pp_temp1
pp_temp0 = x1*w1 pp_temp1 = x2*w2
tmp = pp_temp0 + pp_temp1
スケジューリング
(一種の並列化)
使用方法による分類
• TypeI : Function-Call-Like Usage
<関数呼び出し> タイプ
• TypeII : Thread-Like Usage
<スレッド> タイプ
• TypeIII : Stream-Processing Usage
• ソフトウェアからみた分類
<関数呼び出し> タイプ
• バリエーション
– 非同期(ソフト的な)
– 突き放し
• 例
– TCP/IP の CRC 計算
Int main()
{
….
….
rv = offload(arg0, arg1, arg2);
….
….
}
FPGA
arg0
arg1
arg2
rv
Polyphony は関数も最適化する
if illegal_op == False:
tmp_store_addr = self.get_reg_v(rs1) + tmp_add_v_store
self.store(tmp_store_addr, tmp_store_value)
関数予備出し
Polyphony の逐次処理の進化
• 最初の実装
– 単純な逐次処理をスケジューリング
– 関数コールもステージ
• 改善された実装
– 関数コールをインライン展開
– 元の関数呼び出しと離れてスケジューリング
– 可能な限り最適化
• 追加機能
– オブジェクト指向(class)に対応
– インスタンス作成をインライン展開
– ライブラリ化可能 • for 文の展開(アンロール)
• for文のパイプライン
• 特定条件のパイプライン
今後の課題
スケジュール/最適化してもさほど高速化しない
if illegal_op == False:
tmp_store_addr = self.get_reg_v(rs1) + tmp_add_v_store
self.store(tmp_store_addr, tmp_store_value)
関数予備出し
スケジュール
最適化
Polyphony での高速化は?
スケジューリング
(一種の並列化)
パイプライン化
逐次処理の順序を
保ちながら並列化
• for分のパイプライン
• worker による実現
OpenCV を高位合成でコンパイルして
高速ハードを作れますか?
スケジューリング
(一種の並列化)
パイプライン化
逐次処理の順序を
保ちながら並列化
この部分をうまく
ハードに落とせない
と高速化できません
例えばステレオからの視差を得る
D
OpenCV のライブラリ
• StereoBM
– ブロックマッチング
• StereoSGBM
– セミ・グローバル(ブロック?)・マッチング
これらのソースを高位合成でコ
ンパイルできるだろうか?
OpenCV のソースを見る
parallel_for: 高速化のためのソフトウェア的な様々な工夫
高位合成のコンパイラに通すことが困難な場合が多い
StereoBM(ブロックマッチング)
ブロックの比較
StereBM(ブロックマッチング)
ラインバッファを使って
比較ができる
OpenCV とは離れて、原理を追うことで
FPGAで実現する道筋が立てやすいアルゴリズム
高位合成で実現可能性が高い
StereoSGBM(セミ・グローバル・マッチング)
パスr
パスr に沿って積算していく。
単純なブロックマッチングではない。
StereoSGBM(セミ・グローバル・マッチング)
複雑なアルゴリズム
高位合成で実現してほしいが
パイプライン化が難しい
ラインバッファを使っ
て比較ができる
リアルタイム処理が困難
パイプラインが破たん
捜査も逆向き
すごく工夫が必要
パイプライが
破たん
工夫が必要
ニュース!!SGMを提供!!
この難しい処理を HDL 化に成功!!
視差画像を
抜き出し!!
高速化したいならパイプラインを意識
したプログラムが必要
スケジューリング
(一種の並列化)
パイプライン化
逐次処理の順序を
保ちながら並列化
この部分をうまく
ハードに落とせない
と高速化できません
使用方法による分類(再掲)
• TypeI : Function-Call-Like Usage
<関数呼び出し> タイプ
• TypeII : Thread-Like Usage
<スレッド> タイプ
• TypeIII : Stream-Processing Usage
並列化の種類による分類
• TypeI : Scheduling
スケジューリングによる並列化
• TypeII : Pipeline
パイプラインによる並列化(密結合)
• TypeIII : Pipeline
パイプラインによる並列化(疎結合)
逐次処理をスケジューリングする
if illegal_op == False:
tmp_store_addr = self.get_reg_v(rs1) + tmp_add_v_store
self.store(tmp_store_addr, tmp_store_value)
スケジュール
最適化
スケジューリングされた処理は
リソースを共有している
FF
FF
リソース
再入不可(ソフトウェアの用語をつかうと)
HDL の排他制御
VHDL Verilog-HDL
process (clk)
begin
....
....
ff0 <= ‘0’;
....
....
end process;
always@(posedge clk)
begin
....
....
ff0 <= 1b‘0;
....
....
end
書き込みはあるブロック内と制限される。
• VHDL のブロック: process
• Verilog –HDL のブロック: always
HDL の排他制御
Process
FF
Process
書き込みは1か所からのみ
ステージを分けてFF を排他制御
FFなので排他制御が必要
各ステージは1clock
CPU設計例
リソースの書き込みを排他。
FF で情報を持ちまわる
FF
FF
再入可能
FF
FFなので排他制御が必要だが
参照は自由(密結合)
再入可能にしてパイプライン化
FETCH
EXECUTE
MEMORY
WRITE
FETCH
EXECUTE
MEMORY
WRITE
FETCH
EXECUTE
MEMORY
WRITE
FETCH
EXECUTE
MEMORY
WRITE
FETCH
EXECUTE
MEMORY
WRITE
疎結合のパイプラインの例
(AXI-Stream)
各モジュールは独立しており
必要な情報はすべて流さないといけない
他のモジュール内の情報の参照ができない(疎結合)
今後は MPI とか OpenMP を研究予定
おまけ: for 文
• for 文 + 配列は、スケジューリングの中でうま
く対応すればパイプライン化が見込めやすい
比較的まれな例(だとおもう)
– でも配列の参照方法や順序などをチェックしない
といけないので大変
– そう意味では foreach 文は、コンパイラにとってシ
リアライズが確定するので大変助かる構文
まわりくどくなりましたが
それを踏まえて
Polyphony の新機能の紹介
Polyphony:並列プログラミング
並列計算モデルを構築するための道具を用意
●Module
●Worker
●Port
並列プログラミング
Module
●回路全体またはその一部を表す単位
●外部入出力のためのPortを持つ
●さまざま処理を独立して行う複数のWorker
を持つ
並列プログラミング
Worker
●Moduleに含まれる並列動作する処理の単位
●入出力のためのPortを持つ
●Workerの持つPortは外部もしくは内部(別の
Worker)と接続
並列プログラミング
Port
●データのやり取りを行うためのチャネル
●ModuleおよびWorkerの入出力になる
●単一データ用のPortとFIFOとして動作する
Queueがある
並列プログラミング
例:
@module # デコレータによりクラスをModuleとして指定
class Blink:
def __init__(self, interval1, interval2):
self.led1 = Port(bit, 'out') # 出力ポート
self.led2 = Port(bit, 'out') # 出力ポート
self.append_worker(self.main, self.led1, interval1) # Workerの登録
self.append_worker(self.main, self.led2, interval2) # Workerの登録
# Workerの定義
def main(self, led_port, interval):
led:bit = 1
while is_worker_running():
led_port.wr(led) # ポートへの書き込み
led = ~led
self._wait(interval)
おしまい
Github
https://github.com/ktok07b6/polyphony

Más contenido relacionado

La actualidad más candente

言語処理系入門€10
言語処理系入門€10言語処理系入門€10
言語処理系入門€10Kenta Hattori
 
Python 3.6 リリースパーティー 発表資料
Python 3.6 リリースパーティー 発表資料Python 3.6 リリースパーティー 発表資料
Python 3.6 リリースパーティー 発表資料Atsuo Ishimoto
 
Pynqでカメラ画像をリアルタイムfastx コーナー検出
Pynqでカメラ画像をリアルタイムfastx コーナー検出Pynqでカメラ画像をリアルタイムfastx コーナー検出
Pynqでカメラ画像をリアルタイムfastx コーナー検出marsee101
 
サイバーエージェントにおけるMLOpsに関する取り組み at PyDataTokyo 23
サイバーエージェントにおけるMLOpsに関する取り組み at PyDataTokyo 23サイバーエージェントにおけるMLOpsに関する取り組み at PyDataTokyo 23
サイバーエージェントにおけるMLOpsに関する取り組み at PyDataTokyo 23Masashi Shibata
 
PEP8を読んでみよう
PEP8を読んでみようPEP8を読んでみよう
PEP8を読んでみよう2bo 2bo
 
XML-RPC : Pythonが「電池付属」と呼ばれる理由
XML-RPC : Pythonが「電池付属」と呼ばれる理由XML-RPC : Pythonが「電池付属」と呼ばれる理由
XML-RPC : Pythonが「電池付属」と呼ばれる理由Ransui Iso
 
TensorFlow XLAは、 中で何をやっているのか?
TensorFlow XLAは、 中で何をやっているのか?TensorFlow XLAは、 中で何をやっているのか?
TensorFlow XLAは、 中で何をやっているのか?Mr. Vengineer
 
Tensorflow dynamically loadable XLA plugin ソースコード解析
Tensorflow  dynamically loadable XLA plugin ソースコード解析Tensorflow  dynamically loadable XLA plugin ソースコード解析
Tensorflow dynamically loadable XLA plugin ソースコード解析Mr. Vengineer
 
TensorFlow XLAの可能性
TensorFlow XLAの可能性 TensorFlow XLAの可能性
TensorFlow XLAの可能性 Mr. Vengineer
 
Vivado hlsのシミュレーションとhlsストリーム
Vivado hlsのシミュレーションとhlsストリームVivado hlsのシミュレーションとhlsストリーム
Vivado hlsのシミュレーションとhlsストリームmarsee101
 
TensorFlow XLA とハードウェア
TensorFlow XLA とハードウェアTensorFlow XLA とハードウェア
TensorFlow XLA とハードウェアMr. Vengineer
 
高位合成ツールVivado hlsのopen cv対応
高位合成ツールVivado hlsのopen cv対応高位合成ツールVivado hlsのopen cv対応
高位合成ツールVivado hlsのopen cv対応marsee101
 
LLdeade Python Language Update
LLdeade Python Language UpdateLLdeade Python Language Update
LLdeade Python Language UpdateAtsushi Shibata
 
メモリ抽象化フレームワークPyCoRAMを用いたソフトプロセッサ混載FPGAアクセラレータの開発
メモリ抽象化フレームワークPyCoRAMを用いたソフトプロセッサ混載FPGAアクセラレータの開発メモリ抽象化フレームワークPyCoRAMを用いたソフトプロセッサ混載FPGAアクセラレータの開発
メモリ抽象化フレームワークPyCoRAMを用いたソフトプロセッサ混載FPGAアクセラレータの開発Shinya Takamaeda-Y
 
「ディープラーニングでは、エコシステムが大切よ!」
 「ディープラーニングでは、エコシステムが大切よ!」 「ディープラーニングでは、エコシステムが大切よ!」
「ディープラーニングでは、エコシステムが大切よ!」Mr. Vengineer
 
ACRiウェビナー:小野様ご講演資料
ACRiウェビナー:小野様ご講演資料ACRiウェビナー:小野様ご講演資料
ACRiウェビナー:小野様ご講演資料直久 住川
 

La actualidad más candente (20)

言語処理系入門€10
言語処理系入門€10言語処理系入門€10
言語処理系入門€10
 
Python 3.6 リリースパーティー 発表資料
Python 3.6 リリースパーティー 発表資料Python 3.6 リリースパーティー 発表資料
Python 3.6 リリースパーティー 発表資料
 
Pynqでカメラ画像をリアルタイムfastx コーナー検出
Pynqでカメラ画像をリアルタイムfastx コーナー検出Pynqでカメラ画像をリアルタイムfastx コーナー検出
Pynqでカメラ画像をリアルタイムfastx コーナー検出
 
Inside FastEnum
Inside FastEnumInside FastEnum
Inside FastEnum
 
サイバーエージェントにおけるMLOpsに関する取り組み at PyDataTokyo 23
サイバーエージェントにおけるMLOpsに関する取り組み at PyDataTokyo 23サイバーエージェントにおけるMLOpsに関する取り組み at PyDataTokyo 23
サイバーエージェントにおけるMLOpsに関する取り組み at PyDataTokyo 23
 
PEP8を読んでみよう
PEP8を読んでみようPEP8を読んでみよう
PEP8を読んでみよう
 
XML-RPC : Pythonが「電池付属」と呼ばれる理由
XML-RPC : Pythonが「電池付属」と呼ばれる理由XML-RPC : Pythonが「電池付属」と呼ばれる理由
XML-RPC : Pythonが「電池付属」と呼ばれる理由
 
TensorFlow XLAは、 中で何をやっているのか?
TensorFlow XLAは、 中で何をやっているのか?TensorFlow XLAは、 中で何をやっているのか?
TensorFlow XLAは、 中で何をやっているのか?
 
Tensorflow dynamically loadable XLA plugin ソースコード解析
Tensorflow  dynamically loadable XLA plugin ソースコード解析Tensorflow  dynamically loadable XLA plugin ソースコード解析
Tensorflow dynamically loadable XLA plugin ソースコード解析
 
TensorFlow XLAの可能性
TensorFlow XLAの可能性 TensorFlow XLAの可能性
TensorFlow XLAの可能性
 
Cythonの一喜一憂
Cythonの一喜一憂Cythonの一喜一憂
Cythonの一喜一憂
 
Vivado hlsのシミュレーションとhlsストリーム
Vivado hlsのシミュレーションとhlsストリームVivado hlsのシミュレーションとhlsストリーム
Vivado hlsのシミュレーションとhlsストリーム
 
Zynq+PyCoRAM(+Debian)入門
Zynq+PyCoRAM(+Debian)入門Zynq+PyCoRAM(+Debian)入門
Zynq+PyCoRAM(+Debian)入門
 
TensorFlow XLA とハードウェア
TensorFlow XLA とハードウェアTensorFlow XLA とハードウェア
TensorFlow XLA とハードウェア
 
Hachiojipm41
Hachiojipm41Hachiojipm41
Hachiojipm41
 
高位合成ツールVivado hlsのopen cv対応
高位合成ツールVivado hlsのopen cv対応高位合成ツールVivado hlsのopen cv対応
高位合成ツールVivado hlsのopen cv対応
 
LLdeade Python Language Update
LLdeade Python Language UpdateLLdeade Python Language Update
LLdeade Python Language Update
 
メモリ抽象化フレームワークPyCoRAMを用いたソフトプロセッサ混載FPGAアクセラレータの開発
メモリ抽象化フレームワークPyCoRAMを用いたソフトプロセッサ混載FPGAアクセラレータの開発メモリ抽象化フレームワークPyCoRAMを用いたソフトプロセッサ混載FPGAアクセラレータの開発
メモリ抽象化フレームワークPyCoRAMを用いたソフトプロセッサ混載FPGAアクセラレータの開発
 
「ディープラーニングでは、エコシステムが大切よ!」
 「ディープラーニングでは、エコシステムが大切よ!」 「ディープラーニングでは、エコシステムが大切よ!」
「ディープラーニングでは、エコシステムが大切よ!」
 
ACRiウェビナー:小野様ご講演資料
ACRiウェビナー:小野様ご講演資料ACRiウェビナー:小野様ご講演資料
ACRiウェビナー:小野様ご講演資料
 

Destacado

集積回路が真の道具になるために
集積回路が真の道具になるために集積回路が真の道具になるために
集積回路が真の道具になるためにJunichi Akita
 
FPGAによる津波シミュレーション -- GPUを超える高性能計算の手法
FPGAによる津波シミュレーション -- GPUを超える高性能計算の手法FPGAによる津波シミュレーション -- GPUを超える高性能計算の手法
FPGAによる津波シミュレーション -- GPUを超える高性能計算の手法Kentaro Sano
 
IkaLog: Data Collector for Splatoon and Machine Learning
IkaLog: Data Collector for Splatoon and Machine LearningIkaLog: Data Collector for Splatoon and Machine Learning
IkaLog: Data Collector for Splatoon and Machine Learning Takeshi HASEGAWA
 
Beatroboでのハードウェアプロトタイピング
BeatroboでのハードウェアプロトタイピングBeatroboでのハードウェアプロトタイピング
BeatroboでのハードウェアプロトタイピングHideyuki TAKEI
 
IkaLog: Data Collector for Splatoon and Machine Learning (Jan 2017 @ Softbank)
IkaLog: Data Collector for Splatoon and Machine Learning (Jan 2017 @ Softbank)IkaLog: Data Collector for Splatoon and Machine Learning (Jan 2017 @ Softbank)
IkaLog: Data Collector for Splatoon and Machine Learning (Jan 2017 @ Softbank)Takeshi HASEGAWA
 
cocos2d-x で PlugAir を 使えるようにしてみた
cocos2d-x で PlugAir を 使えるようにしてみたcocos2d-x で PlugAir を 使えるようにしてみた
cocos2d-x で PlugAir を 使えるようにしてみたHideyuki TAKEI
 
電子回路の民主化とその実践
電子回路の民主化とその実践電子回路の民主化とその実践
電子回路の民主化とその実践Junichi Akita
 
Golang, make and robotics #gocon
Golang, make and robotics #goconGolang, make and robotics #gocon
Golang, make and robotics #goconHideyuki TAKEI
 
2017年のFPGA Community活動について
2017年のFPGA Community活動について2017年のFPGA Community活動について
2017年のFPGA Community活動についてMr. Vengineer
 
Cortex-M0プロセッサから自作して Lチカをやってみた
Cortex-M0プロセッサから自作してLチカをやってみたCortex-M0プロセッサから自作してLチカをやってみた
Cortex-M0プロセッサから自作して LチカをやってみたJunichi Akita
 
ゆるふわコンピュータ (IPSJ-ONE2017)
ゆるふわコンピュータ (IPSJ-ONE2017)ゆるふわコンピュータ (IPSJ-ONE2017)
ゆるふわコンピュータ (IPSJ-ONE2017)Shinya Takamaeda-Y
 
FPGA・リコンフィギャラブルシステム研究の最新動向
FPGA・リコンフィギャラブルシステム研究の最新動向FPGA・リコンフィギャラブルシステム研究の最新動向
FPGA・リコンフィギャラブルシステム研究の最新動向Shinya Takamaeda-Y
 
Pythonによるカスタム可能な高位設計技術 (Design Solution Forum 2016@新横浜)
Pythonによるカスタム可能な高位設計技術 (Design Solution Forum 2016@新横浜)Pythonによるカスタム可能な高位設計技術 (Design Solution Forum 2016@新横浜)
Pythonによるカスタム可能な高位設計技術 (Design Solution Forum 2016@新横浜)Shinya Takamaeda-Y
 
FPGAのトレンドをまとめてみた
FPGAのトレンドをまとめてみたFPGAのトレンドをまとめてみた
FPGAのトレンドをまとめてみたTakefumi MIYOSHI
 
Tensor flow usergroup 2016 (公開版)
Tensor flow usergroup 2016 (公開版)Tensor flow usergroup 2016 (公開版)
Tensor flow usergroup 2016 (公開版)Hiroki Nakahara
 
A Random Forest using a Multi-valued Decision Diagram on an FPGa
A Random Forest using a Multi-valued Decision Diagram on an FPGaA Random Forest using a Multi-valued Decision Diagram on an FPGa
A Random Forest using a Multi-valued Decision Diagram on an FPGaHiroki Nakahara
 
(公開版)FPGAエクストリームコンピューティング2017
(公開版)FPGAエクストリームコンピューティング2017 (公開版)FPGAエクストリームコンピューティング2017
(公開版)FPGAエクストリームコンピューティング2017 Hiroki Nakahara
 

Destacado (20)

Klabの梅雨対策
Klabの梅雨対策Klabの梅雨対策
Klabの梅雨対策
 
集積回路が真の道具になるために
集積回路が真の道具になるために集積回路が真の道具になるために
集積回路が真の道具になるために
 
FPGAによる津波シミュレーション -- GPUを超える高性能計算の手法
FPGAによる津波シミュレーション -- GPUを超える高性能計算の手法FPGAによる津波シミュレーション -- GPUを超える高性能計算の手法
FPGAによる津波シミュレーション -- GPUを超える高性能計算の手法
 
IkaLog: Data Collector for Splatoon and Machine Learning
IkaLog: Data Collector for Splatoon and Machine LearningIkaLog: Data Collector for Splatoon and Machine Learning
IkaLog: Data Collector for Splatoon and Machine Learning
 
Beatroboでのハードウェアプロトタイピング
BeatroboでのハードウェアプロトタイピングBeatroboでのハードウェアプロトタイピング
Beatroboでのハードウェアプロトタイピング
 
IkaLog20170316pynq_dist
IkaLog20170316pynq_distIkaLog20170316pynq_dist
IkaLog20170316pynq_dist
 
IkaLog: Data Collector for Splatoon and Machine Learning (Jan 2017 @ Softbank)
IkaLog: Data Collector for Splatoon and Machine Learning (Jan 2017 @ Softbank)IkaLog: Data Collector for Splatoon and Machine Learning (Jan 2017 @ Softbank)
IkaLog: Data Collector for Splatoon and Machine Learning (Jan 2017 @ Softbank)
 
cocos2d-x で PlugAir を 使えるようにしてみた
cocos2d-x で PlugAir を 使えるようにしてみたcocos2d-x で PlugAir を 使えるようにしてみた
cocos2d-x で PlugAir を 使えるようにしてみた
 
電子回路の民主化とその実践
電子回路の民主化とその実践電子回路の民主化とその実践
電子回路の民主化とその実践
 
Golang, make and robotics #gocon
Golang, make and robotics #goconGolang, make and robotics #gocon
Golang, make and robotics #gocon
 
2017年のFPGA Community活動について
2017年のFPGA Community活動について2017年のFPGA Community活動について
2017年のFPGA Community活動について
 
Cortex-M0プロセッサから自作して Lチカをやってみた
Cortex-M0プロセッサから自作してLチカをやってみたCortex-M0プロセッサから自作してLチカをやってみた
Cortex-M0プロセッサから自作して Lチカをやってみた
 
ゆるふわコンピュータ (IPSJ-ONE2017)
ゆるふわコンピュータ (IPSJ-ONE2017)ゆるふわコンピュータ (IPSJ-ONE2017)
ゆるふわコンピュータ (IPSJ-ONE2017)
 
FPGA・リコンフィギャラブルシステム研究の最新動向
FPGA・リコンフィギャラブルシステム研究の最新動向FPGA・リコンフィギャラブルシステム研究の最新動向
FPGA・リコンフィギャラブルシステム研究の最新動向
 
Pythonによるカスタム可能な高位設計技術 (Design Solution Forum 2016@新横浜)
Pythonによるカスタム可能な高位設計技術 (Design Solution Forum 2016@新横浜)Pythonによるカスタム可能な高位設計技術 (Design Solution Forum 2016@新横浜)
Pythonによるカスタム可能な高位設計技術 (Design Solution Forum 2016@新横浜)
 
Gpu vs fpga
Gpu vs fpgaGpu vs fpga
Gpu vs fpga
 
FPGAのトレンドをまとめてみた
FPGAのトレンドをまとめてみたFPGAのトレンドをまとめてみた
FPGAのトレンドをまとめてみた
 
Tensor flow usergroup 2016 (公開版)
Tensor flow usergroup 2016 (公開版)Tensor flow usergroup 2016 (公開版)
Tensor flow usergroup 2016 (公開版)
 
A Random Forest using a Multi-valued Decision Diagram on an FPGa
A Random Forest using a Multi-valued Decision Diagram on an FPGaA Random Forest using a Multi-valued Decision Diagram on an FPGa
A Random Forest using a Multi-valued Decision Diagram on an FPGa
 
(公開版)FPGAエクストリームコンピューティング2017
(公開版)FPGAエクストリームコンピューティング2017 (公開版)FPGAエクストリームコンピューティング2017
(公開版)FPGAエクストリームコンピューティング2017
 

Similar a Polyphony の並列化

Python勉強会1-はじめに
Python勉強会1-はじめにPython勉強会1-はじめに
Python勉強会1-はじめに理 小林
 
Weeklycms20120218
Weeklycms20120218Weeklycms20120218
Weeklycms20120218Yoshi Sakai
 
20180613 [TensorFlow分散学習] Horovodによる分散学習の実装方法と解説
20180613 [TensorFlow分散学習] Horovodによる分散学習の実装方法と解説20180613 [TensorFlow分散学習] Horovodによる分散学習の実装方法と解説
20180613 [TensorFlow分散学習] Horovodによる分散学習の実装方法と解説LeapMind Inc
 
5分でわかるphalcon php
5分でわかるphalcon php5分でわかるphalcon php
5分でわかるphalcon phpYusaku Kinoshita
 
5分でわかるPhalconPHP
5分でわかるPhalconPHP5分でわかるPhalconPHP
5分でわかるPhalconPHPShohei Tai
 
Pyconjp2014_implementations
Pyconjp2014_implementationsPyconjp2014_implementations
Pyconjp2014_implementationsmasahitojp
 
BNN CAMP vol.3  インタラクションデザインの現在―プログラミング初心者のためのopenFrameworks入門 2
BNN CAMP vol.3  インタラクションデザインの現在―プログラミング初心者のためのopenFrameworks入門 2BNN CAMP vol.3  インタラクションデザインの現在―プログラミング初心者のためのopenFrameworks入門 2
BNN CAMP vol.3  インタラクションデザインの現在―プログラミング初心者のためのopenFrameworks入門 2Atsushi Tadokoro
 
PhpStormを使おう --高槻からは快速急行が早くなります #jbugj
PhpStormを使おう --高槻からは快速急行が早くなります #jbugjPhpStormを使おう --高槻からは快速急行が早くなります #jbugj
PhpStormを使おう --高槻からは快速急行が早くなります #jbugjHisateru Tanaka
 
What is java_se_7
What is java_se_7What is java_se_7
What is java_se_7TakumiIINO
 
20221226_TITECH_lecture_ishizaki_public.pdf
20221226_TITECH_lecture_ishizaki_public.pdf20221226_TITECH_lecture_ishizaki_public.pdf
20221226_TITECH_lecture_ishizaki_public.pdfKazuaki Ishizaki
 
LPICレベル1技術解説セミナー(2012/11/11)
LPICレベル1技術解説セミナー(2012/11/11)LPICレベル1技術解説セミナー(2012/11/11)
LPICレベル1技術解説セミナー(2012/11/11)Kazuko Itoda
 
高位合成友の会 第3回 (2015/12/08) でのスライド
高位合成友の会 第3回 (2015/12/08) でのスライド高位合成友の会 第3回 (2015/12/08) でのスライド
高位合成友の会 第3回 (2015/12/08) でのスライドktok07b6
 
オブジェクト・関数型プログラミングからオブジェクト・関数型分析設計へ
オブジェクト・関数型プログラミングからオブジェクト・関数型分析設計へオブジェクト・関数型プログラミングからオブジェクト・関数型分析設計へ
オブジェクト・関数型プログラミングからオブジェクト・関数型分析設計へEverforth Co., Ltd.
 

Similar a Polyphony の並列化 (20)

Django_Fukuoka
Django_FukuokaDjango_Fukuoka
Django_Fukuoka
 
Django_fukuoka
Django_fukuokaDjango_fukuoka
Django_fukuoka
 
Python勉強会1-はじめに
Python勉強会1-はじめにPython勉強会1-はじめに
Python勉強会1-はじめに
 
Weeklycms20120218
Weeklycms20120218Weeklycms20120218
Weeklycms20120218
 
C#勉強会
C#勉強会C#勉強会
C#勉強会
 
ATN No.2 Scala事始め
ATN No.2 Scala事始めATN No.2 Scala事始め
ATN No.2 Scala事始め
 
20180613 [TensorFlow分散学習] Horovodによる分散学習の実装方法と解説
20180613 [TensorFlow分散学習] Horovodによる分散学習の実装方法と解説20180613 [TensorFlow分散学習] Horovodによる分散学習の実装方法と解説
20180613 [TensorFlow分散学習] Horovodによる分散学習の実装方法と解説
 
Clrh 110827 wfho
Clrh 110827 wfhoClrh 110827 wfho
Clrh 110827 wfho
 
5分でわかるphalcon php
5分でわかるphalcon php5分でわかるphalcon php
5分でわかるphalcon php
 
5分でわかるPhalconPHP
5分でわかるPhalconPHP5分でわかるPhalconPHP
5分でわかるPhalconPHP
 
Pyconjp2014_implementations
Pyconjp2014_implementationsPyconjp2014_implementations
Pyconjp2014_implementations
 
BNN CAMP vol.3  インタラクションデザインの現在―プログラミング初心者のためのopenFrameworks入門 2
BNN CAMP vol.3  インタラクションデザインの現在―プログラミング初心者のためのopenFrameworks入門 2BNN CAMP vol.3  インタラクションデザインの現在―プログラミング初心者のためのopenFrameworks入門 2
BNN CAMP vol.3  インタラクションデザインの現在―プログラミング初心者のためのopenFrameworks入門 2
 
Subprocess no susume
Subprocess no susumeSubprocess no susume
Subprocess no susume
 
PhpStormを使おう --高槻からは快速急行が早くなります #jbugj
PhpStormを使おう --高槻からは快速急行が早くなります #jbugjPhpStormを使おう --高槻からは快速急行が早くなります #jbugj
PhpStormを使おう --高槻からは快速急行が早くなります #jbugj
 
What is java_se_7
What is java_se_7What is java_se_7
What is java_se_7
 
20221226_TITECH_lecture_ishizaki_public.pdf
20221226_TITECH_lecture_ishizaki_public.pdf20221226_TITECH_lecture_ishizaki_public.pdf
20221226_TITECH_lecture_ishizaki_public.pdf
 
LPICレベル1技術解説セミナー(2012/11/11)
LPICレベル1技術解説セミナー(2012/11/11)LPICレベル1技術解説セミナー(2012/11/11)
LPICレベル1技術解説セミナー(2012/11/11)
 
高位合成友の会 第3回 (2015/12/08) でのスライド
高位合成友の会 第3回 (2015/12/08) でのスライド高位合成友の会 第3回 (2015/12/08) でのスライド
高位合成友の会 第3回 (2015/12/08) でのスライド
 
Introduction of Python
Introduction of PythonIntroduction of Python
Introduction of Python
 
オブジェクト・関数型プログラミングからオブジェクト・関数型分析設計へ
オブジェクト・関数型プログラミングからオブジェクト・関数型分析設計へオブジェクト・関数型プログラミングからオブジェクト・関数型分析設計へ
オブジェクト・関数型プログラミングからオブジェクト・関数型分析設計へ
 

Más de ryos36

Pycairo を使ってみる その1
Pycairo を使ってみる その1Pycairo を使ってみる その1
Pycairo を使ってみる その1ryos36
 
ストーリーとは
ストーリーとはストーリーとは
ストーリーとはryos36
 
CNN でテニス選手の動きを解析する
CNN でテニス選手の動きを解析するCNN でテニス選手の動きを解析する
CNN でテニス選手の動きを解析するryos36
 
Polyphony 新機能ツアー
Polyphony 新機能ツアーPolyphony 新機能ツアー
Polyphony 新機能ツアーryos36
 
Stellaris を使った組み込みアプリ開発ガイド
Stellaris を使った組み込みアプリ開発ガイドStellaris を使った組み込みアプリ開発ガイド
Stellaris を使った組み込みアプリ開発ガイドryos36
 
PYNQ 祭り: Pmod のプログラミング
PYNQ 祭り: Pmod のプログラミングPYNQ 祭り: Pmod のプログラミング
PYNQ 祭り: Pmod のプログラミングryos36
 
SDSoC でストリーム
SDSoC でストリームSDSoC でストリーム
SDSoC でストリームryos36
 
Analog Devices の IP コアを使う
Analog Devices の IP コアを使うAnalog Devices の IP コアを使う
Analog Devices の IP コアを使うryos36
 
SDSoC と Vivado
SDSoC と VivadoSDSoC と Vivado
SDSoC と Vivadoryos36
 
高速化のポイント
高速化のポイント高速化のポイント
高速化のポイントryos36
 
20周遅れ
20周遅れ20周遅れ
20周遅れryos36
 
90分 Scheme to C(勝手に抄訳版)
90分 Scheme to C(勝手に抄訳版)90分 Scheme to C(勝手に抄訳版)
90分 Scheme to C(勝手に抄訳版)ryos36
 
並列計算への道 2015年版
並列計算への道 2015年版並列計算への道 2015年版
並列計算への道 2015年版ryos36
 
NiosII と RTOS について
NiosII と RTOS についてNiosII と RTOS について
NiosII と RTOS についてryos36
 
Synthesijer で作るFORTH仮想マシン
Synthesijer で作るFORTH仮想マシンSynthesijer で作るFORTH仮想マシン
Synthesijer で作るFORTH仮想マシンryos36
 

Más de ryos36 (15)

Pycairo を使ってみる その1
Pycairo を使ってみる その1Pycairo を使ってみる その1
Pycairo を使ってみる その1
 
ストーリーとは
ストーリーとはストーリーとは
ストーリーとは
 
CNN でテニス選手の動きを解析する
CNN でテニス選手の動きを解析するCNN でテニス選手の動きを解析する
CNN でテニス選手の動きを解析する
 
Polyphony 新機能ツアー
Polyphony 新機能ツアーPolyphony 新機能ツアー
Polyphony 新機能ツアー
 
Stellaris を使った組み込みアプリ開発ガイド
Stellaris を使った組み込みアプリ開発ガイドStellaris を使った組み込みアプリ開発ガイド
Stellaris を使った組み込みアプリ開発ガイド
 
PYNQ 祭り: Pmod のプログラミング
PYNQ 祭り: Pmod のプログラミングPYNQ 祭り: Pmod のプログラミング
PYNQ 祭り: Pmod のプログラミング
 
SDSoC でストリーム
SDSoC でストリームSDSoC でストリーム
SDSoC でストリーム
 
Analog Devices の IP コアを使う
Analog Devices の IP コアを使うAnalog Devices の IP コアを使う
Analog Devices の IP コアを使う
 
SDSoC と Vivado
SDSoC と VivadoSDSoC と Vivado
SDSoC と Vivado
 
高速化のポイント
高速化のポイント高速化のポイント
高速化のポイント
 
20周遅れ
20周遅れ20周遅れ
20周遅れ
 
90分 Scheme to C(勝手に抄訳版)
90分 Scheme to C(勝手に抄訳版)90分 Scheme to C(勝手に抄訳版)
90分 Scheme to C(勝手に抄訳版)
 
並列計算への道 2015年版
並列計算への道 2015年版並列計算への道 2015年版
並列計算への道 2015年版
 
NiosII と RTOS について
NiosII と RTOS についてNiosII と RTOS について
NiosII と RTOS について
 
Synthesijer で作るFORTH仮想マシン
Synthesijer で作るFORTH仮想マシンSynthesijer で作るFORTH仮想マシン
Synthesijer で作るFORTH仮想マシン
 

Polyphony の並列化

Notas del editor

  1. Polyphony がどんなツールなのかをかいつまんで再度まとめると Python で書いたコードを HDL に変換するコンパイラ 動くものを早く作る 性能には“現在のところ”重きを置いていない というツールになります。
  2. そして、 Python のコードをコンパイルすると言ってもすべてのコードをコンパイルできるわけではなく、 とうぜん、pritnt などの文字列などはサポートされておらず、Python のサブセットになっています。
  3. デザインフローとしては 「Python によるコードの記述」をし ここが重要なのですが「Python によるコードの実行」によりデバッグをしておきます そして、「Polyphony によりコンパイル」をし 生成された Verilog コードを「シミュレーション」し 各ベンダーのツールで「合成」をしたのち 実機で「実行」するという形をとります。
  4. でその Polyphony というコンパイラは何をしているかというと 上のような 掛け算と足し算の組み合わせを例にとります。
  5. 内部的には IR という内部表現にして、代入も必ず一回という SSA 形式にします。 こうするとコンパイラ内で最適化を掛けやすくなります。
  6. これらの文章の順序性をみます。
  7. これらはスケジューリングと呼ばれたりします。 並列化の一種です。
  8. RISC-V の実装に先立ち使用法による分類をしました。 これは多分にソフトウェアから見た分類であり、また、Zynq に代表される、 昨今の SoC と FPGA の融合された環境をかなり意識した分類になっています。 また、学術的なエビデンスが必要である場合、オープンソースのサイトから 抜き出してカウントしたなどの調査が必要かと思いますが、 ここではそのような正統的なアカデミックなアプローチをとっているわけではありません。 ということをお断りしたうえで使用法の分類をいたします。
  9. 関数呼び出しタイプと分類したものは、FPGA のそばに CPU がありそこから関数のような形で呼ばれることを念頭に置いた分類です。
  10. さらに LS/SW に代表されるメモリへのアクセスも処理を遅くします。実装としては関数を呼んでいるわけですが、その関数の先で何クロックも消費します。
  11. ここで、Polyphony のこの数年の逐次処理に対するコンパイルのアプローチの変遷を語りたいと思います。 最初の実装は、単純な逐次処理のスケジューリングでした。関数コールもひとつのクロックを要するステージが必要でした。 次に、関数コールをインライン化できるようになりました。これで関数コールの先も一緒に最適化できるようになりました。 その後、追加機能として、オブジェクト指向に対応し、それらのインスタンスをもインライン展開するようになりました。 そられのインスタンスはライブラリ化可能なので実績のあるクラスを他で流用できるようになりました。 現在、取り組んでいるのは for 文のパイプライン化やアンロールであったり、特定条件化のパイプライン化です。
  12. 先ほどの話に戻ると、 LS/SW に代表されるメモリへのアクセスはそもそも処理を遅くするのですが、 関数を呼ぶぶことでその関数の先で何クロックも消費します。 最近の Polyphony はちょっと賢くなって関数呼び出しをインライン化して最適化します。 しかし、これは先ほども言いましたが、あくまでスケジューリングです。 パイプライン化しているわけではないので、微々たるスピードアップをしますが、 CPU としての高速化はしません。
  13. さきほどの高位合成の高速化で スケジューリングとパイプライン という話をしました。Polyphony では 普通に書いたプログラムを逐次処理をスケジューリングし並列化します。 そして、意図的にworker でパイプライン化したプログラムを並列化します。
  14. でここで、高位合成をしたいといったときの端的な質問になるのですが、 私は画像処理をしたいと思っています。 「OpenCV を高位合成でコンパイルして高速ハードを作れますか?」 という質問に対しては、あまりいい回答が出来ないのが現状です。これは Python でなくても C 言語でもそうだと思います。 現状のソースのパイプライン化についてうまい回答がないからです。
  15. たとえば OpenCV にあるステレオ視差のライブラリを考えます。
  16. 2つの種類があるのですが、BM と SGBM というもので これらを高位合成でコンパイルできるか?ということです。
  17. OpenCV のソースを見ると parallel_for とソフト的な様々な工夫をしていることがわかりませう。 これは高位合成のコンパイラにとってかなりつらい工夫です。 この工夫がかえってコンパイルできない原因になってしまいます。
  18. 別の要因もあります。 例えばブロックマッチングはブロックの比較です。
  19. 原理的にはラインバッファを使って比較ができます。 なので、FPGA 向きと言えます。
  20. ところが、SGBM というのがあるのですが、これはブロックマッチングではなく 経路に沿って積算することで正しいし視差を求めるアルゴリズムになっています。
  21. 経路によってはラインバッファで対応できますが、 パイプラインが破たんする箇所や工夫しないとできない部分、 そもそもリアルタイム処理できない部分があり リアルタイム処理するなら FPGA 向きではないアルゴリズムになっています。 しかし、こういう複雑なアルゴリムこそ高位合成で実現してほしい。 現状は、この手のソースは既存のソースをコンパイルしただけでは高位合成では実現できません。 その高位合成のルールに従って書き直す必要があるのですが、それであれば Verilog で書いた方がよっぽど早く実現できます。
  22. ここで自社のCMをさせていただきます。 先ほどの難しい SGM を数式を元に HDL 化しました。視差画像の抜き出しが出来ます。 ご興味のある方は InterBEE で発表予定ですので、来ていただければと思います。
  23. でここで、高位合成をしたいといったときの端的な質問になるのですが、 私は画像処理をしたいと思っています。 「OpenCV を高位合成でコンパイルして高速ハードを作れますか?」 という質問に対しては、あまりいい回答が出来ないのが現状です。これは Python でなくても C 言語でもそうだと思います。 現状のソースのパイプライン化についてうまい回答がないからです。
  24. RISC-V の実装に先立ち使用法による分類をしました。 これは多分にソフトウェアから見た分類であり、また、Zynq に代表される、 昨今の SoC と FPGA の融合された環境をかなり意識した分類になっています。 また、学術的なエビデンスが必要である場合、オープンソースのサイトから 抜き出してカウントしたなどの調査が必要かと思いますが、 ここではそのような正統的なアカデミックなアプローチをとっているわけではありません。 ということをお断りしたうえで使用法の分類をいたします。
  25. RISC-V の実装に先立ち使用法による分類をしました。 これは多分にソフトウェアから見た分類であり、また、Zynq に代表される、 昨今の SoC と FPGA の融合された環境をかなり意識した分類になっています。 また、学術的なエビデンスが必要である場合、オープンソースのサイトから 抜き出してカウントしたなどの調査が必要かと思いますが、 ここではそのような正統的なアカデミックなアプローチをとっているわけではありません。 ということをお断りしたうえで使用法の分類をいたします。
  26. 先ほどの話に戻ると、 LS/SW に代表されるメモリへのアクセスはそもそも処理を遅くするのですが、 関数を呼ぶぶことでその関数の先で何クロックも消費します。 最近の Polyphony はちょっと賢くなって関数呼び出しをインライン化して最適化します。 しかし、これは先ほども言いましたが、あくまでスケジューリングです。 パイプライン化しているわけではないので、微々たるスピードアップをしますが、 CPU としての高速化はしません。
  27. HDL の基本的なことになり、スペシャリストの方も多い場で、恐縮ですが、 HDLでは排他制御、ソフト的な用語かもしれませんが、があります。 つまりあるブロック内でのみ書き込みがゆるされるということです。
  28. 書き込みは基本的に1っ所からです。参照はいくらでもできるのですが FF という性質上1つのとこからしか書き込めないわけです。
  29. さきほどの CPU のステージを私なりに簡略化した絵がこれです。 PC や Registers はどこかに所属して、書き込みが整理されるわけです。 もちろん、一か所に集約して、全部から書き込みできるようにも設計できるとは思いますが そうすると、書き込み処理は混乱すると思います。 ここではオーソドックスと思われるはじめてCPUを作る人が考えやすい形式を想定します。