狠狠撸

狠狠撸Share a Scribd company logo
Synthesijerのあれこれ
高位合成友の会 2019.5.11
みよしたけふみ
コンテンツ
? まえふり
? Synthesijerの紹介
? JDK11対応(Javac Pluginが便利ですよ)
? Java StreamAPIとハードウェア設計について
? Java Stream API “を” ハードウェアに変換
? Java Stream API “で” ハードウェアにアクセス
Synthesijer - HLS frineds 20190511
Synthesijer - HLS frineds 20190511
高位合成処理系
? C,C++,Java,C#,Python…などからハードウェアを生成
? (多くは)ハードウェア≒Verilog HDLやVHDL
? RTLより抽象度の高い設計が可能に
? 生成されるハードウェアの質は処理系依存
Synthesijer
? Javaで書かれたプログラムをVHDL/Verilog HDLに
? 同じプログラムがSWとしてもHWとしても
? オブジェクト指向設計で複雑なシステムを見通しよく
? Threadを使った並列化が個別のモジュールに
? VHDL/Verilog HDLで記述したモジュールもJavaでインスタンス化
Synthesijer - HLS frineds 20190511
Synthesijer - HLS frineds 20190511
Synthesijer - HLS frineds 20190511
Synthesijer - HLS frineds 20190511
Synthesijer - HLS frineds 20190511
Synthesijer - HLS frineds 20190511
Synthesijer - HLS frineds 20190511
Synthesijer - HLS frineds 20190511
Synthesijer - HLS frineds 20190511
Synthesijer - HLS frineds 20190511
Synthesijer - HLS frineds 20190511
Synthesijer - HLS frineds 20190511
Synthesijer - HLS frineds 20190511
Java
プログラム
Synthesijerの構成
Java構文向け フロントエンド
スケジュール表の作成
最適化
中間表現
(S式)
HDL抽象構文木
VHDL/
Verilog HDL
抽象構文木
Synthesijer/Go
Go向け フロントエンド
スケジュール表の作成
最適化
中間表現
(S式)
HDL抽象構文木
VHDL/
Verilog HDL
抽象構文木
Go
プログラム
Synthesijer - HLS frineds 20190511
Synthesijer - HLS frineds 20190511
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 - HLS frineds 20190511
Synthesijer - HLS frineds 20190511
Synthesijer - HLS frineds 20190511
Synthesijer - HLS frineds 20190511
コンテンツ
? まえふり
? 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 - HLS frineds 20190511
コンテンツ
? まえふり
? Synthesijerの紹介
? JDK11対応(Javac Pluginが便利ですよ)
? Java StreamAPIとハードウェア設計について
? Java Stream API “を” ハードウェアに変換
? Java Stream API “で” ハードウェアにアクセス
(SDAccel + RTLを添えて)
Synthesijer - HLS frineds 20190511
Synthesijer - HLS frineds 20190511
Synthesijer - HLS frineds 20190511
Synthesijer - HLS frineds 20190511
Synthesijer - HLS frineds 20190511
構文木を触ってみる(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 - HLS frineds 20190511
コンテンツ
? まえふり
? 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 (20)

Dot netcore multiplatform 2
Dot netcore multiplatform 2Dot netcore multiplatform 2
Dot netcore multiplatform 2
shozon
?
jjugccc2018 app review postmortem
jjugccc2018 app review postmortemjjugccc2018 app review postmortem
jjugccc2018 app review postmortem
tamtam180
?
Best practice laravel
Best practice laravelBest practice laravel
Best practice laravel
Risa Ohnishi
?
明日から使える Java SE 7
明日から使える Java SE 7明日から使える Java SE 7
明日から使える Java SE 7
Yuichi 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/JavaScript
terurou
?
sveltekit-ja.pdf
sveltekit-ja.pdfsveltekit-ja.pdf
sveltekit-ja.pdf
ssuser65180a
?
ClassLoader Leak Patterns
ClassLoader Leak PatternsClassLoader Leak Patterns
ClassLoader Leak Patterns
nekop
?
クラウド时代の并列分散処理技术
クラウド时代の并列分散処理技术クラウド时代の并列分散処理技术
クラウド时代の并列分散処理技术
Koichi Fujikawa
?
闯补惫补/础苍诲谤辞颈诲セキュアコーディング
闯补惫补/础苍诲谤辞颈诲セキュアコーディング闯补惫补/础苍诲谤辞颈诲セキュアコーディング
闯补惫补/础苍诲谤辞颈诲セキュアコーディング
Masaki Kubo
?
WDD2012_SC-004
WDD2012_SC-004WDD2012_SC-004
WDD2012_SC-004
Kuninobu SaSaki
?
骋谤辞辞惫测で楽に厂蚕尝を実行してみよう
骋谤辞辞惫测で楽に厂蚕尝を実行してみよう骋谤辞辞惫测で楽に厂蚕尝を実行してみよう
骋谤辞辞惫测で楽に厂蚕尝を実行してみよう
Akira Shimosako
?
闯补惫补セキュアコーディングセミナー东京第3回讲义
闯补惫补セキュアコーディングセミナー东京第3回讲义闯补惫补セキュアコーディングセミナー东京第3回讲义
闯补惫补セキュアコーディングセミナー东京第3回讲义
JPCERT Coordination Center
?
Project lambda
Project lambdaProject lambda
Project lambda
Appresso Engineering Team
?
Swift2.x を Scala からみる
Swift2.x を Scala からみるSwift2.x を Scala からみる
Swift2.x を Scala からみる
Yuichi Adachi
?
骋谤补诲濒别布教活动
骋谤补诲濒别布教活动骋谤补诲濒别布教活动
骋谤补诲濒别布教活动
Nemoto Yusuke
?
颁辞诲别滨驳苍颈迟别谤入门
颁辞诲别滨驳苍颈迟别谤入门颁辞诲别滨驳苍颈迟别谤入门
颁辞诲别滨驳苍颈迟别谤入门
Sho A
?
JavaLearning_1.pptx
JavaLearning_1.pptxJavaLearning_1.pptx
JavaLearning_1.pptx
RyuuGaku
?
Rx java x retrofit
Rx java x retrofitRx java x retrofit
Rx java x retrofit
Shun Nakahara
?
蝉肠补濒补+濒颈蹿迟で游ぼう
蝉肠补濒补+濒颈蹿迟で游ぼう蝉肠补濒补+濒颈蹿迟で游ぼう
蝉肠补濒补+濒颈蹿迟で游ぼう
youku
?
Dot netcore multiplatform 2
Dot netcore multiplatform 2Dot netcore multiplatform 2
Dot netcore multiplatform 2
shozon
?
jjugccc2018 app review postmortem
jjugccc2018 app review postmortemjjugccc2018 app review postmortem
jjugccc2018 app review postmortem
tamtam180
?
Best practice laravel
Best practice laravelBest practice laravel
Best practice laravel
Risa Ohnishi
?
明日から使える Java SE 7
明日から使える Java SE 7明日から使える Java SE 7
明日から使える Java SE 7
Yuichi 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/JavaScript
terurou
?
ClassLoader Leak Patterns
ClassLoader Leak PatternsClassLoader Leak Patterns
ClassLoader Leak Patterns
nekop
?
クラウド时代の并列分散処理技术
クラウド时代の并列分散処理技术クラウド时代の并列分散処理技术
クラウド时代の并列分散処理技术
Koichi Fujikawa
?
闯补惫补/础苍诲谤辞颈诲セキュアコーディング
闯补惫补/础苍诲谤辞颈诲セキュアコーディング闯补惫补/础苍诲谤辞颈诲セキュアコーディング
闯补惫补/础苍诲谤辞颈诲セキュアコーディング
Masaki Kubo
?
骋谤辞辞惫测で楽に厂蚕尝を実行してみよう
骋谤辞辞惫测で楽に厂蚕尝を実行してみよう骋谤辞辞惫测で楽に厂蚕尝を実行してみよう
骋谤辞辞惫测で楽に厂蚕尝を実行してみよう
Akira Shimosako
?
闯补惫补セキュアコーディングセミナー东京第3回讲义
闯补惫补セキュアコーディングセミナー东京第3回讲义闯补惫补セキュアコーディングセミナー东京第3回讲义
闯补惫补セキュアコーディングセミナー东京第3回讲义
JPCERT Coordination Center
?
Swift2.x を Scala からみる
Swift2.x を Scala からみるSwift2.x を Scala からみる
Swift2.x を Scala からみる
Yuichi Adachi
?
骋谤补诲濒别布教活动
骋谤补诲濒别布教活动骋谤补诲濒别布教活动
骋谤补诲濒别布教活动
Nemoto Yusuke
?
颁辞诲别滨驳苍颈迟别谤入门
颁辞诲别滨驳苍颈迟别谤入门颁辞诲别滨驳苍颈迟别谤入门
颁辞诲别滨驳苍颈迟别谤入门
Sho A
?
JavaLearning_1.pptx
JavaLearning_1.pptxJavaLearning_1.pptx
JavaLearning_1.pptx
RyuuGaku
?
蝉肠补濒补+濒颈蹿迟で游ぼう
蝉肠补濒补+濒颈蹿迟で游ぼう蝉肠补濒补+濒颈蹿迟で游ぼう
蝉肠补濒补+濒颈蹿迟で游ぼう
youku
?

More from Takefumi MIYOSHI (20)

ACRi_webinar_20220118_miyo
ACRi_webinar_20220118_miyoACRi_webinar_20220118_miyo
ACRi_webinar_20220118_miyo
Takefumi MIYOSHI
?
DAS_202109
DAS_202109DAS_202109
DAS_202109
Takefumi 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.29
Takefumi MIYOSHI
?
Misc for edge_devices_with_fpga
Misc for edge_devices_with_fpgaMisc for edge_devices_with_fpga
Misc for edge_devices_with_fpga
Takefumi MIYOSHI
?
Cq off 20190718
Cq off 20190718Cq off 20190718
Cq off 20190718
Takefumi MIYOSHI
?
Reconf 201901
Reconf 201901Reconf 201901
Reconf 201901
Takefumi MIYOSHI
?
Hls friends 201803.key
Hls friends 201803.keyHls friends 201803.key
Hls friends 201803.key
Takefumi 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
?
Hls friends 20161122.key
Hls friends 20161122.keyHls friends 20161122.key
Hls friends 20161122.key
Takefumi MIYOSHI
?
狠狠撸
狠狠撸狠狠撸
狠狠撸
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 201512
Takefumi MIYOSHI
?
Das 2015
Das 2015Das 2015
Das 2015
Takefumi MIYOSHI
?
Microblaze loader
Microblaze loaderMicroblaze loader
Microblaze loader
Takefumi MIYOSHI
?
Reconf 201506
Reconf 201506Reconf 201506
Reconf 201506
Takefumi MIYOSHI
?
Synthesijer jjug 201504_01
Synthesijer jjug 201504_01Synthesijer jjug 201504_01
Synthesijer jjug 201504_01
Takefumi MIYOSHI
?
Synthesijer zynq qs_20150316
Synthesijer zynq qs_20150316Synthesijer zynq qs_20150316
Synthesijer zynq qs_20150316
Takefumi MIYOSHI
?
Synthesijer fpgax 20150201
Synthesijer fpgax 20150201Synthesijer fpgax 20150201
Synthesijer fpgax 20150201
Takefumi MIYOSHI
?
Synthesijer hls 20150116
Synthesijer hls 20150116Synthesijer hls 20150116
Synthesijer hls 20150116
Takefumi MIYOSHI
?
Synthesijer.Scala (PROSYM 2015)
Synthesijer.Scala (PROSYM 2015)Synthesijer.Scala (PROSYM 2015)
Synthesijer.Scala (PROSYM 2015)
Takefumi MIYOSHI
?

Synthesijer - HLS frineds 20190511