Your SlideShare is downloading. ×
Synthesijer jjug 201504_01
Upcoming SlideShare
Loading in...5
×

Thanks for flagging this SlideShare!

Oops! An error has occurred.

×
Saving this for later? Get the SlideShare app to save on your phone or tablet. Read anywhere, anytime – even offline.
Text the download link to your phone
Standard text messaging rates apply

Synthesijer jjug 201504_01

443
views

Published on

Javaをお使いの方向けに最近のバズワード的になりつつあるFPGA(専用ハードウェア)の話を厚めにしつつ,後半はJavaCompiler.javaの話を少しまとめてみました. …

Javaをお使いの方向けに最近のバズワード的になりつつあるFPGA(専用ハードウェア)の話を厚めにしつつ,後半はJavaCompiler.javaの話を少しまとめてみました.
> アーキテクチャ専門家,HW専門家の方へ
Javaユーザ向けに,ちょっと吹いた内容になっています.口頭発表時には,かなりエクスキューズしますので,おこらないでください...

Published in: Engineering

0 Comments
2 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
443
On Slideshare
0
From Embeds
0
Number of Embeds
0
Actions
Shares
0
Downloads
1
Comments
0
Likes
2
Embeds 0
No embeds

Report content
Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
No notes for slide

Transcript

  • 1. Javaによる専用ハードウェア開発を夢見て Synthesijerのこれまでとこれから わさらぼ みよし たけふみ (miyox) 2015.04.11
  • 2. 2 今日の話 ✔ 何を作っているか ✔ どう作っているか
  • 3. Javaによる専用ハードウェア開発を夢見て Synthesijerのこれまでとこれから わさらぼ みよし たけふみ (miyox) 2015.04.11 ?
  • 4. 専用 汎用
  • 5. 専用 汎用 用途を特定しない 幅広く利用できる 特定の用途を想定 得手不得手がはっきり
  • 6. 専用HW 汎用HW 用途を特定しないHW 幅広く利用できるHW 特定の用途を想定したHW 得意な処理は得意HW 不得意な処理は不得意/できないHW
  • 7. 7 専用にすると何が嬉しいか? 汎用HW(CPU)の場合 専用HWの場合 高性能 低消費電力 コンパクト
  • 8. 8 専用にすると何が嬉しくないか? 汎用HW(CPU)の場合 専用HWの場合 使い回しできる = 安い.みんな使える 使い回しできない = 高い.使うの大変
  • 9. 9 いつまでもCPUだけでいいの? ✔ CPU,これ以上速くなるの? ✔ 動作周波数は頭打ち ✔ 性能向上のためのトランジスタがのせられない ✔ ちょっと,この処理遅いけど来年のCPUなら大丈夫 ✔ たくさんCPUならべると電気/熱が大変 ...と,ここ何年も言われてきた (と共に,ここ何年もスゴイ人たちが乗り越え続けている)
  • 10. 10 専用にすると何が嬉しくないか? 汎用HW(CPU)の場合 専用HWの場合 使い回しできる = 安い.みんな使える 使い回しできない = 高い.使うの大変
  • 11. 11 専用HWを作れる手軽なアイテム!! 汎用HW(CPU)の場合 専用HWの場合 使い回しできる = 安い.みんな使える 使い回しできない = 高い.使うの大変 FPGA
  • 12. 12 ✔ 論理回路・データパスを自由に作り込めるLSI ✔ I/Oを自由に使える Field Programmable Gate Array FPGAとは?
  • 13. 13 ✔ 論理回路・データパスを自由に作り込めるLSI ✔ I/Oを自由に使える ✔ クロックレベルの同期と並列性を活用した処理を実現 Field Programmable Gate Array FPGAとは?
  • 14. 14 1) http://japan.xilinx.com/support/documentation/data_sheets/ds180_7Series_Overview.pdf 2) http://hitechglobal.com/boards/virtex7_v2000t.htm 3) http://http://low-powerdesign.com/sleibson/2011/10/25/generation-jumping-2-5d-xilinx-virtex-7-2000t-fpga-delivers- 1954560-logic-cells-consumes-only-20w/ FPGAとは?
  • 15. 15 FPGAとは? グラフは http://japan.intel.com/contents/museum/processor/index.html より 高いFPGAが だいたいこの辺 Intelのプロセッサと比べてみてみると
  • 16. 16 FPGA 美味しいの? 検索FPGA ○○○○○○○○○○ ○○○○○○○○○○にはコンピュータ界隈で 有名な会社の名前をいれてください
  • 17. 17 小さくてかわいいのも https://cloud.altera.com/devstore/board/odyssey-max-10-fpga-kit/ 例: Odyssey MAX10 注: Bluetooth機能はFPGAじゃなくて この上にのるボードのマイコンが提供 FPGA ここに,LEDとかセンサとか モーターとかつないで遊ぶ
  • 18. 18 JavaでIoTといえば... http://www.snm.ethz.ch/snmwiki/Projects/SunSPOT
  • 19. Javaによる専用ハードウェア開発を夢見て Synthesijerのこれまでとこれから FPGAで アプリを作ること
  • 20. なぜJavaなのか?
  • 21. Write Once, Run Anywhere!!
  • 22. Write Once, Run Anywhere!! たとえCPUがなくても!!
  • 23. 23 一般的なFPGAアプリ設計 ✔ 論理回路構成要素の内容を決める ✔ 論理回路構成要素同士の接続関係を決める
  • 24. 24 一般的なFPGAアプリ設計 HDL(VHDLやVerilog HDL)によるRTL(Register Transfer Level)設計
  • 25. 25 HDLによるRTL設計 ✔ ロジックを抽象化した式/構文で設計できる ✔ クロックレベルのデータ制御 ✔ 細粒度の並列性の活用 ✔ 記述が煩雑 ✔ “状態”を自分で管理しなければいけない ✔ デバッグ/動作検証が難しい メリット デメリット
  • 26. 26 HDLによるRTL設計 if clk'event and clk = '1' then case (s) is when S0 => a <= 1; s <= S1; When S1 => b <= 2; s <= S2; When S2 => c <= a + b; s <= S3; end case; end if; a = 1; b = 2; c = a + b;
  • 27. RTL書きたくない!!
  • 28. Javaで書きたい!!
  • 29. 29 Synthesijer
  • 30. http://www.slideshare.net/OracleMiddleJP/java-developer-workshop-2 おおお!
  • 31. 残念ながら無関係です
  • 32. 32 Synthesijer とは ✔ JavaプログラムをFPGA上のハードウェアに変換 ✔ 複雑なアルゴリズムのハードウェア実装を楽に ✔ オブクジェクト指向設計による再利用性の向上 ✔ 特殊な記法,追加構文はない ✔ ソフトウェアとして実行可能.動作の確認、検証が容易 ✔ 書けるプログラムに制限は加える (動的なnew,再帰は不可など) ✔ HDLモジュールのJavaからのインスタンス生成 Javaコンパイラ フロントエンド Synthesijer エンジン Javaコンパイラ バックエンド 合成 配置配線 while(){ if(...){ … }else{ … … } …. } 複雑な状態遷移も,Javaの制御構文を使って楽に設計できる 同じJavaプログラムをソフトウェアとしても FPGA上のハードウェアとしても実行可能 Open-source
  • 33. 33 たとえば,Lチカ 間隔をおいて変数ledをtrue/falseするプログラムを書く Lチカに相当する変数 適当なウェイト 点滅 自動コンパイルが裏で動くので,Javaコードとしての正しさは 即座にチェックされる
  • 34. 34 たとえば,Lチカ コンパイルしてFPGAにロードする
  • 35. 35 プロセッサ上で動くのと何が違うの? CPU Synthesijerでできたもの 処理方式 読む→解釈→実行 演算器としてならべられる 適切なタイミングで確定 命令セット 決まっている 入力コードによって生成 I/O 決まっている 割と自由に追加できる 個数 決まっている 入力コードによって決まる
  • 36. 36 ✔ クラスによるオブジェクト指向設計言語  ← HWのモジュール設計との親和性は高そう ✔ 言語仕様で並列処理をサポート ✔ Thread,wait-notify ✔ (Cと違い)明示的なポインタの扱いが不要 ✔ 言語の想定するメモリ構造から解放され得るかも ✔ 動的な振る舞いは厄介そう Javaベースの高位合成処理系 なぜJavaなのか?
  • 37. デモと応用事例の紹介
  • 38. 38 ✔ Javaといえば,スクリプト言語のホストとしても魅力的 ✔ JRuby,Scala,Clojure,and etc. ✔ BF: とても小さなスクリプト言語処理系 → hoge デモ(1) BrainF**k +, -, >, <, [, ], ., ,の記号からなるインタプリタ ++++++++++[>++++++++++<-]>++++.+++++++.--------.--. http://www.kmonos.net/alang/etc/brainfuck.php
  • 39. どう作っているか?
  • 40. 40 Javaコンパイラ Javaコード 字句解析/構文解析 コントロール・データフロー作成 最適化 出力 VHDL/ Verilog HDL コード Javaコード class JVM用の バイトコード JVM命令セット内 での最適化
  • 41. 41 Synthesijerオーバービュー Javaコード 字句解析/構文解析 コントロール・データフロー作成 最適化 出力 VHDL/ Verilog HDL コード Javaコード VHDL/ Verilog HDL コード
  • 42. 42 ✔ オープンソースなJavaの実装 ✔ 勿論Javaコンパイラもオープンソース ✔ openjdk/com/sun/tools/javac/main/JavaCompiler.java をフックすれば,解析/最適化済みの情報にアクセス可 OpenJDKすてき!!
  • 43. 43 OpenJDKすてき!! /** Generate code and emit a class file for a given class * @param env The attribution environment of the outermost class * containing this class. * @param cdef The class definition from which code is generated. */ JavaFileObject genCode(Env<AttrContext> env, JCClassDecl cdef) throws IOException { synthesijer.jcfrontend.Main.newModule(env, cdef); // add hook for synthesijer try { if (gen.genClass(env, cdef) && (errorCount() == 0)) return writer.writeClass(cdef.sym); } catch (ClassWriter.PoolOverflow ex) { log.error(cdef.pos(), "limit.pool"); } catch (ClassWriter.StringOverflow ex) { log.error(cdef.pos(), "limit.string.overflow", ex.value.substring(0, 20)); } catch (CompletionFailure ex) { chk.completionError(cdef.pos(), ex); } return null; } JavaCompiler.javaの中身
  • 44. 44 Javaコードの内部表現 この構造をたどりながら,すきな形(VHDL/Verilog HDL)に変換する JCMethodDecl JCVariableDecl JCMethodDecl JCMethodDecl ・ ・ ・ ・ ・ ・ JCVariableDecl JCVariableDecl JCExpressionState JCBlock JCIf JCFor JCAssign JCArrayAccess JCBinary JCIdent JCLiteral ・ ・ ・ ・ ・ ・ JSCtatement JSExpression JCClassDecl
  • 45. 45 たとえばclass public class JCTopVisitor extends Visitor{ private final Module module; ... public void visitClassDef(JCClassDecl that){ for (JCTree def : that.defs) { if(def == null){ ; }else if(def instanceof JCMethodDecl){ def.accept(this); }else if(def instanceof JCVariableDecl){ def.accept(new JCStmtVisitor(module)); }else{ System.err.printf("Unknown class: %s (%s)", def, def.getClass()); } } } ...
  • 46. 46 たとえばmethod public void visitMethodDef(JCMethodDecl decl){ String name = decl.getName().toString(); Type type; if(JCFrontendUtils.isConstructor(decl)){ type = new MySelfType(); }else{ type = TypeBuilder.genType(decl.getReturnType()); } Method m = new Method(module, name, type); m.setArgs(parseArgs(decl.getParameters(), m)); ... m.setPrivateFlag(JCFrontendUtils.isPrivate(decl.mods)); m.setParallelFlag(JCFrontendUtils.isAnnotatedBy(decl.mods.annotations, "parallel")); ... m.setConstructorFlag(JCFrontendUtils.isConstructor(decl)); ... for(JCStatement stmt: decl.body.getStatements()){ JCStmtVisitor visitor = new JCStmtVisitor(m); stmt.accept(visitor); m.getBody().addStatement(visitor.getStatement()); } module.addMethod(m); }
  • 47. 47 たとえば制御構文 public void visitIf(JCIf that){ IfStatement tmp = new IfStatement(scope); tmp.setCondition(stepIn(that.cond, scope)); tmp.setThenPart(wrapBlockStatement(stepIn(that.thenpart, scope))); if(that.elsepart != null){ tmp.setElsePart(wrapBlockStatement(stepIn(that.elsepart, scope))); } stmt = tmp; } public void visitForLoop(JCForLoop that){ ForStatement tmp = new ForStatement(scope); for(JCStatement s: that.init){ //tmp.addInitialize(stepIn(s, scope)); tmp.addInitialize(stepIn(s, tmp)); } tmp.setCondition(stepIn(that.cond, tmp)); for(JCStatement s: that.step){ tmp.addUpdate(stepIn(s, tmp)); } tmp.setBody(wrapBlockStatement(stepIn(that.body, tmp))); stmt = tmp; }
  • 48. 48 Synthesijer でのHDL生成: 出力(状態遷移) メソッド毎にスケジュール表を生成 → 状態遷移機械 while for for
  • 49. 49 Synthesijerのこれから
  • 50. 50 ロードマップ 手続き型言語的 基本演算,操作 整数プリミ ティブ型変 数の利用 算術,論理, シフト演算 (除算・剰 余算以外) 制御構文 (分岐,ルー プ) メソッド呼び 出し 除算・剰余 算 浮動小数点 数演算 オブジェクト指向 的インスンタンス 協調 finalでのイ ンスタンス の生成 インスタン スメソッドの 呼び出し インスタン ス変数への リードアクセ ス インスタン ス変数への ライトアクセ ス インスタン ス間での配 列読み書き のサポート インスタン スの配列, 配列の配列 のサポート コンストラク タのサポー ト インスタン スのチェイ ンアクセス 並列化 パフォーマンス 基本ブロッ ク内自動並 列化 Threadに よる明示的 な処理の並 列化をサ ポート ループ内パ イプライニ ング ライブラリ 整数プリミ ティブ変数 の配列 AXI接続用 のコンポー ネントライブ ラリの提供 Stringクラ スのサポー ト ユーザビリティ コマンドライ ンでのコン パイル HDLモ ジュールと のバイン ディング機 構 FPGA合成 ツールとの 連携,統一 的な開発フ ローの提供 スケジュー リング可視 化ツール HDL生成ラ イブラリを 活用した DSLの提供 2014年7月 2014年12月 2015年3月 2015年6月
  • 51. 51 今後挑戦したいこと ✔ メソッドのパイプライン化 ✔ I/Oストリームへの対応 ✔ コンストラクタに対応 ✔ コンパイル時のJavaプログラム実行 ✔ lambda式対応 ✔ Streamへの対応 ✔ Erlangフロントエンド
  • 52. 52 Synthesijer とは ✔ JavaプログラムをFPGA上のハードウェアに変換 ✔ 複雑なアルゴリズムのハードウェア実装を楽に ✔ オブクジェクト指向設計による再利用性の向上 ✔ 特殊な記法,追加構文はない ✔ ソフトウェアとして実行可能.動作の確認、検証が容易 ✔ 書けるプログラムに制限は加える (動的なnew,再帰は不可など) ✔ HDLモジュールのJavaからのインスタンス生成 Javaコンパイラ フロントエンド Synthesijer エンジン Javaコンパイラ バックエンド 合成 配置配線 while(){ if(...){ … }else{ … … } …. } 複雑な状態遷移も,Javaの制御構文を使って楽に設計できる 同じJavaプログラムをソフトウェアとしても FPGA上のハードウェアとしても実行可能 Open-source
  • 53. 53 参考 ✔ http://synthesijer.sourceforge.net ✔ リソース一式,クイックスタートガイドなど ✔ http://qiita.com/kazunori279/items/4951ca5f6164040878ce ✔ Kazunori279さん: Synthesijer関連資料まとめ ✔ http://labs.beatcraft.com/ja/index.php?Synthesijer ✔ ビートクラフトさん: Altera DE0-nanoでのサンプルの動作手順など ✔ http://marsee101.blog19.fc2.com/blog-category-116.html ✔ FPGAの部屋さん: Synthesijerでラプラシアンフィルタを作ってみた ✔ http://cellspe.matrix.jp/parallella/synthesijer.html ✔ Parallela Fan!さん: SynthesijerでJavaプログラムからHDLコードを自動生成する ✔ http://wasa-labo.com/wp/ ✔ わさらぼ ブログ – 開発状況,Tipsなど