Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

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

2,654 views

Published on

未踏事業2017年度最終成果報告会で使った資料

Published in: Engineering
  • Login to see the comments

  • Be the first to like this

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

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

×