発表資料 fortranを用いた高位合成技術fortrockの開発
TRANSCRIPT
Fortranを用いた高位合成技術FortRockの開発
山下 貴大1) 五十嵐 雄太1) 中條 拓伯1)
1)東京農工大学 工学府 情報工学専攻
14/10/24 Fortranを用いた高位合成技術 FortRockの開発 2
研究背景● 半導体プロセス技術の向上
– チップ面積の減少
– 集積度・回路規模の向上
● FPGAの利用拡大
– プロトタイピング● SoC,ASIC設計プロトタイプの構築
– HPC (High Performance Computing)● 膨大なデータ・数値計算を扱うプログラム
–例) 流体解析,タンパク質構造の解析
14/10/24 Fortranを用いた高位合成技術 FortRockの開発 3
近年のHPCシステム
● マルチコアサーバ
– 現在多くのHPCで用いられているシステム
– x86やPOWERなどの汎用マルチコアプロセッサを利用
– 消費電力性能が悪い (効率的でない)
● GPGPU (General Purpose computing onGPU)
– GPUでハードウェアアクセラレーション
– 一度に大量のデータの処理に特化
– 大規模な並列性のないプログラムでは性能が発揮できない
14/10/24 Fortranを用いた高位合成技術 FortRockの開発 4
HPCにおけるFPGAの有用性
● 特定の用途に特化した演算器
– 都度用意するのはコストがかかる
● FPGAを用いたハードウェアアクセラレーション
– 特定の用途に特化した演算器が作成可能
– リコンフィギュレーション● 再利用可能
14/10/24 Fortranを用いた高位合成技術 FortRockの開発 5
過去のFortranの資産
● Fortran
– 科学技術計算において広く利用されてきたプログラム言語
– 過去のプログラム資産が大量に存在
● Fortranの利用例
– NASA Mariner 1– JAXA UPACS, FlontFlow-red
14/10/24 Fortranを用いた高位合成技術 FortRockの開発 6
Fortran資産の再利用● 過去のFortran資産の有効活用
– FPGA上で動作させる
– 手作業でのFPGAへのポーティングは困難● 移植結果が正しく動作するか逐一確認(論理合成に時間がかかる)
● Fortranコンパイラの最適化技術● アルゴリズムの修正が困難
14/10/24 Fortranを用いた高位合成技術 FortRockの開発 7
高位合成技術CやJavaなどのハードウェア記述言語(HDL)より抽象度の高い言語でのFPGAの設計
● 高位合成ツール– C
● Impulse C, CyberWorkBench– Java
● Synthesijer, JavaRock-Thrash
● 高位合成ツールの利点– 開発期間の短縮
– プログラム資産の再利用性の向上
– プログラマの負荷軽減
14/10/24 Fortranを用いた高位合成技術 FortRockの開発 8
先行研究 JavaRock-Thrash● JavaRock-Thrashとは
– Javaプログラムを入力とする高位合成ツールの1つ
● JavaRock-Thrashの特徴– Javaスレッドとループ展開をサポート– Javaの文法を拡張しない
● 既存の多くのJavaエンジニアが扱える
●ソースコードレベルでの最適化を行う– ループ展開
– クリティカルパスの最小化
14/10/24 Fortranを用いた高位合成技術 FortRockの開発 9
先行研究 F2JRT (Fortran to JavaRock-Thrash)● F2JRTとは
– FortranからJavaRock-Thrashで利用可能なJavaコードに変換するプログラム
● F2JRTの問題点– Javaがサポートしていない文法の変換が困難
● 例) goto文– 最適化が困難
● 回路の性能がJavaRock-Thrashに依存
14/10/24 Fortranを用いた高位合成技術 FortRockの開発 10
提案手法● FortRock
– Fortran言語で記述されたプログラムをLLVM IRを経由してVerilog HDLを出力
入力Fortran
中間表現LLVM IR
出力Verilog HDL
Dragonegg(LLVMフロントエンド)
FortRock Core
FortRock
14/10/24 Fortranを用いた高位合成技術 FortRockの開発 11
FortRockの目的
● 過去のFortran資産をFPGA上で実行
● Fortranから直接HDLを出力
14/10/24 Fortranを用いた高位合成技術 FortRockの開発 12
LLVM
● C++で記述されたコンパイラ基盤
– コンパイラを作るためのフレームワークを提供
● 2000年にイリノイ大学で開始された研究プロジェクト
– 現在でも活発に開発が行われている
● Xcode 4, Swiftで使用されている
LLVMオフィシャルロゴ
14/10/24 Fortranを用いた高位合成技術 FortRockの開発 13
FortRockの処理の流れ
LLVM Core
フロントエンド
ソースコードFortran
変換前LLVM IRPass
A変換後 LLVM IR
コード生成
FortRock Core
PassManager
PassB
Verilog HDL
解析・最適化(任意のPassを選択可能)
再利用可能
入力をLLVM IRに変換する
実装
14/10/24 Fortranを用いた高位合成技術 FortRockの開発 14
FortRockの出力規則 - SUBROUTINE -
入力 SUBROUTINE 出力モジュール
0123456
SUBROUTINE CALC(A, B, C, RET)INTEGER A, B, C, RET
RET = A * B + C
RETURNEND
CALCA
B RET
C
res finclk
32\
32\
32\
32\
14/10/24 Fortranを用いた高位合成技術 FortRockの開発 15
FortRockの出力規則 - サブモジュール -
サブモジュールを利用したSUBROUTINE
出力モジュール
0123456
SUBROUTINE TOP(A, B)INTEGER A, B, S_OUT
B = A + SUB(A, S_OUT)
RETURNEND
012345
SUBROUTINE SUB(C, D)
D = C * 2
RETURNEND
Top
A Bres finclk
32\
32\
SUB
C Dres fin
32\
32\
14/10/24 Fortranを用いた高位合成技術 FortRockの開発 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の開発 17
FortRockの動作 - LLVM IR -; Function Attrs: nounwind uwtabledefine 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の開発 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の開発 19
FortRockの動作 - 出力回路の動作 -
出力回路の出力波形
14/10/24 Fortranを用いた高位合成技術 FortRockの開発 20
JavaRock-Thrashとの比較
JavaRock-Thrashで作成した回路の出力波形
14/10/24 Fortranを用いた高位合成技術 FortRockの開発 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の開発 22
ロードマップ● FortranのプログラムをLLVM IRに変換
● LLVM IRからすべての命令をVerilogに変換
●浮動小数点数への対応
●配列への対応
● レジスタ共有機能の実装
● 性能比較
●出力結果のビジュアル化機能の実装
●実践的なプログラムを用いた性能比較
● 最適化技術の実装