Javaによる専用ハードウェア開発を夢見て
Synthesijerのこれまでとこれから
わさらぼ
みよし たけふみ
(miyox)
2015.04.11
2
今日の話
✔ 何を作っているか
✔ どう作っているか
Javaによる専用ハードウェア開発を夢見て
Synthesijerのこれまでとこれから
わさらぼ
みよし たけふみ
(miyox)
2015.04.11
?
専用 汎用
専用 汎用
用途を特定しない
幅広く利用できる
特定の用途を想定
得手不得手がはっきり
専用HW 汎用HW
用途を特定しないHW
幅広く利用できるHW
特定の用途を想定したHW
得意な処理は得意HW
不得意な処理は不得意/できないHW
7
専用にすると何が嬉しいか?
汎用HW(CPU)の場合
専用HWの場合
高性能
低消費電力
コンパクト
8
専用にすると何が嬉しくないか?
汎用HW(CPU)の場合
専用HWの場合
使い回しできる
= 安い.みんな使える
使い回しできない
= 高い.使うの大変
9
いつまでもCPUだけでいいの?
✔ CPU,これ以上速くなるの?
✔ 動作周波数は頭打ち
✔ 性能向上のためのトランジスタがのせられない
✔ ちょっと,この処理遅いけど来年のCPUなら大丈夫
✔ たくさんCPUならべると電気/熱が大変
...と,ここ何年も言われてきた
(と共に,ここ何年もスゴイ人たちが乗り越え続けている)
10
専用にすると何が嬉しくないか?
汎用HW(CPU)の場合
専用HWの場合
使い回しできる
= 安い.みんな使える
使い回しできない
= 高い.使うの大変
11
専用HWを作れる手軽なアイテム!!
汎用HW(CPU)の場合
専用HWの場合
使い回しできる
= 安い.みんな使える
使い回しできない
= 高い.使うの大変
FPGA
12
✔ 論理回路・データパスを自由に作り込めるLSI
✔ I/Oを自由に使える
Field Programmable Gate Array
FPGAとは?
13
✔ 論理回路・データパスを自由に作り込めるLSI
✔ I/Oを自由に使える
✔ クロックレベルの同期と並列性を活用した処理を実現
Field Programmable Gate Array
FPGAとは?
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
FPGAとは?
グラフは http://japan.intel.com/contents/museum/processor/index.html より
高いFPGAが
だいたいこの辺
Intelのプロセッサと比べてみてみると
16
FPGA 美味しいの?
検索FPGA ○○○○○○○○○○
○○○○○○○○○○にはコンピュータ界隈で
有名な会社の名前をいれてください
17
小さくてかわいいのも
https://cloud.altera.com/devstore/board/odyssey-max-10-fpga-kit/
例: Odyssey MAX10
注: Bluetooth機能はFPGAじゃなくて
この上にのるボードのマイコンが提供
FPGA
ここに,LEDとかセンサとか
モーターとかつないで遊ぶ
18
JavaでIoTといえば...
http://www.snm.ethz.ch/snmwiki/Projects/SunSPOT
Javaによる専用ハードウェア開発を夢見て
Synthesijerのこれまでとこれから
FPGAで
アプリを作ること
なぜJavaなのか?
Write Once, Run Anywhere!!
Write Once, Run Anywhere!!
たとえCPUがなくても!!
23
一般的なFPGAアプリ設計
✔ 論理回路構成要素の内容を決める
✔ 論理回路構成要素同士の接続関係を決める
24
一般的なFPGAアプリ設計
HDL(VHDLやVerilog HDL)によるRTL(Register Transfer Level)設計
25
HDLによるRTL設計
✔ ロジックを抽象化した式/構文で設計できる
✔ クロックレベルのデータ制御
✔ 細粒度の並列性の活用
✔ 記述が煩雑
✔ “状態”を自分で管理しなければいけない
✔ デバッグ/動作検証が難しい
メリット
デメリット
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;
RTL書きたくない!!
Javaで書きたい!!
29
Synthesijer
http://www.slideshare.net/OracleMiddleJP/java-developer-workshop-2
おおお!
残念ながら無関係です
32
Synthesijer とは
✔ JavaプログラムをFPGA上のハードウェアに変換
✔ 複雑なアルゴリズムのハードウェア実装を楽に
✔ オブクジェクト指向設計による再利用性の向上
✔ 特殊な記法,追加構文はない
✔ ソフトウェアとして実行可能.動作の確認、検証が容易
✔ 書けるプログラムに制限は加える
(動的なnew,再帰は不可など)
✔ HDLモジュールのJavaからのインスタンス生成
Javaコンパイラ
フロントエンド
Synthesijer
エンジン
Javaコンパイラ
バックエンド
合成
配置配線
while(){
if(...){
…
}else{
…
…
}
….
}
複雑な状態遷移も,Javaの制御構文を使って楽に設計できる
同じJavaプログラムをソフトウェアとしても
FPGA上のハードウェアとしても実行可能
Open-source
33
たとえば,Lチカ
間隔をおいて変数ledをtrue/falseするプログラムを書く
Lチカに相当する変数
適当なウェイト
点滅
自動コンパイルが裏で動くので,Javaコードとしての正しさは
即座にチェックされる
34
たとえば,Lチカ
コンパイルしてFPGAにロードする
35
プロセッサ上で動くのと何が違うの?
CPU Synthesijerでできたもの
処理方式 読む→解釈→実行 演算器としてならべられる
適切なタイミングで確定
命令セット 決まっている 入力コードによって生成
I/O 決まっている 割と自由に追加できる
個数 決まっている 入力コードによって決まる
36
✔ クラスによるオブジェクト指向設計言語
 ← HWのモジュール設計との親和性は高そう
✔ 言語仕様で並列処理をサポート
✔ Thread,wait-notify
✔ (Cと違い)明示的なポインタの扱いが不要
✔ 言語の想定するメモリ構造から解放され得るかも
✔ 動的な振る舞いは厄介そう
Javaベースの高位合成処理系
なぜJavaなのか?
デモと応用事例の紹介
38
✔ Javaといえば,スクリプト言語のホストとしても魅力的
✔ JRuby,Scala,Clojure,and etc.
✔ BF: とても小さなスクリプト言語処理系
→ hoge
デモ(1) BrainF**k
+, -, >, <, [, ], ., ,の記号からなるインタプリタ
++++++++++[>++++++++++<-]>++++.+++++++.--------.--.
http://www.kmonos.net/alang/etc/brainfuck.php
どう作っているか?
40
Javaコンパイラ
Javaコード 字句解析/構文解析
コントロール・データフロー作成
最適化
出力
VHDL/
Verilog HDL
コード
Javaコード
class
JVM用の
バイトコード
JVM命令セット内
での最適化
41
Synthesijerオーバービュー
Javaコード 字句解析/構文解析
コントロール・データフロー作成
最適化
出力
VHDL/
Verilog HDL
コード
Javaコード
VHDL/
Verilog HDL
コード
42
✔ オープンソースなJavaの実装
✔ 勿論Javaコンパイラもオープンソース
✔ openjdk/com/sun/tools/javac/main/JavaCompiler.java
をフックすれば,解析/最適化済みの情報にアクセス可
OpenJDKすてき!!
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
Javaコードの内部表現
この構造をたどりながら,すきな形(VHDL/Verilog HDL)に変換する
JCMethodDecl
JCVariableDecl
JCMethodDecl
JCMethodDecl
・
・
・
・
・
・
JCVariableDecl
JCVariableDecl
JCExpressionState
JCBlock
JCIf
JCFor
JCAssign
JCArrayAccess
JCBinary
JCIdent
JCLiteral
・
・
・
・
・
・
JSCtatement
JSExpression
JCClassDecl
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
たとえば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
たとえば制御構文
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
Synthesijer でのHDL生成: 出力(状態遷移)
メソッド毎にスケジュール表を生成 → 状態遷移機械
while
for
for
49
Synthesijerのこれから
50
ロードマップ
手続き型言語的
基本演算,操作
整数プリミ
ティブ型変
数の利用
算術,論理,
シフト演算
(除算・剰
余算以外)
制御構文
(分岐,ルー
プ)
メソッド呼び
出し
除算・剰余
算
浮動小数点
数演算
オブジェクト指向
的インスンタンス
協調
finalでのイ
ンスタンス
の生成
インスタン
スメソッドの
呼び出し
インスタン
ス変数への
リードアクセ
ス
インスタン
ス変数への
ライトアクセ
ス
インスタン
ス間での配
列読み書き
のサポート
インスタン
スの配列,
配列の配列
のサポート
コンストラク
タのサポー
ト
インスタン
スのチェイ
ンアクセス
並列化
パフォーマンス
基本ブロッ
ク内自動並
列化
Threadに
よる明示的
な処理の並
列化をサ
ポート
ループ内パ
イプライニ
ング
ライブラリ 整数プリミ
ティブ変数
の配列
AXI接続用
のコンポー
ネントライブ
ラリの提供
Stringクラ
スのサポー
ト
ユーザビリティ コマンドライ
ンでのコン
パイル
HDLモ
ジュールと
のバイン
ディング機
構
FPGA合成
ツールとの
連携,統一
的な開発フ
ローの提供
スケジュー
リング可視
化ツール
HDL生成ラ
イブラリを
活用した
DSLの提供
2014年7月 2014年12月 2015年3月 2015年6月
51
今後挑戦したいこと
✔ メソッドのパイプライン化
✔ I/Oストリームへの対応
✔ コンストラクタに対応
✔ コンパイル時のJavaプログラム実行
✔ lambda式対応
✔ Streamへの対応
✔ Erlangフロントエンド
52
Synthesijer とは
✔ JavaプログラムをFPGA上のハードウェアに変換
✔ 複雑なアルゴリズムのハードウェア実装を楽に
✔ オブクジェクト指向設計による再利用性の向上
✔ 特殊な記法,追加構文はない
✔ ソフトウェアとして実行可能.動作の確認、検証が容易
✔ 書けるプログラムに制限は加える
(動的なnew,再帰は不可など)
✔ HDLモジュールのJavaからのインスタンス生成
Javaコンパイラ
フロントエンド
Synthesijer
エンジン
Javaコンパイラ
バックエンド
合成
配置配線
while(){
if(...){
…
}else{
…
…
}
….
}
複雑な状態遷移も,Javaの制御構文を使って楽に設計できる
同じJavaプログラムをソフトウェアとしても
FPGA上のハードウェアとしても実行可能
Open-source
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など

Synthesijer jjug 201504_01