SlideShare a Scribd company logo
1 of 59
Download to read offline
Synthesijerのあれこれ
高位合成友の会 2019.5.11
みよしたけふみ
コンテンツ
• まえふり
• Synthesijerの紹介
• JDK11対応(Javac Pluginが便利ですよ)
• Java StreamAPIとハードウェア設計について
• Java Stream API “を” ハードウェアに変換
• Java Stream API “で” ハードウェアにアクセス
高位合成処理系
• C,C++,Java,C#,Python…などからハードウェアを生成
• (多くは)ハードウェア≒Verilog HDLやVHDL
• RTLより抽象度の高い設計が可能に
• 生成されるハードウェアの質は処理系依存
Synthesijer
• Javaで書かれたプログラムをVHDL/Verilog HDLに
• 同じプログラムがSWとしてもHWとしても
• オブジェクト指向設計で複雑なシステムを見通しよく
• Threadを使った並列化が個別のモジュールに
• VHDL/Verilog HDLで記述したモジュールもJavaでインスタンス化
Java
プログラム
Synthesijerの構成
Java構文向け フロントエンド
スケジュール表の作成
最適化
中間表現
(S式)
HDL抽象構文木
VHDL/
Verilog HDL
抽象構文木
Synthesijer/Go
Go向け フロントエンド
スケジュール表の作成
最適化
中間表現
(S式)
HDL抽象構文木
VHDL/
Verilog HDL
抽象構文木
Go
プログラム
Synthesijer/C
C向け フロントエンド
スケジュール表の作成
最適化
中間表現
(S式)
HDL抽象構文木
VHDL/
Verilog HDL
抽象構文木
C
プログラム
Java
プログラム
Synthesijer for IROHA
Java構文向け フロントエンド
IROHA変換
中間表現
(S式)
IROHA
抽象構文木
IROHAへ
Scala
Synthesijer.Scala
HDL抽象構文木
VHDL/
Verilog HDL
コンテンツ
• まえふり
• Synthesijerの紹介
• JDK11対応(Javac Pluginが便利ですよ)
• Java StreamAPIとハードウェア設計について
• Java Stream API “を” ハードウェアに変換
• Java Stream API “で” ハードウェアにアクセス
Javacプラグインの利用
• 今まで: OpenJDKのコンパイラフロントエンドに手を入れてた
• ソース解析関連のクラスの名前空間が被らないようにパッケー
ジ名を変更するなど
• 変更後: Javacのプラグインを使うように変更
• → アップデートのたびにOpenJDKソースコードに手をいれる必
要がなくなった
• Javaコンパイラのコンパイルパスに任意の処理を挟む仕組み
• Java8からサポート
$ javac -cp p.jar:. –Xplugin:Sample Test.java
JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
StandardJavaFileManager fileManager = compiler.getStandardFileManager(null, null, null);
ArrayList<File> files = new ArrayList<File>();
for(String s: javaSrc){ files.add(new File(s)); }
var compilationUnits1 = fileManager.getJavaFileObjectsFromFiles(files);
compiler.getTask(new PrintWriter(System.err),
fileManager,
null, // a diagnostic listener
Arrays.asList(new String[]{"-Xplugin:Synthesijer", "-cp", classPathStr}),
null, // names of classes to be processed by annotation processing
compilationUnits1).call();
Java プラグイン
Java プラグインの作り方
public class SampleJavacPlugin implements Plugin {
@Override
public String getName() { return “Sample”; }
@Override
public void init(JavacTask task, String... args) {
for(String s: args){ System.out.println(s); }
task.addTaskListener(new SampleTaskListener());
}
}
public class SampleTaskListener implements TaskListener {
@Override
public void started(TaskEvent e) {
if (e.getKind() == TaskEvent.Kind.GENERATE){
System.out.println("Task event " + e + " has started");
e.getCompilationUnit().accept(new MyScanner(), null);
}
}
@Override
public void finished(TaskEvent e) {
…
http://github.com/miyo/misc/java-plugin-test/
Java プラグインの作り方
class MyScanner extends TreeScanner<Void, Void>{
@Override
public Void visitClass(ClassTree node, Void aVoid) {
System.out.println(node);
return super.visitClass(node, aVoid);
}
@Override
public Void visitMethod(MethodTree node, Void aVoid) {
return super.visitMethod(node, aVoid);
}
}
http://github.com/miyo/misc/java-plugin-test/
Java
プログラム
Synthesijerの構成
javac plugin
スケジュール表の作成
最適化
中間表現
(S式)
HDL抽象構文木
VHDL/
Verilog HDL
抽象構文木
コンテンツ
• まえふり
• Synthesijerの紹介
• JDK11対応(Javac Pluginが便利ですよ)
• Java StreamAPIとハードウェア設計について
• Java Stream API “を” ハードウェアに変換
• Java Stream API “で” ハードウェアにアクセス
コンテンツ
• まえふり
• Synthesijerの紹介
• JDK11対応(Javac Pluginが便利ですよ)
• Java StreamAPIとハードウェア設計について
• Java Stream API “を” ハードウェアに変換
• Java Stream API “で” ハードウェアにアクセス
(SDAccel + RTLを添えて)
構文木を触ってみる(1)
public class Test024 {
public int test024_1(List<Integer> lst) {
return lst.stream().filter(x -> x % 2 == 1).mapToInt(i -> i).sum();
}
}
public class Test024 {
public Test024() { super(); }
public int test024_1(List lst) {
return lst.stream()
.filter(java.lang.invoke.LambdaMetafactory.metafactory())
.mapToInt(java.lang.invoke.LambdaMetafactory.metafactory())
.sum();
}
/*synthetic*/ private static int lambda$test024_1$1(Integer i) {
return i.intValue();
}
/*synthetic*/ private static boolean lambda$test024_1$0(Integer x) {
return x.intValue() % 2 == 1;
}
}
構文木を触ってみる(2)
public class Test025 {
public int test025_1(List<Integer> lst){
return lst.stream().mapToInt(i -> i).sum();
}
public int test025_2(List<Integer> lst) {
return lst.stream().filter(x -> x % 2 == 1).mapToInt(i -> i).sum();
}
}
構文木を触ってみる(2)
public class Test025 {
public Test025() { super(); }
public int test025_1(List lst) {
return lst.stream()
.mapToInt(java.lang.invoke.LambdaMetafactory.metafactory())
.sum();
}
public int test025_2(List lst) {
return lst.stream()
.filter(java.lang.invoke.LambdaMetafactory.metafactory())
.mapToInt(java.lang.invoke.LambdaMetafactory.metafactory())
.sum();
}
/*synthetic*/ private static boolean lambda$test025_2$1(Integer x) {
return x.intValue() % 2 == 1;
}
/*synthetic*/ private static int lambda$test025_1$0(Integer i) {
return i.intValue();
}
}
コンテンツ
• まえふり
• Synthesijerの紹介
• JDK11対応(Javac Pluginが便利ですよ)
• Java StreamAPIとハードウェア設計について
• Java Stream API “を” ハードウェアに変換
• Java Stream API “で” ハードウェアにアクセス
(SDAccel + RTLを添えて)
Stream APIでハードウェアをたたく
public class StreamTest {
public int doWithSoftware(List<Integer> lst) {
return lst.stream().filter(x -> x % 2 == 1).mapToInt(i -> i).sum();
}
public int doWithHardware(List<Integer> lst) {
return new lst.stream().reduce(new EvenFilteredSum());
}
}
public class EvenFilteredSum extends RTLModule implements IntBinaryOperator {
static { System.loadLibrary(“EvenFilteredSumWrapper”); }
private native void runOnHardware(int[] buf);
int[] buffer = int[BUFSIZE];
public int applyAsInt(int left, int right){
…
runOnHardware(buffer);
}
}
SDAccel
Xilinxの提供するFPGA向けOpenCL環境
Xilinx UG1023より引用
• FPGAとCPUのブリッジをOpenCL的に利用できる
→ CPU上のソフトウェアはOpenCL APIでFPGAを再構成,データ授受
• FPGA上のカーネルはC/C++,OpenCLカーネル,RTLで設計
FPGA上のロジック
FPGA側周辺モジュール
OpenCLドライバ
OpenCLホストコード
アプリケーション
SDAccel使ってシステムを作るとき
この辺を作る(ハードウェアを活用する)のは(も)
結構面倒では?
アプリケーションの移植性
ホストコードの開発工数(使いまわしたい)
性能出すために(通信とか)細かくチューンしたい
既存のプログラミングモデルをあまり変えたくない
移植の手間がそこそこで,そこそこ性能が出る,
というのが(まずは)嬉しい
PCIe
FPGA上に載せたCAM利用の性能比較
実行時間(s)
5.1秒
1.5秒
3.4倍 高速化
21Mクエリ/秒
FPGA上に載せたCAM利用の性能比較の例
実行時間(s)
5.1秒
1.5秒
3.4倍 高速化
21Mクエリ/秒
アプリ側でうまくサイズ調整することで
HWをうまく活用することができる
SDAccel + Java Stream API
• サーバサイドFPGAの場合Javaでアプリケーション書きたい
/Javaで書かれたアプリから利用したい
FPGA上のロジック
FPGA側周辺モジュール
OpenCLドライバ
OpenCLホストコード
アプリケーション
(ひとつのアプローチとして)
ここの間をJava Stream API的な枠組みでつなぐと
アプリケーション開発者に対して
受け入れてもらいやすいのでは?
Stream APIでハードウェアをたたく
public class StreamTest {
public int doWithSoftware(List<Integer> lst) {
return lst.stream().filter(x -> x % 2 == 1).mapToInt(i -> i).sum();
}
public int doWithHardware(List<Integer> lst) {
return lst.stream().reduce(new EvenFilteredSum());
}
}
public class EvenFilteredSum extends RTLModule implements IntBinaryOperator {
static { System.loadLibrary(“EvenFilteredSumWrapper”); }
private native void runOnHardware(int[] buf);
int[] buffer = int[BUFSIZE];
public int applyAsInt(int left, int right){
…
runOnHardware(buffer);
}
}
Stream APIでハードウェアをたたく
Java
(with
Stream
API)
JNIな
ラッパー
C++な
OpenCL
カーネル
OpenCL
ドライバ
DRAM
MM<->FIFO
カーネルなRTL
sum(i->i%2)
lst.stream()
.reduce(new EvenFilteredSum());
コンテンツ
• まえふり
• Synthesijerの紹介
• JDK11対応(Javac Pluginが便利ですよ)
• Java StreamAPIとハードウェア設計について
• Java Stream API “を” ハードウェアに変換
• Java Stream API “で” ハードウェアにアクセス
(SDAccel + RTLを添えて)
まとめ
• Synthesijerの紹介
• Java 11向けの対応とjavac プラグインの話
• とりあえずJava 11で使えるようにはしました
• いろんな便利構文はまだ対応できてません(少しずつやります)
• Java Stream APIに関する話題
• Java Stream APIを使って書かれた処理をハードウェア化する話
• Java Stream APIを使ってRTLカーネルを操作する話
(Synthesijerは関係ない)
• 平成後半は停滞してたけど令和になったので心機一転がんばります…
• Intel OPAE + RTLもやりたいなあ

More Related Content

Similar to Synthesijer - HLS frineds 20190511

Dot netcore multiplatform 2
Dot netcore multiplatform 2Dot netcore multiplatform 2
Dot netcore multiplatform 2shozon
 
jjugccc2018 app review postmortem
jjugccc2018 app review postmortemjjugccc2018 app review postmortem
jjugccc2018 app review postmortemtamtam180
 
Best practice laravel
Best practice laravelBest practice laravel
Best practice laravelRisa Ohnishi
 
明日から使える Java SE 7
明日から使える Java SE 7明日から使える Java SE 7
明日から使える Java SE 7Yuichi Sakuraba
 
第三回ありえる社内勉強会 「いわががのLombok」
第三回ありえる社内勉強会 「いわががのLombok」第三回ありえる社内勉強会 「いわががのLombok」
第三回ありえる社内勉強会 「いわががのLombok」yoshiaki iwanaga
 
FIRST STEP to Haxe/JavaScript
FIRST STEP to Haxe/JavaScriptFIRST STEP to Haxe/JavaScript
FIRST STEP to Haxe/JavaScriptterurou
 
ClassLoader Leak Patterns
ClassLoader Leak PatternsClassLoader Leak Patterns
ClassLoader Leak Patternsnekop
 
クラウド時代の並列分散処理技術
クラウド時代の並列分散処理技術クラウド時代の並列分散処理技術
クラウド時代の並列分散処理技術Koichi Fujikawa
 
Java/Androidセキュアコーディング
Java/AndroidセキュアコーディングJava/Androidセキュアコーディング
Java/AndroidセキュアコーディングMasaki Kubo
 
Groovyで楽にSQLを実行してみよう
Groovyで楽にSQLを実行してみようGroovyで楽にSQLを実行してみよう
Groovyで楽にSQLを実行してみようAkira Shimosako
 
Javaセキュアコーディングセミナー東京第3回講義
Javaセキュアコーディングセミナー東京第3回講義Javaセキュアコーディングセミナー東京第3回講義
Javaセキュアコーディングセミナー東京第3回講義JPCERT Coordination Center
 
Swift2.x を Scala からみる
Swift2.x を Scala からみるSwift2.x を Scala からみる
Swift2.x を Scala からみるYuichi Adachi
 
CodeIgniter入門
CodeIgniter入門CodeIgniter入門
CodeIgniter入門Sho A
 
JavaLearning_1.pptx
JavaLearning_1.pptxJavaLearning_1.pptx
JavaLearning_1.pptxRyuuGaku
 
scala+liftで遊ぼう
scala+liftで遊ぼうscala+liftで遊ぼう
scala+liftで遊ぼうyouku
 

Similar to Synthesijer - HLS frineds 20190511 (20)

Dot netcore multiplatform 2
Dot netcore multiplatform 2Dot netcore multiplatform 2
Dot netcore multiplatform 2
 
jjugccc2018 app review postmortem
jjugccc2018 app review postmortemjjugccc2018 app review postmortem
jjugccc2018 app review postmortem
 
Best practice laravel
Best practice laravelBest practice laravel
Best practice laravel
 
明日から使える Java SE 7
明日から使える Java SE 7明日から使える Java SE 7
明日から使える Java SE 7
 
第三回ありえる社内勉強会 「いわががのLombok」
第三回ありえる社内勉強会 「いわががのLombok」第三回ありえる社内勉強会 「いわががのLombok」
第三回ありえる社内勉強会 「いわががのLombok」
 
FIRST STEP to Haxe/JavaScript
FIRST STEP to Haxe/JavaScriptFIRST STEP to Haxe/JavaScript
FIRST STEP to Haxe/JavaScript
 
sveltekit-ja.pdf
sveltekit-ja.pdfsveltekit-ja.pdf
sveltekit-ja.pdf
 
ClassLoader Leak Patterns
ClassLoader Leak PatternsClassLoader Leak Patterns
ClassLoader Leak Patterns
 
クラウド時代の並列分散処理技術
クラウド時代の並列分散処理技術クラウド時代の並列分散処理技術
クラウド時代の並列分散処理技術
 
Java/Androidセキュアコーディング
Java/AndroidセキュアコーディングJava/Androidセキュアコーディング
Java/Androidセキュアコーディング
 
WDD2012_SC-004
WDD2012_SC-004WDD2012_SC-004
WDD2012_SC-004
 
Groovyで楽にSQLを実行してみよう
Groovyで楽にSQLを実行してみようGroovyで楽にSQLを実行してみよう
Groovyで楽にSQLを実行してみよう
 
Javaセキュアコーディングセミナー東京第3回講義
Javaセキュアコーディングセミナー東京第3回講義Javaセキュアコーディングセミナー東京第3回講義
Javaセキュアコーディングセミナー東京第3回講義
 
Project lambda
Project lambdaProject lambda
Project lambda
 
Swift2.x を Scala からみる
Swift2.x を Scala からみるSwift2.x を Scala からみる
Swift2.x を Scala からみる
 
Gradle布教活動
Gradle布教活動Gradle布教活動
Gradle布教活動
 
CodeIgniter入門
CodeIgniter入門CodeIgniter入門
CodeIgniter入門
 
JavaLearning_1.pptx
JavaLearning_1.pptxJavaLearning_1.pptx
JavaLearning_1.pptx
 
Rx java x retrofit
Rx java x retrofitRx java x retrofit
Rx java x retrofit
 
scala+liftで遊ぼう
scala+liftで遊ぼうscala+liftで遊ぼう
scala+liftで遊ぼう
 

More from Takefumi MIYOSHI

ACRi_webinar_20220118_miyo
ACRi_webinar_20220118_miyoACRi_webinar_20220118_miyo
ACRi_webinar_20220118_miyoTakefumi MIYOSHI
 
ACRiルーム1年間の活動と 新たな取り組み
ACRiルーム1年間の活動と 新たな取り組みACRiルーム1年間の活動と 新たな取り組み
ACRiルーム1年間の活動と 新たな取り組みTakefumi MIYOSHI
 
RISC-V introduction for SIG SDR in CQ 2019.07.29
RISC-V introduction for SIG SDR in CQ 2019.07.29RISC-V introduction for SIG SDR in CQ 2019.07.29
RISC-V introduction for SIG SDR in CQ 2019.07.29Takefumi MIYOSHI
 
Misc for edge_devices_with_fpga
Misc for edge_devices_with_fpgaMisc for edge_devices_with_fpga
Misc for edge_devices_with_fpgaTakefumi MIYOSHI
 
Abstracts of FPGA2017 papers (Temporary Version)
Abstracts of FPGA2017 papers (Temporary Version)Abstracts of FPGA2017 papers (Temporary Version)
Abstracts of FPGA2017 papers (Temporary Version)Takefumi MIYOSHI
 
Synthesijer and Synthesijer.Scala in HLS-friends 201512
Synthesijer and Synthesijer.Scala in HLS-friends 201512Synthesijer and Synthesijer.Scala in HLS-friends 201512
Synthesijer and Synthesijer.Scala in HLS-friends 201512Takefumi MIYOSHI
 
Synthesijer jjug 201504_01
Synthesijer jjug 201504_01Synthesijer jjug 201504_01
Synthesijer jjug 201504_01Takefumi MIYOSHI
 
Synthesijer zynq qs_20150316
Synthesijer zynq qs_20150316Synthesijer zynq qs_20150316
Synthesijer zynq qs_20150316Takefumi MIYOSHI
 
Synthesijer fpgax 20150201
Synthesijer fpgax 20150201Synthesijer fpgax 20150201
Synthesijer fpgax 20150201Takefumi MIYOSHI
 
Synthesijer.Scala (PROSYM 2015)
Synthesijer.Scala (PROSYM 2015)Synthesijer.Scala (PROSYM 2015)
Synthesijer.Scala (PROSYM 2015)Takefumi MIYOSHI
 

More from Takefumi MIYOSHI (20)

ACRi_webinar_20220118_miyo
ACRi_webinar_20220118_miyoACRi_webinar_20220118_miyo
ACRi_webinar_20220118_miyo
 
DAS_202109
DAS_202109DAS_202109
DAS_202109
 
ACRiルーム1年間の活動と 新たな取り組み
ACRiルーム1年間の活動と 新たな取り組みACRiルーム1年間の活動と 新たな取り組み
ACRiルーム1年間の活動と 新たな取り組み
 
RISC-V introduction for SIG SDR in CQ 2019.07.29
RISC-V introduction for SIG SDR in CQ 2019.07.29RISC-V introduction for SIG SDR in CQ 2019.07.29
RISC-V introduction for SIG SDR in CQ 2019.07.29
 
Misc for edge_devices_with_fpga
Misc for edge_devices_with_fpgaMisc for edge_devices_with_fpga
Misc for edge_devices_with_fpga
 
Cq off 20190718
Cq off 20190718Cq off 20190718
Cq off 20190718
 
Reconf 201901
Reconf 201901Reconf 201901
Reconf 201901
 
Hls friends 201803.key
Hls friends 201803.keyHls friends 201803.key
Hls friends 201803.key
 
Abstracts of FPGA2017 papers (Temporary Version)
Abstracts of FPGA2017 papers (Temporary Version)Abstracts of FPGA2017 papers (Temporary Version)
Abstracts of FPGA2017 papers (Temporary Version)
 
Hls friends 20161122.key
Hls friends 20161122.keyHls friends 20161122.key
Hls friends 20161122.key
 
Slide
SlideSlide
Slide
 
Synthesijer and Synthesijer.Scala in HLS-friends 201512
Synthesijer and Synthesijer.Scala in HLS-friends 201512Synthesijer and Synthesijer.Scala in HLS-friends 201512
Synthesijer and Synthesijer.Scala in HLS-friends 201512
 
Das 2015
Das 2015Das 2015
Das 2015
 
Microblaze loader
Microblaze loaderMicroblaze loader
Microblaze loader
 
Reconf 201506
Reconf 201506Reconf 201506
Reconf 201506
 
Synthesijer jjug 201504_01
Synthesijer jjug 201504_01Synthesijer jjug 201504_01
Synthesijer jjug 201504_01
 
Synthesijer zynq qs_20150316
Synthesijer zynq qs_20150316Synthesijer zynq qs_20150316
Synthesijer zynq qs_20150316
 
Synthesijer fpgax 20150201
Synthesijer fpgax 20150201Synthesijer fpgax 20150201
Synthesijer fpgax 20150201
 
Synthesijer hls 20150116
Synthesijer hls 20150116Synthesijer hls 20150116
Synthesijer hls 20150116
 
Synthesijer.Scala (PROSYM 2015)
Synthesijer.Scala (PROSYM 2015)Synthesijer.Scala (PROSYM 2015)
Synthesijer.Scala (PROSYM 2015)
 

Synthesijer - HLS frineds 20190511