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

22
Fortranを用いた高位合成技術FortRockの開発 山下 貴大 1) 五十嵐 雄太 1) 中條 拓伯 1) 1) 東京農工大学 工学府 情報工学専攻

Upload: takahiro-yamashita

Post on 13-Jul-2015

186 views

Category:

Engineering


4 download

TRANSCRIPT

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

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

山下 貴大1) 五十嵐 雄太1) 中條 拓伯1)

1)東京農工大学 工学府 情報工学専攻

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

14/10/24 Fortranを用いた高位合成技術 FortRockの開発 2

研究背景● 半導体プロセス技術の向上

– チップ面積の減少

– 集積度・回路規模の向上

● FPGAの利用拡大

– プロトタイピング● SoC,ASIC設計プロトタイプの構築

– HPC (High Performance Computing)● 膨大なデータ・数値計算を扱うプログラム

–例) 流体解析,タンパク質構造の解析

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

14/10/24 Fortranを用いた高位合成技術 FortRockの開発 3

近年のHPCシステム

● マルチコアサーバ

– 現在多くのHPCで用いられているシステム

– x86やPOWERなどの汎用マルチコアプロセッサを利用

– 消費電力性能が悪い (効率的でない)

● GPGPU (General Purpose computing onGPU)

– GPUでハードウェアアクセラレーション

– 一度に大量のデータの処理に特化

– 大規模な並列性のないプログラムでは性能が発揮できない

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

14/10/24 Fortranを用いた高位合成技術 FortRockの開発 4

HPCにおけるFPGAの有用性

● 特定の用途に特化した演算器

– 都度用意するのはコストがかかる

● FPGAを用いたハードウェアアクセラレーション

– 特定の用途に特化した演算器が作成可能

– リコンフィギュレーション● 再利用可能

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

14/10/24 Fortranを用いた高位合成技術 FortRockの開発 5

過去のFortranの資産

● Fortran

– 科学技術計算において広く利用されてきたプログラム言語

– 過去のプログラム資産が大量に存在

● Fortranの利用例

– NASA Mariner 1– JAXA UPACS, FlontFlow-red

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

14/10/24 Fortranを用いた高位合成技術 FortRockの開発 6

Fortran資産の再利用● 過去のFortran資産の有効活用

– FPGA上で動作させる

– 手作業でのFPGAへのポーティングは困難● 移植結果が正しく動作するか逐一確認(論理合成に時間がかかる)

● Fortranコンパイラの最適化技術● アルゴリズムの修正が困難

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

14/10/24 Fortranを用いた高位合成技術 FortRockの開発 7

高位合成技術CやJavaなどのハードウェア記述言語(HDL)より抽象度の高い言語でのFPGAの設計

● 高位合成ツール– C

● Impulse C, CyberWorkBench– Java

● Synthesijer, JavaRock-Thrash

● 高位合成ツールの利点– 開発期間の短縮

– プログラム資産の再利用性の向上

– プログラマの負荷軽減

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

14/10/24 Fortranを用いた高位合成技術 FortRockの開発 8

先行研究 JavaRock-Thrash● JavaRock-Thrashとは

– Javaプログラムを入力とする高位合成ツールの1つ

● JavaRock-Thrashの特徴– Javaスレッドとループ展開をサポート– Javaの文法を拡張しない

● 既存の多くのJavaエンジニアが扱える

●ソースコードレベルでの最適化を行う– ループ展開

– クリティカルパスの最小化

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

14/10/24 Fortranを用いた高位合成技術 FortRockの開発 9

先行研究 F2JRT (Fortran to JavaRock-Thrash)● F2JRTとは

– FortranからJavaRock-Thrashで利用可能なJavaコードに変換するプログラム

● F2JRTの問題点– Javaがサポートしていない文法の変換が困難

● 例) goto文– 最適化が困難

● 回路の性能がJavaRock-Thrashに依存

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

14/10/24 Fortranを用いた高位合成技術 FortRockの開発 10

提案手法● FortRock

– Fortran言語で記述されたプログラムをLLVM IRを経由してVerilog HDLを出力

入力Fortran

中間表現LLVM IR

出力Verilog HDL

Dragonegg(LLVMフロントエンド)

FortRock Core

FortRock

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

14/10/24 Fortranを用いた高位合成技術 FortRockの開発 11

FortRockの目的

● 過去のFortran資産をFPGA上で実行

● Fortranから直接HDLを出力

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

14/10/24 Fortranを用いた高位合成技術 FortRockの開発 12

LLVM

● C++で記述されたコンパイラ基盤

– コンパイラを作るためのフレームワークを提供

● 2000年にイリノイ大学で開始された研究プロジェクト

– 現在でも活発に開発が行われている

● Xcode 4, Swiftで使用されている

LLVMオフィシャルロゴ

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

14/10/24 Fortranを用いた高位合成技術 FortRockの開発 13

FortRockの処理の流れ

LLVM Core

フロントエンド

ソースコードFortran

変換前LLVM IRPass

A変換後 LLVM IR

コード生成

FortRock Core

PassManager

PassB

Verilog HDL

解析・最適化(任意のPassを選択可能)

再利用可能

入力をLLVM IRに変換する

実装

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

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\

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

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\

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

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

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

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}

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

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;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

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

14/10/24 Fortranを用いた高位合成技術 FortRockの開発 19

FortRockの動作 - 出力回路の動作 -

出力回路の出力波形

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

14/10/24 Fortranを用いた高位合成技術 FortRockの開発 20

JavaRock-Thrashとの比較

JavaRock-Thrashで作成した回路の出力波形

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

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

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

14/10/24 Fortranを用いた高位合成技術 FortRockの開発 22

ロードマップ● FortranのプログラムをLLVM IRに変換

● LLVM IRからすべての命令をVerilogに変換

●浮動小数点数への対応

●配列への対応

● レジスタ共有機能の実装

● 性能比較

●出力結果のビジュアル化機能の実装

●実践的なプログラムを用いた性能比較

● 最適化技術の実装