SlideShare una empresa de Scribd logo
1 de 35
Descargar para leer sin conexión
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

Más contenido relacionado

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

ET2014資料: mruby プログラム言語Rubyによる組込みソト開発
ET2014資料: mruby プログラム言語Rubyによる組込みソト開発ET2014資料: mruby プログラム言語Rubyによる組込みソト開発
ET2014資料: mruby プログラム言語Rubyによる組込みソト開発Kazuaki Tanaka
 
iMulvery -Mulveryの新機能のご紹介-
iMulvery -Mulveryの新機能のご紹介-iMulvery -Mulveryの新機能のご紹介-
iMulvery -Mulveryの新機能のご紹介-Daichi Teruya
 
Ruby で ffmpeg の filter_complex と戯れる話
Ruby で ffmpeg の filter_complex と戯れる話Ruby で ffmpeg の filter_complex と戯れる話
Ruby で ffmpeg の filter_complex と戯れる話Yoshikazu Kawashima
 
Ruby で ffmpeg の filter_complex と戯れる話
Ruby で ffmpeg の filter_complex と戯れる話Ruby で ffmpeg の filter_complex と戯れる話
Ruby で ffmpeg の filter_complex と戯れる話ssuser551c92
 
DLフレームワークChainerの紹介と分散深層強化学習によるロボット制御
DLフレームワークChainerの紹介と分散深層強化学習によるロボット制御DLフレームワークChainerの紹介と分散深層強化学習によるロボット制御
DLフレームワークChainerの紹介と分散深層強化学習によるロボット制御Ryosuke Okuta
 
第4回 SoftLayer勉強会 資料
第4回 SoftLayer勉強会 資料第4回 SoftLayer勉強会 資料
第4回 SoftLayer勉強会 資料Naoki Shibata
 
mruby IoTプラットフォーム
mruby IoTプラットフォームmruby IoTプラットフォーム
mruby IoTプラットフォームHiromasa Ishii
 
NW-DIY で開拓したい社会
NW-DIY で開拓したい社会NW-DIY で開拓したい社会
NW-DIY で開拓したい社会啓章 加嶋
 
Introduction to Quantum Programming Studio
Introduction to Quantum Programming StudioIntroduction to Quantum Programming Studio
Introduction to Quantum Programming StudioSatoyuki Tsukano
 
Jumpwire.io @ Maker Faire Tokyo 2015
Jumpwire.io @ Maker Faire Tokyo 2015Jumpwire.io @ Maker Faire Tokyo 2015
Jumpwire.io @ Maker Faire Tokyo 2015jumpwire.io
 
Lagopus Project (Open Source Conference)
Lagopus Project (Open Source Conference)Lagopus Project (Open Source Conference)
Lagopus Project (Open Source Conference)Tomoya Hibi
 
ソフトバンクにおける Java による クラウドネイティブの実現
ソフトバンクにおける Java による クラウドネイティブの実現ソフトバンクにおける Java による クラウドネイティブの実現
ソフトバンクにおける Java による クラウドネイティブの実現Shigeru Tatsuta
 
サーバ擬人化ユーザ会キックオフ資料 Slideshare ver
サーバ擬人化ユーザ会キックオフ資料 Slideshare verサーバ擬人化ユーザ会キックオフ資料 Slideshare ver
サーバ擬人化ユーザ会キックオフ資料 Slideshare verSeiichiro Ishida
 
ゲームの通信をつくる仕事はどうなるのだろう?
ゲームの通信をつくる仕事はどうなるのだろう?ゲームの通信をつくる仕事はどうなるのだろう?
ゲームの通信をつくる仕事はどうなるのだろう?Kengo Nakajima
 
Introduction to NetOpsCoding
Introduction to NetOpsCodingIntroduction to NetOpsCoding
Introduction to NetOpsCodingTaiji Tsuchiya
 
JAWS目黒 EC2チューニングTips #jawsmeguro #jawsug
JAWS目黒 EC2チューニングTips #jawsmeguro #jawsugJAWS目黒 EC2チューニングTips #jawsmeguro #jawsug
JAWS目黒 EC2チューニングTips #jawsmeguro #jawsugYasuhiro Matsuo
 
ネットワーク運用自動化お悩み相談会
ネットワーク運用自動化お悩み相談会ネットワーク運用自動化お悩み相談会
ネットワーク運用自動化お悩み相談会Yuya Rin
 
Jslug2 nagoya-shibata
Jslug2 nagoya-shibataJslug2 nagoya-shibata
Jslug2 nagoya-shibataNaoki Shibata
 

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

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

Más de Daichi Teruya

Mulvery Detail - English
Mulvery Detail - EnglishMulvery Detail - English
Mulvery Detail - EnglishDaichi Teruya
 
Mulvery@沖縄Ruby会議02
Mulvery@沖縄Ruby会議02Mulvery@沖縄Ruby会議02
Mulvery@沖縄Ruby会議02Daichi Teruya
 
(Lambdaだけで) 純LISPのような ナニかを作る
(Lambdaだけで)純LISPのようなナニかを作る(Lambdaだけで)純LISPのようなナニかを作る
(Lambdaだけで) 純LISPのような ナニかを作るDaichi Teruya
 
Mado magisystemx hago3
Mado magisystemx hago3Mado magisystemx hago3
Mado magisystemx hago3Daichi Teruya
 

Más de Daichi Teruya (6)

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

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