Mulvery
CPU+FPGAプラットフォームのための
Rubyベースの開発環境
東京農工大学 工学府 情報工学専攻
照屋大地
富士通クラウドテクノロジーズ株式会社
呉屋寛裕
平成29年度未踏事業 成果報告会
1
自己紹介
照屋大地
東京農工大学 工学府
情報工学専攻 M1
2
呉屋寛裕
富士通クラウド
テクノロジーズ株式会社
Rubyのプログラムを
どえらく速くする
3
マイコン Internet
きっかけ:大量のマイクを扱いたい
処理能力
不足
4
FPGA Internet
きっかけ:大量のマイクを扱いたい
パワフルだけど
開発面倒
回路を自由に
組み換え可能なチップ
「処理のハードウェア化」
5
“ぜんぶRubyだけでサクサク書きたい”
Mulveryプロジェクト
マイ
コン
FPGA Internet
開発面倒だけど
パワフル
非力だけど
扱いやすい
連携が面倒
きっかけ:大量のマイクを扱いたい
6
マイコン
「開発が面倒」?
Network
ソフトウェア
開発するシステム
セ
ン
サ
(
ア
ク
チ
ュ
エ
ー
タ
)
デバイス
ドライバ
ソフトウェア
ソフトウェア
ソースコード群
開発段階
7
マイコン
FPGA
「開発が面倒」?
Network
ソフトウェア
開発するシステム
ハードウェア
課題1
幅広い分野の
知識と開発が必要
セ
ン
サ
(
ア
ク
チ
ュ
エ
ー
タ
)
デバイス
ドライバ
ソフトウェア
ソフトウェア
ソースコード群
ハードウェア
制約ファイル
ハードウェア
設計ファイル
ハードウェア
ソースコード群
開発段階
8
set_directive_pipeline
“Interface::get_data
/get_data_loop0”
既存の設計支援技術と、その難しさ
• 高位合成(High Level Synthesis, HLS)
CやJava等の高級言語をハードウェア記述言語に変換する技術
C言語
や
Java言語
最適化
指示の記述
(専用命令)
ハード
記述言語
シミュレータ
による評価
FPGA
課題2
HWを知らないと
最適化が難しい
高位合成系
逐次実行型 データ駆動型
9
マイコン
FPGA
新しい開発環境:Mulvery
Internet
ソフトウェア
開発段階 開発するシステム
ハードウェア
Mulvery
フレームワーク
Ruby
ソースコード
セ
ン
サ
ハード化対象を
自動で抽出
10
回路設計の
知識不要
マイコン+FPGAな環境?
Trenz Electronics社
“Zynqberry”
簡単に書けても
環境がない・・・
マイコン+FPGAな
Raspberry Pi
互換ボード
11
マイコン+FPGAな環境?
Trenz Electronics社
“Zynqberry”
ラズパイに
全部のせ・・・!
マイコン+FPGAな
Raspberry Pi
互換ボード
12
あたらしいハードウェア合成手法
Reactive Programming (RP)
「データストリーム」をオブジェクトとして扱うプログラミングモデル
Web開発
Web開発
Android開発
Reactive Programmingを用いたプログラムからの合成
今回は
Rxを使ったコードを
速くする
13
ReactiveXによる処理記述の例
time
map(){|event| 1 }
1 1 1 1
1 2 3 4
scan(){|sum, event| sum + event}
Source
map
scan
イベント発生の数をカウントする例:
データフロー
グラフ
Events
DataStream
逐次実行⇒データ駆動の
変換が不要
性能が低下しにくい
14
ハードウェア合成の例
events = Stream.from_pin(MIO::p0)
count = events
.map(){ |event| 1 }
.scan(){ |acc, x| acc + x }
再掲:イベントのカウント
15
ハードウェア合成の例
events = Stream.from_pin(MIO::p0)
count = events
.map(){ |event| 1 }
.scan(){ |acc, x| acc + x }
module S_0(p0);
…
endmodule
S_0.v
ハ
ー
ド
ウ
ェ
ア
記
述
16
Streamオブジェクトが
ハードウェアを生成する
ハードウェア合成の例
events = Stream.from_pin(MIO::p0)
count = events
.map(){ |event| 1 }
.scan(){ |acc, x| acc + x }
module S_0(p0);
…
Map_0 map_0(
.din(w_0_0),
.v_din(v_w_0_0),
.dout(w_0_1),
.v_dout(v_w_0_1));
endmodule
module Map_0(…);
…
dout <= 8’d1;
v_din <= 1’b1;
…
endmodule
Map_0.vS_0.v
テンプレート
から自動生成
17
ハ
ー
ド
ウ
ェ
ア
記
述
Streamオブジェクトが
ハードウェアを生成する
ハードウェア合成の例
events = Stream.from_pin(MIO::p0)
count = events
.map(){ |event| 1 }
.scan(){ |acc, x| acc + x }
module S_0(p0);
…
Map_0 map_0(
.din(w_0_0),
.v_din(v_w_0_0),
.dout(w_0_1),
.v_dout(v_w_0_1));
Scan_0 scan_0(
…
endmodule
module Map_0(…);
…
dout <= 8’d1;
v_din <= 1’b1;
…
endmodule
module Scan_0(…);
…
endmodule
Scan_0.v
Map_0.vS_0.v
ハ
ー
ド
ウ
ェ
ア
記
述
18
Streamオブジェクトが
ハードウェアを生成する
ハードウェア合成の例
events = Stream.from_pin(MIO::p0)
count = events
.map(){ |event| 1 }
.scan(){ |acc, x| acc + x }
module S_0(p0);
…
Map_0 map_0(
.din(w_0_0),
.v_din(v_w_0_0),
.dout(w_0_1),
.v_dout(v_w_0_1));
Scan_0 scan_0(
…
endmodule
module Map_0(…);
…
dout <= 8’d1;
v_din <= 1’b1;
…
endmodule
Streamオブジェクトが
ハードウェアを生成する
module Scan_0(…);
…
endmodule
Scan_0.v
Map_0.vS_0.v
他にも・・・
・Topモジュール
・計算カーネル
etc…
ハ
ー
ド
ウ
ェ
ア
記
述
19
マイコン
FPGA
ハードの自動抽出は・・・?
Internet
ソフトウェア
開発段階 開発するシステム
ハードウェア
Mulvery
フレームワーク
Ruby
ソースコード
セ
ン
サ
ハード化対象を
自動で抽出
20
ハード/ソフトの自動分割
I2C Bus A
groupBy
average average
0x1234 0x5678
データフローグラフ
def initialize()
i2c_stream = Stream.new(I2C_BUS_A)
sensors = i2c_stream.group_by(2)
{ |d| d. sensor_ id }
for sensor in sensors do
@averages[sensor] =sensor.average(5)
end
end
def main()
for average in @averages do
p average[sensor].get_latest()
end
wait_ms(100)
end
ソフトウェア部ハードウェア部
sensors[A] Sensors[B]
averages[B]averages[A]
i2c_stream
Rxで書きにくい部分は
多く場合ソフト実行が速い 21
Rx記述⇒ハード それ以外⇒ソフト
ハード化
メモリに
マップ
とりあえず試してみる
• 128x128の画像に対するラプラシアンフィルタ適用
∗ =
…
128画素
(1行)
…
…
…
…
…
入力 5行分ためる 畳み込み演算
x128
…
128画素
(1行)
22
ソフト実行 VS. ハード実行
• Icarus Verilogでカーネルをシミュレーション
クロック
出力
バッファ
入力
バッファリング
畳み込み
遅延
出力x128
135クロック/画像 @ 100MHz
・Rubyでソフト実行(w/ Core-i3 @ 3.4GHz):500ms(CPU時間)
・ハード合成&シミュレーション(Zynq-7000 @ 100MHz):0.16ms(概算)
23
うまく高速化
できそう!
FPGAへのインプリメンテーション
• Icarus Verilogで動作をシミュレーション
クロック
出力
バッファ
入力
バッファリング
畳み込み
遅延
出力x128
135クロック/画像, 100MHz
⇒約740kfps(?)
FPGAの消費が少ない
さらに複雑な処理ができそう
24
FPGA消費率
FPGA上の回路
HW-SW協調設計環境
• C/C++コードの一部をハードウェア化
• オフロード対象を明示的に指定する
Intel FPGA SDK
for OpenCL
ハード化のための
知識が必要・・・
⇒HW技術者向け
25
軽量言語によるメタプログラミング
• 軽量言語をドメイン固有言語(DSL)として用いる
• Scala, Haskellともに強い静的型付け
⇒生成されるHWを設計しておく必要がある
class Max2 extends Module {
val io = new Bundlw {
val x = UInt(INPUT, 8)
val y = UInt(INPUT, 8)
val z = UInt(OUTPUT, 8)}
io.z = Mux(io.x > io.y, io.x, io.y)
}
ハードウェア記述言語の
メタプログラミング
⇒HW技術者向け
CλaSH
(Haskell) (Scala)(Scala)
[2]より引用
26
ところで・・・
合宿の時:
Twitterでは:
micropython
mruby
Pythonのほうが
よいかも?
27
なぜRubyなのか
Rubyの方が見た目が好みだったから
events = Stream.from_pin(MIO::p0)
t = events.map(lambda event: 1)
count = t.scan(lambda acc, x: acc + x)
VS
Python
・Method chainがしにくい
・ブロックが渡せない
⇒イマイチ・・・
events = Stream.from_pin(MIO::p0)
count = events
.map(){ |event| 1 }
.scan(){ |acc, x| acc + x }
Ruby
・Method chainできる
・ラムダ抽象をブロックで
⇒かっこいい!
28
用途の検討
工場IoTで使えるかも
⇒データアグリゲーションしたい
⇒でもオペレーションでFPGAは
触りたくない・・・
車やロボは難しい
⇒必ずプロがチューニング
プロユースと汎用マイコン
の境目にマーケット?
29
FPGAベンダのXilinx社を訪問
デバイスコントローラとしての活用
30
1024個のフルカラーLED(NeoPixel)を制御してみる
マイコン
Web Server
FPGA
LED制御
LED
マトリクス
マイコンだと
アセンブリが必要
akiba LED ピカリ館さんにて
1000個!?
一度にまとめて
動かせるんですか!?
0.4/0.8us
パルスx24x1024
さいごに
31
Mulveryのまとめ
32
・簡単にFPGA開発ができる
Rxからハード合成する技術を開発
チューニングコストを削減!
・多数の外部デバイスが扱える
Slack Botを動かしつつ
LEDを1024個同時に制御した!
これからやりたいこと
•リアルタイム保障をより正確にする
• タイマ間の同期・レイテンシの保障
• データ受け取りタイミングの保障
•誰でも使えるようにする
• 動くAPI/動かないAPIのドキュメント化
• OSを含めた開発環境の提供
33
34
35

More Related Content

PDF
ESPer2006 情報家電プロトコルスタック開発の展開
PPTX
mruby/c機能紹介20160329
PPTX
今日から始めるC3.js
PDF
Pythonおじさんのweb2py挑戦記
PDF
bottleで始めるWEBアプリの最初の一歩
PDF
OSSと私
PPTX
mruby/c適用期待分野20160329
PPTX
210728 mpy
ESPer2006 情報家電プロトコルスタック開発の展開
mruby/c機能紹介20160329
今日から始めるC3.js
Pythonおじさんのweb2py挑戦記
bottleで始めるWEBアプリの最初の一歩
OSSと私
mruby/c適用期待分野20160329
210728 mpy

Similar to 2017年度未踏事業最終成果報告 (20)

PDF
ET2014資料: mruby プログラム言語Rubyによる組込みソト開発
PDF
iMulvery -Mulveryの新機能のご紹介-
PPTX
Ruby で ffmpeg の filter_complex と戯れる話
PPTX
Ruby で ffmpeg の filter_complex と戯れる話
PPTX
DLフレームワークChainerの紹介と分散深層強化学習によるロボット制御
PPTX
第4回 SoftLayer勉強会 資料
PDF
CONBU API の開発
PPTX
mruby IoTプラットフォーム
PPTX
NW-DIY で開拓したい社会
PDF
Introduction to Quantum Programming Studio
PDF
Jumpwire.io @ Maker Faire Tokyo 2015
PDF
Lagopus Project (Open Source Conference)
PDF
ソフトバンクにおける Java による クラウドネイティブの実現
PDF
サーバ擬人化ユーザ会キックオフ資料 Slideshare ver
PPTX
ゲームの通信をつくる仕事はどうなるのだろう?
PDF
Introduction to NetOpsCoding
PPTX
JAWS目黒 EC2チューニングTips #jawsmeguro #jawsug
PDF
ネットワーク運用自動化お悩み相談会
PDF
Jslug2 nagoya-shibata
PPTX
WebRTC mediasoup on raspberrypi3
ET2014資料: mruby プログラム言語Rubyによる組込みソト開発
iMulvery -Mulveryの新機能のご紹介-
Ruby で ffmpeg の filter_complex と戯れる話
Ruby で ffmpeg の filter_complex と戯れる話
DLフレームワークChainerの紹介と分散深層強化学習によるロボット制御
第4回 SoftLayer勉強会 資料
CONBU API の開発
mruby IoTプラットフォーム
NW-DIY で開拓したい社会
Introduction to Quantum Programming Studio
Jumpwire.io @ Maker Faire Tokyo 2015
Lagopus Project (Open Source Conference)
ソフトバンクにおける Java による クラウドネイティブの実現
サーバ擬人化ユーザ会キックオフ資料 Slideshare ver
ゲームの通信をつくる仕事はどうなるのだろう?
Introduction to NetOpsCoding
JAWS目黒 EC2チューニングTips #jawsmeguro #jawsug
ネットワーク運用自動化お悩み相談会
Jslug2 nagoya-shibata
WebRTC mediasoup on raspberrypi3
Ad

More from Daichi Teruya (6)

PDF
Mulvery Detail - English
PDF
Mulvery技術詳細
PDF
IoTLT17
PDF
Mulvery@沖縄Ruby会議02
PPTX
(Lambdaだけで) 純LISPのような ナニかを作る
PPTX
Mado magisystemx hago3
Mulvery Detail - English
Mulvery技術詳細
IoTLT17
Mulvery@沖縄Ruby会議02
(Lambdaだけで) 純LISPのような ナニかを作る
Mado magisystemx hago3
Ad

2017年度未踏事業最終成果報告