メモリ抽象化フレームワークPyCoRAMを用いたソフトプロセッサ混載FPGAアクセラレータの開発...
-
Upload
shinya-takamaeda-yamazaki -
Category
Technology
-
view
1.899 -
download
8
description
Transcript of メモリ抽象化フレームワークPyCoRAMを用いたソフトプロセッサ混載FPGAアクセラレータの開発...
メモリ抽象化フレームワーク PyCoRAMを用いた ソフトプロセッサ混載
FPGAアクセラレータの開発 チーム名: PyCoRAMist(学生部門) 高前田(山崎) 伸也†‡,吉瀬 謙二†
†東京工業大学 大学院情報理工学研究科 ‡日本学術振興会 特別研究員 (DC1)
2014年1月23日 発表10分 計算機アーキテクチャ研究会@東工大
まずコンテストルールを確認しよう n 競技内容
l 指定のFPGAボード上に 指定のアプリケーションを処理可能な 計算機システムを実装し処理時間を競う
• FPGAボード: Digilent Atlys – FPGA: Xilinx Spartan-6 LX45, DRAM: DDR2-800 (1.6GB/s)
n ルールをよく読む
2014-01-23 Shinya T-Y. Tokyo Tech 2 速ければいい!
ベンチマークアプリケーション4種
2014-01-23 Shinya T-Y. Tokyo Tech 3
アプリケーション 説明 メモリシステムへの要求
310_sort 整数ソート 低レイテンシ
320_mm 行列積(整数) 高バンド幅
330_stencil ステンシル計算(9点・整数) 高バンド幅
340_spath 最短経路問題 低レイテンシ
CPUコア+専用アクセラレータが良さそう
専用アクセラレータ向き 行列積・ステンシル計算 ソート・最短経路問題 専用アクセラレータは面倒
どうやって実装するか? n 普通にHDLでアクセラレータを実装するのは芸が無い
l というかいろいろ面倒で嫌だ!博論〆切前だし・・・(当時) • 演算とメモリアクセスのスケジューリングロジック
– ダブルバッファリングとか面倒
• メモリシステムの制御回路 – HDLでステートマシンを書くのは面倒だし間違えやすい
• デバッグが面倒
l でもパイプラインの振る舞いはサイクルレベルで定義したい • FPGAで性能を出すには高稼働率のパイプラインが重要
– だから計算ロジックはHDLで書きたい
– 高位合成だとチューンがイマイチ難しい
n 抽象化されたメモリシステムが使えると幸せそう
2014-01-23 Shinya T-Y. Tokyo Tech 4
CoRAMメモリアーキテクチャ
CoRAM [Chung+,FPGA’11] n FPGAアクセラレータのためのメモリ抽象化
l 高位モデルによるメモリ管理でアクセラレータをポータブルに • 計算カーネルとメモリアクセスの分離
• ソフトウェアのモデルによるメモリアクセスパターンの記述
2014-01-23 Shinya T-Y. Tokyo Tech 5
HW Kernels (Computing Logics)
CoR
AM
M
emor
y
Read Write
Manage
Control Threads (Memory Access
Pattern)
CoRAM Channel
Read/Write Read/Write
Communication FIFOs (Registers)
Abstracted On-chip Memories
Off-chip Memory
PyCoRAM [Takamaeda+,CARL’13] n ベンダーEDK向けのPythonベースのCoRAM実装
l 計算カーネルのRTL記述とメモリアクセスパターンの Python記述からAXI4 IPコアを自動合成
l 出来上がったIPコアをEDKでポチポチつなげばシステム完成!
n 特徴 l Pythonでのコントロールスレッド記述
• Pythonで簡単にメモリアクセスパターンを記述できる – 独自の高位合成コンパイラでPython記述からVerilog HDLのRTLを合成
l AMBA AXI4インターコネクトのサポート • Xilinx Platform Studio (XPS)などを用いたIPコアベースの開発を支援
l 計算ロジックの複雑なデザインに対応 • ハードウェアデザイン解析・生成のための オープンソースツールキットPyverilogを活用
2014-01-23 Shinya T-Y. Tokyo Tech 6
PyCoRAMマイクロアーキテクチャ
2014-01-23 Shinya T-Y. Tokyo Tech 7
User I/O
User Logic
CoRAM Channel
CoRAM Register
Control Thread
DMAC
CoRAM Memory
DMAC
CoRAM Stream FSM
GPIO
PyCoRAMマイクロアーキテクチャ
2014-01-23 Shinya T-Y. Tokyo Tech 8
User I/O
User Logic
CoRAM Channel
CoRAM Register
Control Thread
DMAC
CoRAM Memory
DMAC
CoRAM Stream FSM
GPIO Modeled in RTL (Verilog HDL)
Memory Access Pattern
in Python
PyCoRAMマイクロアーキテクチャの実装
2014-01-23 Shinya T-Y. Tokyo Tech 9
PyCoRAM IP
AXI4 Interconnect
DRAM Controller FPGA
User I/O
User Logic
CoRAM Channel
CoRAM Register
Control Thread
DMAC
AXI I/F
CoRAM Memory
DMAC
AXI I/F
CoRAM Stream FSM
GPIO
PyCoRAMにおける開発フロー n 計算カーネルのRTLとPythonでのコントロールスレッド記述からIPコアパッケージを生成 l 生成されたIPコアは通常のEDAフローで利用可能
2014-01-23 Shinya T-Y. Tokyo Tech 10
User-logic (Verilog HDL)
Control Threads (Python)
Logic Hierarchy Analysis
Python-to-Verilog
Compilation
Control Signal
Insertion IP-core Packing
(RTL, .mpd, and
.pao)
IP-core Integration
on EDK
Synthesis Control
Signal Port Addition
FPGA Bit File
Portable Application
Design
PyCoRAM Tool-chain Vendor EDA Flow Python-to-Verilog HLS
RTL Conversion IP-core
generation with AXI4 Interface
Top design synthesis with
AXI4
Pythonによるコントロールスレッド n CoRAMオブジェクトに対する処理を記述する
l CoRAMメモリ(read/write) • オンチップCoRAMメモリとオフチップDRAM との間のDMA転送によるデータ移動
l CoRAMチャネル(read/write) • ユーザロジックとコントロールスレッド との間のトークンのやりとり
2014-01-23 Shinya T-Y. Tokyo Tech 11
def calc_sum(times):� ram = CoramMemory(idx=0, datawidth=32, size=1024)� channel = CoramChannel(idx=0, datawidth=32)� addr = 0� sum = 0� for i in range(times):� ram.write(0, addr, 128)� channel.write(addr)� sum += channel.read()� addr += 128 * (32/8)� print(‘sum=’, sum)�calc_sum(8)�
# Transfer (off-chip DRAM to BRAM) # Notification to User-logic # Wait for Notification from User-logic # $display Verilog system task �
User I/O
User Logic
CoRAM Channel
Control Thread
DMAC
CoRAM Memory FSM
0�1�2�3�4�5�6�7�8�9�10�11�
ユーザロジックにおけるCoRAMオブジェクト n CoRAMオブジェクトはブロックRAMやFIFOとして扱う
l 一般的なメモリとよく似たインターフェース • CoRAMと外部を接続するインターフェースは自動的に追加される
l いくつかのパラメータで特性を指定 • スレッド名,ID,データ幅,アドレス幅,スキャッターギャザー等
2014-01-23 Shinya T-Y. Tokyo Tech 12
CoramMemory1P�#(� .CORAM_THREAD_NAME("thread_name"),� .CORAM_ID(0),� .CORAM_ADDR_LEN(ADDR_LEN),� .CORAM_DATA_WIDTH(DATA_WIDTH)� )�inst_memory�(.CLK(CLK),� .ADDR(mem_addr),� .D(mem_d),� .WE(mem_we),� .Q(mem_q)� );�
(a) CoRAM Memory
CoramChannel�#(� .CORAM_THREAD_NAME("thread_name"),� .CORAM_ID(0),� .CORAM_ADDR_LEN(CHANNEL_ADDR_LEN),� .CORAM_DATA_WIDTH(CHANNEL_DATA_WIDTH)� )�inst_channel�(.CLK(CLK),� .RST(RST),� .D(comm_d),� .ENQ(comm_enq),� .FULL(comm_full),� .Q(comm_q),� .DEQ(comm_deq),� .EMPTY(comm_empty)� );�
(b) CoRAM Channel
PyCoRAM IPコアを用いたFPGAアクセラレータ
2014-01-23 Shinya T-Y. Tokyo Tech 13
Control Thread
FSM
AXI4 Interconnect
DRAM Controller
DRAM (Off-chip)
DMAC
AXI I/F
CoRAM Memory
CoRAM Memory
AXI I/F
CoRAM Memory
CoRAM Memory
DMAC DMAC
AXI I/F
CoRAM Stream
DMAC
AXI I/F
CoRAM Stream
CoRAM Channel
HW Kernels (Computing Logics)
DMA Cluster
DMA Cluster
FPGA
Other AXI
IP-core or
CPU
PyCoRAM IP (Application)
PyCoRAM IPコアのインターフェース n 標準的なAXI4マスターインターフェース
2014-01-23 Shinya T-Y. Tokyo Tech 14
DMA Controller
・・・
DramAddr BramAddr
Size WrEn RdEn Busy
Ready
Control Thread
FSM
Deq
ue
Em
pty
RdD
ata
Alm
Full
Enq
ue
WrD
ata
Rea
dy
RdE
n
RdE
n
Siz
e
Add
r
AXI Master Interface (Protocol Conversion)
AXI4 Interconnect
WR
EA
DY
WVA
LID
WD
ATA
BVA
LID
AWR
EA
DY
AWVA
LID
AWLE
N
AWA
DD
R
RVA
LID
RR
EA
DY
RD
ATA
AR
RE
AD
Y
AR
VALI
D
AR
LEN
AR
AD
DR
Write Address Channel
Write Data Channel
Read Address Channel
Read Data Channel
HW Kernels (Computing Logic)
Add
r
WrD
ata
RdD
ata
WrE
n
CoRAM Memory (BRAM)
Add
r
WrD
ata
RdD
ata
WrE
n
Add
r
WrD
ata
RdD
ata
WrE
n
CoRAM Memory (BRAM)
Add
r
WrD
ata
RdD
ata
WrE
n
CoRAM Channel
Deq
ue
Em
pty
RdD
ata
Alm
Full
Enq
ue
WrD
ata
Deq
ue
Em
pty
RdD
ata
Alm
Full
Enq
ue
WrD
ata
・・・ DMA Cluster
決勝用FPGAアクセラレータ n 構成: 6段MIPSコア+UARTローダー+アクセラレータ2種
l DRAMとの間のAXI4インターコネクトはXPSが自動的に生成
l 動作周波数: ロジック/AXIバス:100MHz, DRAM:400MHz
2014-01-23 Shinya T-Y. Tokyo Tech 15
AXI4 Interconnect (32-bit, Shared-bus)
DRAM Controller
PyCoRAM Abstraction
L1-D Cache (2-way, 32KB, 64bytes/line)
6-stage MIPS-core
PyCoRAM Abstraction
Memory Loader
UART
PyCoRAM Abstraction
Matrix Multiplication Accelerator
PyCoRAM Abstraction
9-point Stencil
Accelerator
決勝用FPGAアクセラレータ n 構成: 6段MIPSコア+UARTローダー+アクセラレータ2種
l DRAMとの間のAXI4インターコネクトはXPSが自動的に生成
l 動作周波数: ロジック/AXIバス:100MHz, DRAM:400MHz
2014-01-23 Shinya T-Y. Tokyo Tech 16
AXI4 Interconnect (32-bit, Shared-bus)
DRAM Controller
PyCoRAM Abstraction
L1-D Cache (2-way, 32KB, 64bytes/line)
6-stage MIPS-core
PyCoRAM Abstraction
Memory Loader
UART
PyCoRAM Abstraction
Matrix Multiplication Accelerator
PyCoRAM Abstraction
9-point Stencil
Accelerator
9.8%
4.5%
0.4%
2.5% 28.1% 22.5%
6.3%
行列積アクセラレータ n 行列A・B・Cの各行をCoRAMメモリに格納
l DRAMとの間のデータ転送をコントロールスレッドが担当
l 毎サイクル乗算パイプラインにデータを投入
l 行列Bの転送と演算をダブルバッファリング • 行列Bは別のPyCoRAMハードウェアを用いて予め転置
• おおよそ400MB/sのメモリ帯域を利用(最大帯域の1/4程度)
2014-01-23 Shinya T-Y. Tokyo Tech 17
Computing Logic (Verilog HDL) Control Thread
(Python)
sum
CoRAM Memory 0
B × +
CoRAM Memory 1
CoRAM Memory 2
Control Logic CoRAM Channel 0
8-stage Multiply Pipeline A
C
check sum +
ステンシル計算アクセラレータ n 元配列の3行と結果配列の1行をCoRAMメモリに格納
l DRAMとの間のデータ転送をコントロールスレッドが担当
l 毎サイクル加算・除算パイプラインに3点分のデータを投入 • 過去3サイクルの入力値の合計を9で割る(3点×3サイクル=9点)
l 計算1行分毎に結果を書き戻して元配列の次の1行を読み込む • おおよそ130MB/sのメモリ帯域を利用(最大帯域の1/12程度)
2014-01-23 Shinya T-Y. Tokyo Tech 18
Computing Logic (Verilog HDL) Control Thread
(Python) CoRAM
Memory 0
d1
CoRAM Memory 2
CoRAM Memory 3
Control Logic CoRAM Channel 0
41-stage Add-Divide
Pipeline
d0
rslt
d2
+ /
+ check sum
CoRAM Memory 1
MIPSコア用L1データキャッシュ n データRAMとしてCoRAMメモリを利用
l データリプレイスメントをコントロールスレッドが担当 • キャッシュミス時にコントロールスレッドにリクエストを発行
2014-01-23 Shinya T-Y. Tokyo Tech 19
Cache Logic (Verilog HDL)
Control Thread
(Python)
CoRAM Memory
0,1
Control Logic
CoRAM Channel 0
D0
D1
MU
X Tag0
=
Select Tag1
=
Write Data
Addr Stall
Read Data
Write Enable Read
Enable
reg
reg
reg
評価 n 登場選手
l リファレンスデザイン (Ref)
l 6段MIPSコア+L1キャッシュ (6-stage)
l 6段MIPSコア+L1キャッシュ+アクセラレータ (6-stage+ACC)
n アプリケーションデータセット l 予選データセット
n FPGA合成ツール l Xilinx Platform Studio 14.6, PlanAhead 14.6
• Optimization goal: Speed, Optimization Effort: High
• AXI4 Interconnect: 32-bit Shared bus (Area optimized)
n MIPS用ソフトウェアコンパイラ l gcc 4.3.3 (-O3)
2014-01-23 Shinya T-Y. Tokyo Tech 20
性能 n 全実行時間から転送時間を引いた正味の計算時間を比較 n リファレンスデザインと比較して大幅な速度向上
l 6段MIPSコアのみの構成で平均3.5倍の高速化
l 6段MIPSコア+アクセラレータ2種の構成で 平均13.2倍,最大47.1倍(ステンシル計算)の高速化
2014-01-23 Shinya T-Y. Tokyo Tech 21
3.9 1.4
5.9 4.7 3.5 3.9
35.2
47.1
4.7
13.2
0
5
10
15
20
25
30
35
40
45
50
310_sort 320_mm 330_stencil 340_spath Gmean
Rel
ativ
e Pe
rfor
man
ce
6-stage
6-stage+ACC
14.2 14.2 16.0
20.8
3.6
9.8
2.7 4.4 3.6
0.4 0.3
4.4
0
5
10
15
20
25
310_sort 320_mm 330_stencil 340_spath
Tim
e [s
ec]
Ref 6-stage 6-stage+ACC
ハードウェア使用率
2014-01-23 Shinya T-Y. Tokyo Tech 22
0.0%
10.0%
20.0%
30.0%
40.0%
50.0%
60.0%
70.0%
80.0%
Slice Reg LUT
Peripheral Loader Stencil Acc. MM Acc. L1D-Cache UART MIPS
0 500
1000 1500 2000 2500 3000 3500 4000 4500 5000
L1D-Cache MM Acc. Stencil Acc. Loader
AXI I/F
DMAC
Control Thread
User-logic
0 1000 2000 3000 4000 5000 6000 7000 8000 9000
L1D-Cache MM Acc. Stencil Acc. Loader
AXI I/F
DMAC
Control Thread
User-logic
Slice Reg LUT
Entire System Utilization n ユーザロジックと比べてDMACとAXI I/Fの リソース消費量が多い l 整数アプリかつパイプラインが1本 なので相対的に大きく見える
n コントロールスレッドのレジスタ消費量が多い l ステートマシンが巨大なため l 細粒度並列性を抽出しFSMを 小さくすると改善可能?
l レジスタは余り気味だから 気にしなくてもいい
まとめ
n メモリ抽象化フレームワークPyCoRAMを用いた FPGAアクセラレータの開発 l MIPSコア+UARTローダー+アクセラレータ2種を混載
l リファレンスデザインと比較して最大47.1倍の性能向上を達成
n 開発したツール・フレームワークはgithubにて公開中 l PyCoRAM: http://shtaxxx.github.io/PyCoRAM/
l Pyverilog: http://shtaxxx.github.io/Pyverilog/
2014-01-23 Shinya T-Y. Tokyo Tech 23