狠狠撸

狠狠撸Share a Scribd company logo
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

発表資料 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