SlideShare a Scribd company logo
1 of 22
Download to read offline
Fortranを用いた高位合成技術FortRockの開発 
山下 貴大1) 五十嵐 雄太1) 中條 拓伯1) 
1)東京農工大学 工学府 情報工学専攻
研究背景 
● 半導体プロセス技術の向上 
– チップ面積の減少 
– 集積度・回路規模の向上 
● FPGAの利用拡大 
– プロトタイピング 
● SoC,ASIC設計プロトタイプの構築 
– HPC (High Performance Computing) 
● 膨大なデータ・数値計算を扱うプログラム 
–例) 流体解析,タンパク質構造の解析 
14/10/24 Fortranを用いた高位合成技術 FortRockの開発2
近年のHPCシステム 
● マルチコアサーバ 
– 現在多くのHPCで用いられているシステム 
– x86やPOWERなどの汎用マルチコアプロセッサを利用 
– 消費電力性能が悪い (効率的でない) 
● GPGPU (General Purpose computing onGPU) 
– GPUでハードウェアアクセラレーション 
– 一度に大量のデータの処理に特化 
– 大規模な並列性のないプログラムでは性能が発揮できない 
14/10/24 Fortranを用いた高位合成技術 FortRockの開発3
HPCにおけるFPGAの有用性 
● 特定の用途に特化した演算器 
– 都度用意するのはコストがかかる 
● FPGAを用いたハードウェアアクセラレーション 
– 特定の用途に特化した演算器が作成可能 
– リコンフィギュレーション 
● 再利用可能 
14/10/24 Fortranを用いた高位合成技術 FortRockの開発4
過去のFortranの資産 
● Fortran 
– 科学技術計算において広く利用されてきた 
プログラム言語 
– 過去のプログラム資産が大量に存在 
● Fortranの利用例 
– NASA Mariner 1 
– JAXA UPACS, FlontFlow-red 
14/10/24 Fortranを用いた高位合成技術 FortRockの開発5
Fortran資産の再利用 
● 過去のFortran資産の有効活用 
– FPGA上で動作させる 
– 手作業でのFPGAへのポーティングは困難 
● 移植結果が正しく動作するか逐一確認 
(論理合成に時間がかかる) 
● Fortranコンパイラの最適化技術 
● アルゴリズムの修正が困難 
14/10/24 Fortranを用いた高位合成技術 FortRockの開発6
高位合成技術 
CやJavaなどのハードウェア記述言語(HDL)より 
抽象度の高い言語でのFPGAの設計 
● 高位合成ツール 
– C 
● Impulse C, CyberWorkBench 
– Java 
● Synthesijer, JavaRock-Thrash 
● 高位合成ツールの利点 
– 開発期間の短縮 
– プログラム資産の再利用性の向上 
– プログラマの負荷軽減 
14/10/24 Fortranを用いた高位合成技術 FortRockの開発7
先行研究 JavaRock-Thrash 
● JavaRock-Thrashとは 
– Javaプログラムを入力とする高位合成ツールの1つ 
● JavaRock-Thrashの特徴 
– Javaスレッドとループ展開をサポート 
– Javaの文法を拡張しない 
● 既存の多くのJavaエンジニアが扱える 
● ソースコードレベルでの最適化を行う 
– ループ展開 
– クリティカルパスの最小化 
14/10/24 Fortranを用いた高位合成技術 FortRockの開発8
先行研究 F2JRT (Fortran to JavaRock-Thrash) 
● F2JRTとは 
– FortranからJavaRock-Thrashで利用可能な 
Javaコードに変換するプログラム 
● F2JRTの問題点 
– Javaがサポートしていない文法の変換が困難 
● 例) goto文 
–最適化が困難 
● 回路の性能がJavaRock-Thrashに依存 
14/10/24 Fortranを用いた高位合成技術 FortRockの開発9
提案手法 
● FortRock 
– Fortran言語で記述されたプログラムを 
LLVM IRを経由してVerilog HDLを出力 
FortRock 
入力 
Fortran 
中間表現 
LLVM IR 
出力 
Verilog HDL 
Dragonegg 
(LLVMフロントエンド) 
FortRock Core 
14/10/24 Fortranを用いた高位合成技術 FortRockの開発10
FortRockの目的 
●過去のFortran資産をFPGA上で実行 
● Fortranから直接HDLを出力 
14/10/24 Fortranを用いた高位合成技術 FortRockの開発11
LLVM 
● C++で記述されたコンパイラ基盤 
– コンパイラを作るためのフレームワークを提供 
● 2000年にイリノイ大学で開始された 
研究プロジェクト 
– 現在でも活発に開発が行われている 
● Xcode 4, Swiftで使用されている 
LLVMオフィシャルロゴ 
14/10/24 Fortranを用いた高位合成技術 FortRockの開発12
FortRockの処理の流れ 
ソースコード 
Fortran 
フロントエンド 
LLVM IRに変換する 
変換前LLVM IR Pass 
LLVM Core 
解析・最適化 
入力を 
(任意のPassを選択可能) 
実装 
Pass 
B Verilog HDL 
A 変換後 LLVM IR 
コード生成 
FortRock Core 
PassManager 
再利用可能 
14/10/24 Fortranを用いた高位合成技術 FortRockの開発13
FortRockの出力規則 - SUBROUTINE - 
SUBROUTINE CALC(A, B, C, RET) 
INTEGER A, B, C, RET 
RET = A * B + C 
RETURN 
END 
CALC 
A 
B RET 
C 
res fin 
clk 
32 
 
32 
 
32 
 
32 
 
入力 SUBROUTINE 出力モジュール 
0123456 
14/10/24 Fortranを用いた高位合成技術 FortRockの開発14
FortRockの出力規則 - サブモジュール - 
SUBROUTINE TOP(A, B) 
INTEGER A, B, S_OUT 
B = A + SUB(A, S_OUT) 
RETURN 
END 
SUBROUTINE SUB(C, D) 
D = C * 2 
RETURN 
END 
サブモジュールを利用した 
SUBROUTINE 
Top 
SUB 
C D 
res fin 
32 
 
32 
 
A B 
res fin 
clk 
出力モジュール 
0123456 
012345 
32 
 
32 
 
14/10/24 Fortranを用いた高位合成技術 FortRockの開発15
FortRockの動作 - 入力 - 
SUBROUTINE LCM(I, J, 
ret_lcm) 
INTEGER I, J, IR1, IR2, 
IR, ret_lcm 
IF(I < J) THEN 
IR1 = J 
IR2 = I 
ELSE 
IR1 = I 
IR2 = J 
ENDIF 
IR = IR1 - (IR1/IR2) * IR2 
DO WHILE(IR>0) 
IR1 = IR2 
IR2 = IR 
IR = IR1 - (IR1/IR2) * IR2 
ENDDO 
ret_lcm = I*J/IR2 
RETURN 
END 
14/10/24 Fortranを用いた高位合成技術 FortRockの開発16
FortRockの動作 - LLVM IR - 
; Function Attrs: nounwind uwtable 
define void @lcm_(i32* noalias nocapture %i, i32* noalias nocapture %j, i32* noalias nocapture 
%ret_lcm) unnamed_addr #0 { 
entry: 
%0 = load i32* %i, align 4, !tbaa !0 
%1 = load i32* %j, align 4, !tbaa !0 
%2 = icmp slt i32 %0, %1 
%. = select i1 %2, i32 %1, i32 %0 
%.1 = select i1 %2, i32 %0, i32 %1 
%3 = srem i32 %., %.1 
%4 = icmp slt i32 %3, 1 
br i1 %4, label %"8", label %"7" 
"7": ; preds = %entry, %"7" 
%5 = phi i32 [ %6, %"7" ], [ %.1, %entry ] 
%6 = phi i32 [ %7, %"7" ], [ %3, %entry ] 
%7 = srem i32 %5, %6 
%8 = icmp slt i32 %7, 1 
br i1 %8, label %"8", label %"7" 
"8": ; preds = %"7", %entry 
%.lcssa = phi i32 [ %.1, %entry ], [ %6, %"7" ] 
%9 = mul nsw i32 %1, %0 
%10 = sdiv i32 %9, %.lcssa 
store i32 %10, i32* %ret_lcm, align 4, !tbaa !0 
ret void 
} 
14/10/24 Fortranを用いた高位合成技術 FortRockの開発17
FortRockの動作 - 出力 - module lcm_opt(clk, res, fin, reg_i, 
reg_j, reg_ret_lcm); 
input clk, res; 
output fin; 
reg fin; 
input [31:0] reg_i, reg_j; 
output [31:0] reg_ret_lcm; 
reg reg_tmp2, reg_tmp4, reg_tmp8; 
reg [1:0] prev_state, current_state; 
reg [31:0] reg_ret_lcm, reg_tmp, reg_tmp1, 
reg__, 
reg__1, reg_tmp3, reg_tmp6, reg_tmp7, 
reg_tmp5, reg_tmp9, reg__lcssa, 
reg_tmp10; 
always @(posedge clk) 
begin 
if(res) 
begin 
fin = 1'b0; 
reg_ret_lcm = 32'b0; 
prev_state = 2'b0; 
current_state = 2'b0; 
end // if res 
else if(fin == 1'b0) 
begin 
case (current_state) 
2'd0: 
begin 
reg_tmp = reg_i; 
reg_tmp1 = reg_j; 
reg_tmp2 = (reg_tmp < reg_tmp1); 
reg__ = (reg_tmp2 == 1'b1) 
? reg_tmp1 : reg_tmp; 
reg__1 = (reg_tmp2 == 1'b1) 
? reg_tmp : reg_tmp1; 
reg_tmp3 = reg__ % reg__1; 
reg_tmp4 = (reg_tmp3 < 1); 
prev_state = current_state; 
current_state = 
(1'b1 == reg_tmp4) ? 2'd2 : 2'd1; 
end 
2'd1: 
begin 
case(prev_state) 
2'd1 : reg_tmp5 = reg_tmp6; 
2'd0 : reg_tmp5 = reg__1; 
endcase 
case(prev_state) 
2'd1 : reg_tmp6 = reg_tmp7; 
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
14/10/24 Fortranを用いた高位合成技術 FortRockの開発18
FortRockの動作 - 出力回路の動作 - 
出力回路の出力波形 
14/10/24 Fortranを用いた高位合成技術 FortRockの開発19
JavaRock-Thrashとの比較 
JavaRock-Thrashで作成した回路の出力波形 
14/10/24 Fortranを用いた高位合成技術 FortRockの開発20
回路の性能比較 
reg lut 動作周波数 
[MHz] 処理サイクル数処理時間 
[us] 
JRT 259 5794 12.8 23 1.79 
FortRock 171 3628 13.3 5 0.37 
使用デバイス: Virtix7 XC7VX330T 
14/10/24 Fortranを用いた高位合成技術 FortRockの開発21
ロードマップ 
● FortranのプログラムをLLVM IRに変換 
● LLVM IRからすべての命令をVerilogに変換 
● 浮動小数点数への対応 
● 配列への対応 
● レジスタ共有機能の実装 
● 性能比較 
● 出力結果のビジュアル化機能の実装 
● 実践的なプログラムを用いた性能比較 
● 最適化技術の実装 
14/10/24 Fortranを用いた高位合成技術 FortRockの開発22

More Related Content

What's hot

Bluetooth通信の 仕組みと活用法紹介
Bluetooth通信の仕組みと活用法紹介Bluetooth通信の仕組みと活用法紹介
Bluetooth通信の 仕組みと活用法紹介Takehiko YOSHIDA
 
マイコンロボット実習
マイコンロボット実習マイコンロボット実習
マイコンロボット実習Takehiko YOSHIDA
 
Vivado hls勉強会3(axi4 lite slave)
Vivado hls勉強会3(axi4 lite slave)Vivado hls勉強会3(axi4 lite slave)
Vivado hls勉強会3(axi4 lite slave)marsee101
 
メモリ抽象化フレームワークPyCoRAMを用いたソフトプロセッサ混載FPGAアクセラレータの開発
メモリ抽象化フレームワークPyCoRAMを用いたソフトプロセッサ混載FPGAアクセラレータの開発メモリ抽象化フレームワークPyCoRAMを用いたソフトプロセッサ混載FPGAアクセラレータの開発
メモリ抽象化フレームワークPyCoRAMを用いたソフトプロセッサ混載FPGAアクセラレータの開発Shinya Takamaeda-Y
 
PyCoRAM (高位合成友の会@ドワンゴ, 2015年1月16日)
PyCoRAM (高位合成友の会@ドワンゴ, 2015年1月16日)PyCoRAM (高位合成友の会@ドワンゴ, 2015年1月16日)
PyCoRAM (高位合成友の会@ドワンゴ, 2015年1月16日)Shinya Takamaeda-Y
 
FPGA・リコンフィギャラブルシステム研究の最新動向
FPGA・リコンフィギャラブルシステム研究の最新動向FPGA・リコンフィギャラブルシステム研究の最新動向
FPGA・リコンフィギャラブルシステム研究の最新動向Shinya Takamaeda-Y
 
増え続ける情報に対応するためのFPGA基礎知識
増え続ける情報に対応するためのFPGA基礎知識増え続ける情報に対応するためのFPGA基礎知識
増え続ける情報に対応するためのFPGA基礎知識なおき きしだ
 
/proc/irq/&lt;irq>/smp_affinity
/proc/irq/&lt;irq>/smp_affinity/proc/irq/&lt;irq>/smp_affinity
/proc/irq/&lt;irq>/smp_affinityTakuya ASADA
 
katagaitaictf7_hw_ysk
katagaitaictf7_hw_yskkatagaitaictf7_hw_ysk
katagaitaictf7_hw_yskysk256
 
Pythonによる高位設計フレームワークPyCoRAMでFPGAシステムを開発してみよう
Pythonによる高位設計フレームワークPyCoRAMでFPGAシステムを開発してみようPythonによる高位設計フレームワークPyCoRAMでFPGAシステムを開発してみよう
Pythonによる高位設計フレームワークPyCoRAMでFPGAシステムを開発してみようShinya Takamaeda-Y
 
高位合成ツールVivado hlsのopen cv対応
高位合成ツールVivado hlsのopen cv対応高位合成ツールVivado hlsのopen cv対応
高位合成ツールVivado hlsのopen cv対応marsee101
 
Vivado hls勉強会2(レジスタの挿入とpipelineディレクティブ)
Vivado hls勉強会2(レジスタの挿入とpipelineディレクティブ)Vivado hls勉強会2(レジスタの挿入とpipelineディレクティブ)
Vivado hls勉強会2(レジスタの挿入とpipelineディレクティブ)marsee101
 
Technical report for IPv6 Routing w/ bgp4+ (part2)
Technical report for IPv6 Routing w/ bgp4+ (part2)Technical report for IPv6 Routing w/ bgp4+ (part2)
Technical report for IPv6 Routing w/ bgp4+ (part2)Toshiki Tsuboi
 
Technical report for IPv6 Routing w/ bgp4+
Technical report for IPv6 Routing w/ bgp4+Technical report for IPv6 Routing w/ bgp4+
Technical report for IPv6 Routing w/ bgp4+Toshiki Tsuboi
 
RubyKaigi2014: Just in Time compiler for CRuby
RubyKaigi2014: Just in Time compiler for CRubyRubyKaigi2014: Just in Time compiler for CRuby
RubyKaigi2014: Just in Time compiler for CRubyimasahiro
 

What's hot (20)

Bluetooth通信の 仕組みと活用法紹介
Bluetooth通信の仕組みと活用法紹介Bluetooth通信の仕組みと活用法紹介
Bluetooth通信の 仕組みと活用法紹介
 
マイコンロボット実習
マイコンロボット実習マイコンロボット実習
マイコンロボット実習
 
Vivado hls勉強会3(axi4 lite slave)
Vivado hls勉強会3(axi4 lite slave)Vivado hls勉強会3(axi4 lite slave)
Vivado hls勉強会3(axi4 lite slave)
 
Adk2012
Adk2012Adk2012
Adk2012
 
ASAMAP 開発秘話
ASAMAP 開発秘話ASAMAP 開発秘話
ASAMAP 開発秘話
 
メモリ抽象化フレームワークPyCoRAMを用いたソフトプロセッサ混載FPGAアクセラレータの開発
メモリ抽象化フレームワークPyCoRAMを用いたソフトプロセッサ混載FPGAアクセラレータの開発メモリ抽象化フレームワークPyCoRAMを用いたソフトプロセッサ混載FPGAアクセラレータの開発
メモリ抽象化フレームワークPyCoRAMを用いたソフトプロセッサ混載FPGAアクセラレータの開発
 
PyCoRAM (高位合成友の会@ドワンゴ, 2015年1月16日)
PyCoRAM (高位合成友の会@ドワンゴ, 2015年1月16日)PyCoRAM (高位合成友の会@ドワンゴ, 2015年1月16日)
PyCoRAM (高位合成友の会@ドワンゴ, 2015年1月16日)
 
FPGA・リコンフィギャラブルシステム研究の最新動向
FPGA・リコンフィギャラブルシステム研究の最新動向FPGA・リコンフィギャラブルシステム研究の最新動向
FPGA・リコンフィギャラブルシステム研究の最新動向
 
増え続ける情報に対応するためのFPGA基礎知識
増え続ける情報に対応するためのFPGA基礎知識増え続ける情報に対応するためのFPGA基礎知識
増え続ける情報に対応するためのFPGA基礎知識
 
/proc/irq/&lt;irq>/smp_affinity
/proc/irq/&lt;irq>/smp_affinity/proc/irq/&lt;irq>/smp_affinity
/proc/irq/&lt;irq>/smp_affinity
 
katagaitaictf7_hw_ysk
katagaitaictf7_hw_yskkatagaitaictf7_hw_ysk
katagaitaictf7_hw_ysk
 
Interrupts on xv6
Interrupts on xv6Interrupts on xv6
Interrupts on xv6
 
Pythonによる高位設計フレームワークPyCoRAMでFPGAシステムを開発してみよう
Pythonによる高位設計フレームワークPyCoRAMでFPGAシステムを開発してみようPythonによる高位設計フレームワークPyCoRAMでFPGAシステムを開発してみよう
Pythonによる高位設計フレームワークPyCoRAMでFPGAシステムを開発してみよう
 
高位合成ツールVivado hlsのopen cv対応
高位合成ツールVivado hlsのopen cv対応高位合成ツールVivado hlsのopen cv対応
高位合成ツールVivado hlsのopen cv対応
 
Vivado hls勉強会2(レジスタの挿入とpipelineディレクティブ)
Vivado hls勉強会2(レジスタの挿入とpipelineディレクティブ)Vivado hls勉強会2(レジスタの挿入とpipelineディレクティブ)
Vivado hls勉強会2(レジスタの挿入とpipelineディレクティブ)
 
Myoshimi extreme
Myoshimi extremeMyoshimi extreme
Myoshimi extreme
 
FPGAことはじめ
FPGAことはじめFPGAことはじめ
FPGAことはじめ
 
Technical report for IPv6 Routing w/ bgp4+ (part2)
Technical report for IPv6 Routing w/ bgp4+ (part2)Technical report for IPv6 Routing w/ bgp4+ (part2)
Technical report for IPv6 Routing w/ bgp4+ (part2)
 
Technical report for IPv6 Routing w/ bgp4+
Technical report for IPv6 Routing w/ bgp4+Technical report for IPv6 Routing w/ bgp4+
Technical report for IPv6 Routing w/ bgp4+
 
RubyKaigi2014: Just in Time compiler for CRuby
RubyKaigi2014: Just in Time compiler for CRubyRubyKaigi2014: Just in Time compiler for CRuby
RubyKaigi2014: Just in Time compiler for CRuby
 

Similar to 発表資料 Fortranを用いた高位合成技術FortRockの開発

VHDL-2008が好きなんです
VHDL-2008が好きなんですVHDL-2008が好きなんです
VHDL-2008が好きなんですwindy12806
 
GPU-FPGA 協調計算を記述するためのプログラミング環境に関する研究(HPC169 No.10)
GPU-FPGA 協調計算を記述するためのプログラミング環境に関する研究(HPC169 No.10)GPU-FPGA 協調計算を記述するためのプログラミング環境に関する研究(HPC169 No.10)
GPU-FPGA 協調計算を記述するためのプログラミング環境に関する研究(HPC169 No.10)Ryuuta Tsunashima
 
C base design methodology with s dx and xilinx ml
C base design methodology with s dx and xilinx ml C base design methodology with s dx and xilinx ml
C base design methodology with s dx and xilinx ml ssuser3a4b8c
 
HaskellではじめるCortex-M3組込みプログラミング
HaskellではじめるCortex-M3組込みプログラミングHaskellではじめるCortex-M3組込みプログラミング
HaskellではじめるCortex-M3組込みプログラミングKiwamu Okabe
 
Python physicalcomputing
Python physicalcomputingPython physicalcomputing
Python physicalcomputingNoboru Irieda
 
Rubyで創るOpenFlowネットワーク - LLまつり
Rubyで創るOpenFlowネットワーク - LLまつりRubyで創るOpenFlowネットワーク - LLまつり
Rubyで創るOpenFlowネットワーク - LLまつりYuya Rin
 
Container Networking Deep Dive
Container Networking Deep DiveContainer Networking Deep Dive
Container Networking Deep DiveHirofumi Ichihara
 
Telemetryについて
TelemetryについてTelemetryについて
Telemetryについてtetsusat
 
LLVM overview 20110122
LLVM overview 20110122LLVM overview 20110122
LLVM overview 20110122nothingcosmos
 
GPU-FPGA協調プログラミングを実現するコンパイラの開発
GPU-FPGA協調プログラミングを実現するコンパイラの開発GPU-FPGA協調プログラミングを実現するコンパイラの開発
GPU-FPGA協調プログラミングを実現するコンパイラの開発Ryuuta Tsunashima
 
ROP Illmatic: Exploring Universal ROP on glibc x86-64 (ja)
ROP Illmatic: Exploring Universal ROP on glibc x86-64 (ja)ROP Illmatic: Exploring Universal ROP on glibc x86-64 (ja)
ROP Illmatic: Exploring Universal ROP on glibc x86-64 (ja)inaz2
 
ラズパイでデバイスドライバを作ってみた。
ラズパイでデバイスドライバを作ってみた。ラズパイでデバイスドライバを作ってみた。
ラズパイでデバイスドライバを作ってみた。Kazuki Onishi
 
Dive into RTS - another side
Dive into RTS - another sideDive into RTS - another side
Dive into RTS - another sideKiwamu Okabe
 
Androidとfpgaを高速fifo通信させちゃう
Androidとfpgaを高速fifo通信させちゃうAndroidとfpgaを高速fifo通信させちゃう
Androidとfpgaを高速fifo通信させちゃうksk sue
 
ACRiウェビナー:岩渕様ご講演資料
ACRiウェビナー:岩渕様ご講演資料ACRiウェビナー:岩渕様ご講演資料
ACRiウェビナー:岩渕様ご講演資料直久 住川
 
Android デバッグ小ネタ
Android デバッグ小ネタAndroid デバッグ小ネタ
Android デバッグ小ネタl_b__
 
スタート低レイヤー #0
スタート低レイヤー #0スタート低レイヤー #0
スタート低レイヤー #0Kiwamu Okabe
 
Polyphony の行く末(2018/3/3)
Polyphony の行く末(2018/3/3)Polyphony の行く末(2018/3/3)
Polyphony の行く末(2018/3/3)ryos36
 

Similar to 発表資料 Fortranを用いた高位合成技術FortRockの開発 (20)

VHDL-2008が好きなんです
VHDL-2008が好きなんですVHDL-2008が好きなんです
VHDL-2008が好きなんです
 
GPU-FPGA 協調計算を記述するためのプログラミング環境に関する研究(HPC169 No.10)
GPU-FPGA 協調計算を記述するためのプログラミング環境に関する研究(HPC169 No.10)GPU-FPGA 協調計算を記述するためのプログラミング環境に関する研究(HPC169 No.10)
GPU-FPGA 協調計算を記述するためのプログラミング環境に関する研究(HPC169 No.10)
 
C base design methodology with s dx and xilinx ml
C base design methodology with s dx and xilinx ml C base design methodology with s dx and xilinx ml
C base design methodology with s dx and xilinx ml
 
HaskellではじめるCortex-M3組込みプログラミング
HaskellではじめるCortex-M3組込みプログラミングHaskellではじめるCortex-M3組込みプログラミング
HaskellではじめるCortex-M3組込みプログラミング
 
Python physicalcomputing
Python physicalcomputingPython physicalcomputing
Python physicalcomputing
 
Rubyで創るOpenFlowネットワーク - LLまつり
Rubyで創るOpenFlowネットワーク - LLまつりRubyで創るOpenFlowネットワーク - LLまつり
Rubyで創るOpenFlowネットワーク - LLまつり
 
Container Networking Deep Dive
Container Networking Deep DiveContainer Networking Deep Dive
Container Networking Deep Dive
 
[DL Hacks]FPGA入門
[DL Hacks]FPGA入門[DL Hacks]FPGA入門
[DL Hacks]FPGA入門
 
Telemetryについて
TelemetryについてTelemetryについて
Telemetryについて
 
LLVM overview 20110122
LLVM overview 20110122LLVM overview 20110122
LLVM overview 20110122
 
GPU-FPGA協調プログラミングを実現するコンパイラの開発
GPU-FPGA協調プログラミングを実現するコンパイラの開発GPU-FPGA協調プログラミングを実現するコンパイラの開発
GPU-FPGA協調プログラミングを実現するコンパイラの開発
 
Reconf_201409
Reconf_201409Reconf_201409
Reconf_201409
 
ROP Illmatic: Exploring Universal ROP on glibc x86-64 (ja)
ROP Illmatic: Exploring Universal ROP on glibc x86-64 (ja)ROP Illmatic: Exploring Universal ROP on glibc x86-64 (ja)
ROP Illmatic: Exploring Universal ROP on glibc x86-64 (ja)
 
ラズパイでデバイスドライバを作ってみた。
ラズパイでデバイスドライバを作ってみた。ラズパイでデバイスドライバを作ってみた。
ラズパイでデバイスドライバを作ってみた。
 
Dive into RTS - another side
Dive into RTS - another sideDive into RTS - another side
Dive into RTS - another side
 
Androidとfpgaを高速fifo通信させちゃう
Androidとfpgaを高速fifo通信させちゃうAndroidとfpgaを高速fifo通信させちゃう
Androidとfpgaを高速fifo通信させちゃう
 
ACRiウェビナー:岩渕様ご講演資料
ACRiウェビナー:岩渕様ご講演資料ACRiウェビナー:岩渕様ご講演資料
ACRiウェビナー:岩渕様ご講演資料
 
Android デバッグ小ネタ
Android デバッグ小ネタAndroid デバッグ小ネタ
Android デバッグ小ネタ
 
スタート低レイヤー #0
スタート低レイヤー #0スタート低レイヤー #0
スタート低レイヤー #0
 
Polyphony の行く末(2018/3/3)
Polyphony の行く末(2018/3/3)Polyphony の行く末(2018/3/3)
Polyphony の行く末(2018/3/3)
 

発表資料 Fortranを用いた高位合成技術FortRockの開発

  • 1. Fortranを用いた高位合成技術FortRockの開発 山下 貴大1) 五十嵐 雄太1) 中條 拓伯1) 1)東京農工大学 工学府 情報工学専攻
  • 2. 研究背景 ● 半導体プロセス技術の向上 – チップ面積の減少 – 集積度・回路規模の向上 ● FPGAの利用拡大 – プロトタイピング ● SoC,ASIC設計プロトタイプの構築 – HPC (High Performance Computing) ● 膨大なデータ・数値計算を扱うプログラム –例) 流体解析,タンパク質構造の解析 14/10/24 Fortranを用いた高位合成技術 FortRockの開発2
  • 3. 近年のHPCシステム ● マルチコアサーバ – 現在多くのHPCで用いられているシステム – x86やPOWERなどの汎用マルチコアプロセッサを利用 – 消費電力性能が悪い (効率的でない) ● GPGPU (General Purpose computing onGPU) – GPUでハードウェアアクセラレーション – 一度に大量のデータの処理に特化 – 大規模な並列性のないプログラムでは性能が発揮できない 14/10/24 Fortranを用いた高位合成技術 FortRockの開発3
  • 4. HPCにおけるFPGAの有用性 ● 特定の用途に特化した演算器 – 都度用意するのはコストがかかる ● FPGAを用いたハードウェアアクセラレーション – 特定の用途に特化した演算器が作成可能 – リコンフィギュレーション ● 再利用可能 14/10/24 Fortranを用いた高位合成技術 FortRockの開発4
  • 5. 過去のFortranの資産 ● Fortran – 科学技術計算において広く利用されてきた プログラム言語 – 過去のプログラム資産が大量に存在 ● Fortranの利用例 – NASA Mariner 1 – JAXA UPACS, FlontFlow-red 14/10/24 Fortranを用いた高位合成技術 FortRockの開発5
  • 6. Fortran資産の再利用 ● 過去のFortran資産の有効活用 – FPGA上で動作させる – 手作業でのFPGAへのポーティングは困難 ● 移植結果が正しく動作するか逐一確認 (論理合成に時間がかかる) ● Fortranコンパイラの最適化技術 ● アルゴリズムの修正が困難 14/10/24 Fortranを用いた高位合成技術 FortRockの開発6
  • 7. 高位合成技術 CやJavaなどのハードウェア記述言語(HDL)より 抽象度の高い言語でのFPGAの設計 ● 高位合成ツール – C ● Impulse C, CyberWorkBench – Java ● Synthesijer, JavaRock-Thrash ● 高位合成ツールの利点 – 開発期間の短縮 – プログラム資産の再利用性の向上 – プログラマの負荷軽減 14/10/24 Fortranを用いた高位合成技術 FortRockの開発7
  • 8. 先行研究 JavaRock-Thrash ● JavaRock-Thrashとは – Javaプログラムを入力とする高位合成ツールの1つ ● JavaRock-Thrashの特徴 – Javaスレッドとループ展開をサポート – Javaの文法を拡張しない ● 既存の多くのJavaエンジニアが扱える ● ソースコードレベルでの最適化を行う – ループ展開 – クリティカルパスの最小化 14/10/24 Fortranを用いた高位合成技術 FortRockの開発8
  • 9. 先行研究 F2JRT (Fortran to JavaRock-Thrash) ● F2JRTとは – FortranからJavaRock-Thrashで利用可能な Javaコードに変換するプログラム ● F2JRTの問題点 – Javaがサポートしていない文法の変換が困難 ● 例) goto文 –最適化が困難 ● 回路の性能がJavaRock-Thrashに依存 14/10/24 Fortranを用いた高位合成技術 FortRockの開発9
  • 10. 提案手法 ● FortRock – Fortran言語で記述されたプログラムを LLVM IRを経由してVerilog HDLを出力 FortRock 入力 Fortran 中間表現 LLVM IR 出力 Verilog HDL Dragonegg (LLVMフロントエンド) FortRock Core 14/10/24 Fortranを用いた高位合成技術 FortRockの開発10
  • 11. FortRockの目的 ●過去のFortran資産をFPGA上で実行 ● Fortranから直接HDLを出力 14/10/24 Fortranを用いた高位合成技術 FortRockの開発11
  • 12. LLVM ● C++で記述されたコンパイラ基盤 – コンパイラを作るためのフレームワークを提供 ● 2000年にイリノイ大学で開始された 研究プロジェクト – 現在でも活発に開発が行われている ● Xcode 4, Swiftで使用されている LLVMオフィシャルロゴ 14/10/24 Fortranを用いた高位合成技術 FortRockの開発12
  • 13. FortRockの処理の流れ ソースコード Fortran フロントエンド LLVM IRに変換する 変換前LLVM IR Pass LLVM Core 解析・最適化 入力を (任意のPassを選択可能) 実装 Pass B Verilog HDL A 変換後 LLVM IR コード生成 FortRock Core PassManager 再利用可能 14/10/24 Fortranを用いた高位合成技術 FortRockの開発13
  • 14. FortRockの出力規則 - SUBROUTINE - SUBROUTINE CALC(A, B, C, RET) INTEGER A, B, C, RET RET = A * B + C RETURN END CALC A B RET C res fin clk 32 32 32 32 入力 SUBROUTINE 出力モジュール 0123456 14/10/24 Fortranを用いた高位合成技術 FortRockの開発14
  • 15. FortRockの出力規則 - サブモジュール - SUBROUTINE TOP(A, B) INTEGER A, B, S_OUT B = A + SUB(A, S_OUT) RETURN END SUBROUTINE SUB(C, D) D = C * 2 RETURN END サブモジュールを利用した SUBROUTINE Top SUB C D res fin 32 32 A B res fin clk 出力モジュール 0123456 012345 32 32 14/10/24 Fortranを用いた高位合成技術 FortRockの開発15
  • 16. FortRockの動作 - 入力 - SUBROUTINE LCM(I, J, ret_lcm) INTEGER I, J, IR1, IR2, IR, ret_lcm IF(I < J) THEN IR1 = J IR2 = I ELSE IR1 = I IR2 = J ENDIF IR = IR1 - (IR1/IR2) * IR2 DO WHILE(IR>0) IR1 = IR2 IR2 = IR IR = IR1 - (IR1/IR2) * IR2 ENDDO ret_lcm = I*J/IR2 RETURN END 14/10/24 Fortranを用いた高位合成技術 FortRockの開発16
  • 17. FortRockの動作 - LLVM IR - ; Function Attrs: nounwind uwtable define void @lcm_(i32* noalias nocapture %i, i32* noalias nocapture %j, i32* noalias nocapture %ret_lcm) unnamed_addr #0 { entry: %0 = load i32* %i, align 4, !tbaa !0 %1 = load i32* %j, align 4, !tbaa !0 %2 = icmp slt i32 %0, %1 %. = select i1 %2, i32 %1, i32 %0 %.1 = select i1 %2, i32 %0, i32 %1 %3 = srem i32 %., %.1 %4 = icmp slt i32 %3, 1 br i1 %4, label %"8", label %"7" "7": ; preds = %entry, %"7" %5 = phi i32 [ %6, %"7" ], [ %.1, %entry ] %6 = phi i32 [ %7, %"7" ], [ %3, %entry ] %7 = srem i32 %5, %6 %8 = icmp slt i32 %7, 1 br i1 %8, label %"8", label %"7" "8": ; preds = %"7", %entry %.lcssa = phi i32 [ %.1, %entry ], [ %6, %"7" ] %9 = mul nsw i32 %1, %0 %10 = sdiv i32 %9, %.lcssa store i32 %10, i32* %ret_lcm, align 4, !tbaa !0 ret void } 14/10/24 Fortranを用いた高位合成技術 FortRockの開発17
  • 18. FortRockの動作 - 出力 - module lcm_opt(clk, res, fin, reg_i, reg_j, reg_ret_lcm); input clk, res; output fin; reg fin; input [31:0] reg_i, reg_j; output [31:0] reg_ret_lcm; reg reg_tmp2, reg_tmp4, reg_tmp8; reg [1:0] prev_state, current_state; reg [31:0] reg_ret_lcm, reg_tmp, reg_tmp1, reg__, reg__1, reg_tmp3, reg_tmp6, reg_tmp7, reg_tmp5, reg_tmp9, reg__lcssa, reg_tmp10; always @(posedge clk) begin if(res) begin fin = 1'b0; reg_ret_lcm = 32'b0; prev_state = 2'b0; current_state = 2'b0; end // if res else if(fin == 1'b0) begin case (current_state) 2'd0: begin reg_tmp = reg_i; reg_tmp1 = reg_j; reg_tmp2 = (reg_tmp < reg_tmp1); reg__ = (reg_tmp2 == 1'b1) ? reg_tmp1 : reg_tmp; reg__1 = (reg_tmp2 == 1'b1) ? reg_tmp : reg_tmp1; reg_tmp3 = reg__ % reg__1; reg_tmp4 = (reg_tmp3 < 1); prev_state = current_state; current_state = (1'b1 == reg_tmp4) ? 2'd2 : 2'd1; end 2'd1: begin case(prev_state) 2'd1 : reg_tmp5 = reg_tmp6; 2'd0 : reg_tmp5 = reg__1; endcase case(prev_state) 2'd1 : reg_tmp6 = reg_tmp7; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 14/10/24 Fortranを用いた高位合成技術 FortRockの開発18
  • 19. FortRockの動作 - 出力回路の動作 - 出力回路の出力波形 14/10/24 Fortranを用いた高位合成技術 FortRockの開発19
  • 20. JavaRock-Thrashとの比較 JavaRock-Thrashで作成した回路の出力波形 14/10/24 Fortranを用いた高位合成技術 FortRockの開発20
  • 21. 回路の性能比較 reg lut 動作周波数 [MHz] 処理サイクル数処理時間 [us] JRT 259 5794 12.8 23 1.79 FortRock 171 3628 13.3 5 0.37 使用デバイス: Virtix7 XC7VX330T 14/10/24 Fortranを用いた高位合成技術 FortRockの開発21
  • 22. ロードマップ ● FortranのプログラムをLLVM IRに変換 ● LLVM IRからすべての命令をVerilogに変換 ● 浮動小数点数への対応 ● 配列への対応 ● レジスタ共有機能の実装 ● 性能比較 ● 出力結果のビジュアル化機能の実装 ● 実践的なプログラムを用いた性能比較 ● 最適化技術の実装 14/10/24 Fortranを用いた高位合成技術 FortRockの開発22