2014/10/22
2014年10月22日 15:00-15:50
組み込みシステムシンポジウム2014 (ESS2014)
チュートリアル
今日の話: PyCoRAMについて
n  高位合成技術とメモリシステム抽象化を用いた
アクセラレータIPコア開発のためのフレームワーク
PyCoRAMによる
Pythonを用いたポータブルな
FPGAアクセラレータ開発
l  キーワード: FPGAアクセラレータ・IPコア設計・Python-Verilog
高位合成・メモリシステム抽象化・AXI4インターコネクト
Modeled in RTL
(Verilog HDL) User
I/O
GPIO
PyCoRAM IP
User Logic
CoRAM
Register
CoRAM
Channel
高前田(山崎) 伸也
奈良先端科学技術大学院大学 情報科学研究科
E-mail: shinya_at_is_naist_jp
2014-10-22
CoRAM
Memory
CoRAM
Stream
Master
DMAC
Master
DMAC
Shinya T-Y, NAIST
Control
Thread
Memory Access
Pattern
in Python
FSM
CoRAM
IoChannel
Slave
DMAC
2
PyCoRAM and Pyverilog are released for public!
n PyCoRAM
はじめに
l http://shtaxxx.github.io/PyCoRAM/
n Pyverilog
l http://shtaxxx.github.io/Pyverilog/
2014-10-22
Shinya T-Y, NAIST
3
2014-10-22
Shinya T-Y, NAIST
4
1
2014/10/22
Heterogeneous Computing
Multicore (Intel Corei7)
FPGAs in Anywhere
n  As an LSI verification platform
GPU (NVIDIA GeForce)
OoO
Core
OoO
Core
OoO
Core
OoO
Core
L2
L2
L2
L2
l  Testing the LSI functions,
before the actual fabrication
•  It enables longer behavior simulations
than SW-based simulators
L3 Cache
L2 Cache
DDR3 DRAM
GDDR5 DRAM
n  As a final product
l  Vision processing
FPGA (Xilinx Virtex-7)
Manycore (Intel Xeon Phi)
l  Network router
l  Broadcasting
DDR3 DRAM
l  Stock Trading
(High Frequency Trading (HFT))
DDR3 DRAM
l  Oil mining
5
Shinya T-Y, NAIST
2014-10-22
FPGA Board Overview
Digilent Atlys
FPGA: Xilinx Spartan-6 LX45
Size: Pipelined CPU ×4
Price: 20,000yen (Academic)
Xilinx VC707 Evaluation Board
(400,000yen)
FPGA (Xilinx Virtex-7)
DDR3 SODIMM DRAM
(Memory)
Stock Trading
Shinya T-Y, NAIST
6
Digilent ZedBoard
FPGA: Xilinx Zynq-7020
Size: Pipelined CPU ×8 (+ ARM DualCore)
Price: 50,000yen (Academic)
SD Card
Power In
Ethernet
2014-10-22
2014-10-22
Object
Detection
PCI-express
(Connected to PC)
Shinya T-Y, NAIST
7
2014-10-22
Shinya T-Y, NAIST
8
2
2014/10/22
ScalableCore System
FPGA: Xilinx Spartan-6 ×100
Size: Pipelined CPU x200?
Price: 1,000,000yen?
アプリケーションのポータビリティ
n  どうやって様々なプラットフォームをサポートするか?
l  プラットフォーム毎に特性が違うL
•  ロジックサイズ・メモリサイズ・
メモリインターフェース・I/O・・・
Digilent Atlys
(Xilinx Spartan-6 LX45)
ScalableCore System (our FPGA system)
(Xilinx Spartan-6 LX16 × 128-node)
9
Shinya T-Y, NAIST
2014-10-22
IPコアベースのシステム開発
Xilinx ML605
(Xilinx Virtex-6 LX240T)
Shinya T-Y, NAIST
2014-10-22
10
どうやってアクセラレータIPを実装するか?
n  IPコアを開発・追加して繋げばシステム完成J
n  普通にHDLでアクセラレータを実装するのは芸が無い
l  標準的なインターコネクトでIPコア達を接続
l  というかいろいろ面倒で嫌だ!
•  演算とメモリアクセスのスケジューリングロジック
l  EDAツールが自動的にインターコネクトと(いくつかの)
デバイス依存のインターフェースを生成してくれるから楽ちん
–  ダブルバッファリングとか面倒
•  メモリシステムの制御回路
–  HDLでステートマシンを書くのは面倒だし間違えやすい
IP-core List
•  デバッグが面倒
FPGA
CPU
IP-core
Instances
HW
Acc
l  でもパイプラインの振る舞いはサイクルレベルで定義したい
HW
Acc
•  FPGAで性能を出すには高稼働率のパイプラインが重要
Interconnect
Ether
Interconnect
DRAM
I/F
–  だから計算ロジックはHDLで書きたい
–  高位合成だとチューンがイマイチ難しい
PCI-E
n  抽象化されたメモリシステムが使えると幸せそう
DRAM
2014-10-22
Xilinx Platform Studio (XPS)
Shinya T-Y, NAIST
CoRAMメモリアーキテクチャ
11
2014-10-22
Shinya T-Y, NAIST
12
3
2014/10/22
CoRAM [Chung+,FPGA’11]
What “Runs” CoRAM?
n  FPGAアクセラレータのためのメモリ抽象化
RTL conversion
l  高位モデルによるメモリ管理でアクセラレータをポータブルに
Core Logic
•  ソフトウェアのモデルによるメモリアクセスパターンの記述
Architecture
Microarchitecture
Read/Write
CoRAM
Memory
Read
Write
HW Kernels
(Computing Logics)
2014-10-22
Off-chip
Memory
Fabric
FPGA
Manage
Control Logic
Network-on-Chip
Memory Translation (TLBs)
Memory Interfaces and Caches
Control Threads
(Memory Access
Pattern)
Shinya T-Y, NAIST
Cluster DMA
Control Logic
Abstracted
On-chip Memories
Cluster DMA
CoRAM
Channel
Fabric
Communication
FIFOs (Registers)
Control
thread
programs
SRAM
•  計算カーネルとメモリアクセスの分離
Read/Write
From
CoRAM Tutorial
@FPGA’13
6/19/2013
13
High-level synthesis
from C to RTL
using LLVM
CONNECT
NoC generator
CoRAM Tutorial
18
14
Shinya T-Y, NAIST
2014-10-22
Motivation: CoRAM for Modern EDKs
n  CoRAMのメモリ抽象化を今時のEDKで使いたい
l  標準的なインターコネクト( AMBA AXI4)に繋ぎたい
l  そうすれば他の普通のIPコアとも簡単に共存できそう
Portable application
design with CoRAM
PyCoRAM
Cooperation with standard IP-cores
Accelerator logic
Standard IP-core
CPU core
CoRAM
Abstraction
Standard On-chip Interconnect
Device-dependent Interfaces
2014-10-22
Shinya T-Y, NAIST
15
2014-10-22
Shinya T-Y, NAIST
16
4
2014/10/22
PyCoRAM [Takamaeda+,CARL’13]
オリジナルのCoRAMとの比較
CoRAM
n  ベンダーEDK向けのPythonベースのCoRAM実装
l  出来上がったIPコアをEDKでポチポチつなげばシステム完成!
n  特徴
C
Python
Supported
Memory Operations
(Blocking/Non-Blocking)
Read/Write
(Blocking/Non-Blocking)
Read/Write
On-chip Interconnect
CONNECT NoC [FPGA’12]
AMBA AXI4
FSM Granularity
in Control Thread
LLVM-IR
Python AST Node
l  Pythonでのコントロールスレッド記述
•  Pythonで簡単にメモリアクセスパターンを記述できる
–  独自の高位合成コンパイラでPython記述からVerilog HDLのRTLを合成
l  AMBA AXI4インターコネクトのサポート
Generate Statement
Support for User logics
No
Yes
Supported FPGAs
Xilinx ML605
Altera Terasic DE-4
Any FPGAs
supporting AXI Bus
# Lines of Code
11,682 lines
(w/o CONNECT)
4,947 lines
(w/o Pyverilog)
•  Xilinx Platform Studio (XPS)などを用いたIPコアベースの開発を支援
l  計算ロジックの複雑なデザインに対応
•  ハードウェアデザイン解析・生成のための
オープンソースツールキットPyverilogを活用
17
Shinya T-Y, NAIST
2014-10-22
PyCoRAMマイクロアーキテクチャ
GPIO
User
I/O
CoRAM
Register
CoRAM
Channel
2014-10-22
CoRAM
Memory
CoRAM
Stream
Master
DMAC
Master
DMAC
Shinya T-Y, NAIST
FSM: Finite State Machine
LLVM-IR: Low Level Virtual Machine Intermediate Representation
AST: Abstract Syntax Tree
Shinya T-Y, NAIST
2014-10-22
18
PyCoRAMマイクロアーキテクチャ
PyCoRAM IP
User Logic
PyCoRAM
Language
for Control-Thread
l  計算カーネルのRTL記述とメモリアクセスパターンの
Python記述からAXI4 IPコアを自動合成
Modeled in RTL
(Verilog HDL) User
Control
Thread
I/O
GPIO
PyCoRAM IP
User Logic
CoRAM
Register
CoRAM
Channel
FSM
CoRAM
IoChannel
Slave
DMAC
19
2014-10-22
CoRAM
Memory
CoRAM
Stream
Master
DMAC
Master
DMAC
Shinya T-Y, NAIST
Control
Thread
Memory Access
Pattern
in Python
FSM
CoRAM
IoChannel
Slave
DMAC
20
5
2014/10/22
PyCoRAMマイクロアーキテクチャの実装
GPIO
User
I/O
PyCoRAMマイクロアーキテクチャの実装
GPIO
PyCoRAM IP
User Logic
User
I/O
Control
Thread
CoRAM
Register
CoRAM
Channel
CoRAM
Stream
Master
DMAC
Master
DMAC
Slave
DMAC
Master I/F
Master I/F
Slave I/F
CoRAM
Channel
CoRAM
IoChannel
Master:
メモリ等へ能動
的にアクセス
Control
Thread
FSM
CoRAM
Memory
CoRAM
Stream
Master
DMAC
Master
DMAC
Slave
DMAC
Master I/F
Master I/F
Slave I/F
Interconnect (AXI4/Avalon)
FPGA
CoRAM
Register
FSM
CoRAM
Memory
CoRAM
IoChannel
Slave:
プロセッサ等から
読み書きされる
Interconnect (AXI4/Avalon)
FPGA
DRAM Controller
21
Shinya T-Y, NAIST
2014-10-22
PyCoRAM IP
User Logic
2014-10-22
DRAM Controller
Shinya T-Y, NAIST
22
PyCoRAMにおける開発フロー
n  計算カーネルのRTLとPythonでのコントロールスレッド
記述からIPコアパッケージを生成
l  生成されたIPコアは通常のEDAフローで利用可能
RTL Conversion
User-logic
(Verilog HDL)
Control
Threads
(Python)
Portable
Application
Design
2014-10-22
Logic
Hierarchy
Analysis
Control
Signal
Insertion
Python-toVerilog
Compilation
Control
Signal Port
Addition
IP-core
generation
with AXI4
Interface
PyCoRAMHLS
Tool-chain
Python-to-Verilog
Shinya T-Y, NAIST
IP-core
Packing
(RTL,
.mpd,
and
.pao)
Top design
synthesis with
AXI4
PyCoRAMの使い方
IP-core
Integration
on EDK
Synthesis
FPGA
Bit
File
Vendor EDA Flow
23
2014-10-22
Shinya T-Y, NAIST
24
6
2014/10/22
PyCoRAMにおけるIPコアの作り方・でき方
計算ロジックにおけるCoRAMオブジェクト
n  2種類のファイルを用意する
n  CoRAMオブジェクトはブロックRAMやFIFOとして扱う
l  Verilog HDL: 計算ロジック
l  一般的なメモリとよく似たインターフェース
•  CoRAMと外部を接続するインターフェースは自動的に追加される
l  Python: コントロールスレッド(メモリアクセスパターン)
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)�
);�
l  いくつかのパラメータで特性を指定
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)�
•  スレッド名,ID,データ幅,アドレス幅,スキャッターギャザー等
n  PyCoRAMが自動的にIPコアのパッケージを作成
l  Python-Verilog高位合成とRTL変換を自動で行う
2014-10-22
25
Shinya T-Y, NAIST
Pythonによるコントロールスレッド
User
I/O
•  ユーザロジックとコントロールスレッド
との間のトークンのやりとり
Shinya T-Y, NAIST
26
l  CoramMemory
Control
Thread
•  Block RAM that the data is replaced by the control thread
l  CoramInStream
CoRAM
Channel
CoRAM
Memory
•  Input FIFO from off-chip DRAM
FSM
l  CoramOutStream
DMAC
•  Output FIFO to off-chip DRAM
n  ユーザロジックとコンロールスレッド間のチャネル
0� def calc_sum(times):�
ram = CoramMemory(idx=0, datawidth=32, size=1024)�
1�
channel = CoramChannel(idx=0, datawidth=32)�
2�
addr = 0�
3�
sum = 0�
4�
for i in range(times):�
5�
ram.write(0, addr, 128)� # Transfer (off-chip DRAM to BRAM)
6�
channel.write(addr)�
# Notification to User-logic
7�
sum += channel.read()� # Wait for Notification from User-logic
8�
addr += 128 * (32/8)�
9�
print(‘sum=’, sum)�
# $display Verilog system task
10�
�
11� calc_sum(8)�
2014-10-22
(b) CoRAM Channel
Shinya T-Y, NAIST
n  データ置き場(メモリ・ストリーム)
User Logic
•  オンチップCoRAMメモリとオフチップDRAM
との間のDMA転送によるデータ移動
l  CoRAMチャネル(read/write)
(a) CoRAM Memory
サポートされているPyCoRAMオブジェクト
n  CoRAMオブジェクトに対する処理を記述する
l  CoRAMメモリ(read/write)
2014-10-22
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)�
);�
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)�
);�
l  CoramChannel
•  FIFO between user-logic and control-thread
l  CoramRegister
•  Latch between user-logic and control-thread
n  他のIPコア・プロセッサからアクセスできるスレーブチャネル
l  CoramIoChannel
•  (AXI4/Avalon) Slave interface
27
2014-10-22
Shinya T-Y, NAIST
28
7
2014/10/22
計算ロジック (1): I/Oポート
例: 配列の和を求めるアクセラレータ
n  1-CoRAM+1-Threadの簡単なハードウェア
l  CoRAMメモリにDRAM(など)からデータを読み込む
l  コントロールスレッドでオンチップ-オフチップ間のデータ転送
パターンを表現
Computing Logic (Verilog HDL)
クロック(CLK)とリセット(RST)
以外に専用のI/Oは不要
CoRAM
Memory 0
A
+
Control Logic
CoRAMメモリのための信号
(BRAMと同じインターフェース)
Control
Thread
(Python)
sum
CoRAMチャネルのための信号
(FIFOと同じインターフェース)
CoRAM
Channel 0
ステートマシン用変数
2014-10-22
Shinya T-Y, NAIST
29
計算ロジック (2): パイプライン/FSM
2014-10-22
Shinya T-Y, NAIST
30
計算ロジック (3): 子インスタンス
CoRAMメモリ
(BRAMと同じインターフェース)
CoRAMチャネル
(FIFOと同じインターフェース)
CoRAMチャネルから読み出し
(コントロールスレッドから受信)
2014-10-22
CoRAMチャネルに書き込み
(コントロールスレッドに通知)
Shinya T-Y, NAIST
31
2014-10-22
Shinya T-Y, NAIST
32
8
2014/10/22
コントロールスレッド (Python)
コンパイル
ram (CoRAMメモリ)とchannel (CoRAMチャネル)の宣言
CoRAMメモリにDMA転送したり
CoRAMチャネルから読んだり書いたり
2014-10-22
Shinya T-Y, NAIST
33
シミュレーション結果
2014-10-22
Shinya T-Y, NAIST
2014-10-22
Shinya T-Y, NAIST
34
シミュレーション結果(波形)
35
2014-10-22
Shinya T-Y, NAIST
36
9
2014/10/22
評価
n  評価項目: メモリバンド幅利用率
l  メモリ抽象化の下でも高いメモリ性能を達成できることを示す
n  セットアップ
l  FPGAボード2種
•  Digilent Atlys
評価
–  Spartan-6 LX45
–  DDR2-800 DRAM 128MB (1.2GB/s*)
*300MHz動作のため
–  AXI4 128-bit, 100MHz (1.6GB/s)
Digilent Atlys
(Xilinx Spartan-6 LX45)
•  Xilinx ML605
–  Virtex-6 LX240T
–  DDR3-800 DRAM 512MB (6.4GB/s)
–  AXI4 256-bit, 200MHz (6.4GB/s)
l  EDK
•  Xilinx Platform Studio (14.6)
37
Shinya T-Y, NAIST
2014-10-22
評価用アプリケーション
n  結構良い感じでメモリバンド幅を使えている
l  2つのCoRAMメモリをダブルバッファで利用
l  Atlys: 85.5% (@ 16-byte)
l  SIMD幅 (=同時に計算する要素数) を変化させてその影響を観測
l  ML605: 84.9% (@ 64-byte)
•  4, 8, 16, 32, 64 (bytes)
n  100%使い切れていない理由
Output
l  各DMACのトランザクションがシーケンシャルになっているから
•  結果,メモリアクセスレイテンシが性能にダイレクトに影響
+
s3
s2
s1
s0
+
+
+
+
D[3]
D[2]
D[1]
D[0]
Bandwidth Utilization
MUX
MUX
2014-10-22
D[2]
D[1]
D[0]
from DMA Controller 0
大幅に改善!
(現在評価中)
D[3]
D[2]
D[1]
D[0]
from DMA Controller 1
Shinya T-Y, NAIST
CoRAM
Memory
1
1
Atlys (Spartan-6)
Bandwidth Utilization
sum
D[3]
38
結果:メモリバンド幅利用率
n  配列の和を求める
CoRAM
Memory
0
Xilinx ML605
(Xilinx Virtex-6 LX240T)
Shinya T-Y, NAIST
2014-10-22
0.8
0.6
0.4
0.2
0
4
39
2014-10-22
8
16
SIMD size [byte]
32
Shinya T-Y, NAIST
1
ML605 (Virtex-6)
0.8
0.6
0.4
0.2
0
4
8
16
32
SIMD size [byte]
64
40
10
2014/10/22
高性能コンピュータシステム設計コンテスト
n  競技内容
l  指定のFPGAボード上に
指定のアプリケーションを処理可能な
計算機システムを実装し処理時間を競う
応用その1
行列積・ステンシル
アクセラレータ
l  指定FPGAボード
•  Digilent Atlys (Xilinx Spartan6 LX45)
•  Terasic DE2-115 (Altera Cyclone 4) など
n  結果
l  第1回:準優勝
•  自作MIPSコア+アクセラレータ2種
–  高前田(山崎) 伸也, 吉瀬 謙二: メモリ抽象化フレームワークPyCoRAMを
用いたソフトプロセッサ混載FPGAアクセラレータの開発
l  第2回:3位
•  Microblaze+アクセラレータ2種
–  田ノ元 正和, 枝元 正寛, 竹内 昌平, 高前田(山崎) 伸也: IPコア開発フレー
ムワークPyCoRAMを用いたHW/SW協調FPGAアクセラレータの開発
41
Shinya T-Y, NAIST
2014-10-22
ベンチマークアプリケーション4種
42
Shinya T-Y, NAIST
2014-10-22
第2回コンテスト用アクセラレータ構成
アプリケーション
説明
メモリシステムへの要求
310_sort
整数ソート
低レイテンシ
320_mm
行列積(整数)
高バンド幅
330_stencil
ステンシル計算(9点・整数)
高バンド幅
340_spath
最短経路問題
低レイテンシ
n  PyCoRAMでIPコア2種を実装
l  MicroblazeからはAXI4スレーブ経由でメモリマップドI/Oで制御
exStick
FPGA (Spartan-6 LX45)
UART
Loader
Microblaze
5-stage
32KB Local memory
8KB D-Cache
UART
Loader
Logic
Matrix-Mult
Accelerator
Control
Thread
CoRAM Abstraction
行列積・ステンシル計算
ソート・最短経路問題
MM
Logic
Cthread
MM
CoRAM Abstraction
Stencil
Accelerator
Stencil
Logic
Cthread
Stencil
CoRAM Abstraction
専用アクセラレータ向き
AXI4-lite Interconnect (32-bit, Shared bus)
専用アクセラレータは面倒
AXI4 Interconnect (128-bit, Crossbar)
CPUコア+専用アクセラレータが良さそう
2014-10-22
Shinya T-Y, NAIST
DRAM Controller (DDR2-800 16-bit (1.6GB/s))
43
2014-10-22
DRAM
(128MB)
Shinya
T-Y, NAIST
44
11
2014/10/22
行列積アクセラレータ
ステンシル計算アクセラレータ
n  行列A・B・Cの各行をCoRAMメモリに格納
n  元配列の3行と結果配列の1行をCoRAMメモリに格納
l  DRAMとの間のデータ転送をコントロールスレッドが担当
l  DRAMとの間のデータ転送をコントロールスレッドが担当
l  毎サイクル乗算パイプラインにデータを投入
l  毎サイクル加算・除算パイプラインに3点分のデータを投入
•  過去3サイクルの入力値の合計を9で割る(3点×3サイクル=9点)
l  行列Bの転送と演算をダブルバッファリング
l  計算1行分毎に結果を書き戻して元配列の次の1行を読み込む
l  SIMD幅をメモリバンド幅を使い切るようにチューニング
Control
Thread
(Python)
Computing Logic (Verilog HDL)
CoRAM
Memory 0
+
8-stage
Multiply
Pipeline
A
CoRAM
Memory 1
C
+
sum
Control Logic
CoRAM
Memory 1
CoRAM
Memory 0
check
sum
CoRAM
Memory 2
×
B
Computing Logic (Verilog HDL)
CoRAM
Channel 0
CoRAM
Memory 2
I/O
Channel
d0
d1
d2
+
+
check
sum
/
45
Shinya T-Y, NAIST
2014-10-22
CoRAM
Memory 3
rslt
41-stage
Add-Divide
Pipeline
Control Logic
2014-10-22
Control
Thread
(Python)
CoRAM
Channel 0
Shinya T-Y, NAIST
I/O
Channel
46
性能(第2回コンテスト)
n  データ転送時間を含む総時間
n  リファレンスデザインと比較して大幅な速度向上
l  行列積・ステンシル・最短経路(ソフト実装)では
データ転送に要する時間が殆ど
応用その1
グラフ処理
アクセラレータ
•  僅差だった・・・?J
50.00
40.00
30.00
Atlys Ref
40.96
38.85
29.99
DE2 Ref
42.99
42.28
26.06
40.66
35.44
25.72
PyCoMA
52.17
100.00
44.64
80.00
25.73
20.00
10.00
70.00
60.00
50.00
40.00
62.78
86.00
DE2 Ref
PyCoMA
69.90
63.66
65.22
50.93
55.99
54.28
37.24
26.23
30.00
25.94
25.70
20.00
10.00
0.00
0.00
sort
mm
stencil
spath
リファレンスデータ
2014-10-22
Atlys Ref
90.00
Execution Time [sec]
Execution Time [sec]
60.00
sort
mm
stencil
spath
第1回コンテスト決勝データ
Shinya T-Y, NAIST
47
2014-10-22
Shinya T-Y, NAIST
48
12
2014/10/22
PyCoRAMを用いたダイクストラIPコア
ダイクストラ法アクセラレータ[高前田+,CPSY2014-07]
n  PyCoRAMを使って演算モジュールはVerilog HDLで実装
メモリアクセス制御はPythonで実装
n  不規則なメモリアクセスパターンを持つアプリにおける
PyCoRAM適用可能性を明らかにする
User Definition (Modeled in Verilog HDL and Python)
Control Threads (Modeled in Python)
l  規則的なメモリアクセスパターンを持つアプリケーション
(行列積・ステンシル)はバンド幅律速
l  メモリアクセスレイテンシの影響が大きいアプリで使えるの?
•  まずは実装してみましょう
n  今回の題材:グラフ処理
l  最短経路探索(ダイクストラ法)
•  ボトルネックになりそうな箇所
Mark Visited
Cthread
Mark Visited
Cthread
Next Node Addr
Update
Node
Mark Visited
OutStream
OutStream
Read Node
Cthread
Priority Queue Cthread
Read Edge
Read Node
Priority Queue
OutStream
InStream
InStream
Edge
Page
Addr
InStream
Next Node Cost
FSM
Dijkstra
Logic
(Modeled in Verilog
HDL)
Cost
Next Node Cost
Main
CThread
Next Node Addr
Node Addr
Node
Addr
Read Edge
Cthread
+
Generated by
PyCoRAM
–  未訪問ノードの管理→距離をキーとした優先度キュー
–  隣接ノード情報(コスト・親ノード)の読み書き→ページング
DMAC
DMAC
DMAC
DMAC
DMAC
DMAC
AXI4-lite
Slave Interfaces
AXI4 Master Interfaces
49
Shinya T-Y, NAIST
2014-10-22
PyCoRAMを用いたダイクストラIPコア
PyCoRAMを用いたダイクストラIPコア
n  ステージ2:ノード情報読み出し
OutStream
Read Edge
Read Node
Priority Queue
OutStream
InStream
InStream
Edge
Page
Addr
InStream
DMAC
DMAC
Next Node Cost
DMAC
+
DMAC
Shinya T-Y, NAIST
FSM
Dijkstra
Logic
(Modeled in Verilog
HDL)
Cost
Next Node Cost
AXI4 Master Interfaces
2014-10-22
Next Node Addr
Node Addr
Node
Addr
Main
CThread
DMAC
DMAC
User Definition (Modeled in Verilog HDL and Python)
Mark Visited
Read Edge
Cthread
Mark Visited
Cthread
Slave I/F
AXI4-lite
Slave Interfaces
Mark Visited
Cthread
Update
Node
Mark Visited
OutStream
OutStream
Read Node
Cthread
Priority Queue Cthread
Next Node Addr
Generated by
PyCoRAM
Update
Node
OutStream
Control Threads (Modeled in Python)
Read Node
Cthread
Priority Queue Cthread
Next Node Addr
Generated by
PyCoRAM
User Definition (Modeled in Verilog HDL and Python)
Control Threads (Modeled in Python)
Mark Visited
Cthread
50
Shinya T-Y, NAIST
2014-10-22
n  ステージ1: 最小コストノード取り出し
Mark Visited
Cthread
Slave I/F
InStream
InStream
2014-10-22
Edge
Page
Addr
InStream
DMAC
DMAC
Next Node Cost
DMAC
+
DMAC
Shinya T-Y, NAIST
FSM
Dijkstra
Logic
(Modeled in Verilog
HDL)
Cost
Next Node Cost
AXI4 Master Interfaces
51
Read Edge
Read Node
Priority Queue
OutStream
Main
CThread
Next Node Addr
Node Addr
Node
Addr
Read Edge
Cthread
DMAC
DMAC
Slave I/F
AXI4-lite
Slave Interfaces
52
13
2014/10/22
PyCoRAMを用いたダイクストラIPコア
PyCoRAMを用いたダイクストラIPコア
n  ステージ3:ノードに訪問済みフラグ書き込み
n  パイプライン動作:(1)エッジ読み出し→
(2)隣接ノード読み出し→(3)隣接ノード更新
Next Node Addr
Control Threads (Modeled in Python)
Read Node
Cthread
Priority Queue Cthread
Update
Node
Mark Visited
OutStream
OutStream
Read Edge
Read Node
Priority Queue
Node
Addr
InStream
Edge
Page
Addr
InStream
InStream
Generated by
PyCoRAM
DMAC
Next Node Cost
DMAC
DMAC
FSM
Dijkstra
Logic
(Modeled in Verilog
HDL)
Cost
Next Node Cost
Main
CThread
Next Node Addr
Node Addr
OutStream
Read Edge
Cthread
+
DMAC
DMAC
DMAC
Slave I/F
AXI4-lite
Slave Interfaces
AXI4 Master Interfaces
Mark Visited
Cthread
Mark Visited
Cthread
Next Node Addr
Update
Node
Mark Visited
OutStream
OutStream
優先度付きキュー(ヒープ)
Cost
3
Next Node Cost
Next Node Cost
DMAC
DMAC
Microblaze
Control
Thread
(Modeled
in Python
DMAC
BRAM
Memory Bus (To DRAM)
Out
3-stage
16KB Local memory
2KB I-Cache
2KB D-Cache
d, 20
a, 40
e, 50
DMAC
Slave I/F
AXI4-lite
Slave Interfaces
54
UART
Loader
Logic
Priority
Queue
Read
Node
Read
Edge
CThread
Update
Node
CThread
Mark
Visited
CThread
Update
Node
Mark
Visited
Main
Control
Tread
Dijkstra Logic
Control
Thread
Read
Edge
CoRAM Abstraction
AXI4-lite Interconnect (32-bit, Shared bus)
BRAM
Zone
AXI4 Interconnect (128-bit, Crossbar)
DRAM Controller (DDR2-800 16-bit (1.6GB/s))
DMAC
Shinya T-Y, NAIST
DMAC
Dijkstra
Logic
(Modeled in Verilog
HDL)
f, 45
DMA requests
2014-10-22
Read
Node
CThread
CoRAM Abstraction
b, 30
In
Priority
Queue
CThread
UART Loader
Channel
FIFO
Child
1
Dijkstra Accelerator
Priority Queue Logic (Modeled in Verilog HDL)
Parent
2
FSM
Host PC
FPGA
(Spartan-6 LX45)
l  コストが小さいノード群を格納する BRAM
Right
DMAC
InStream
n  ホストからUART経由で制御・グラフ構築にMicroblaze
l  外部へ書き込むための CoramOutChannel
Left
+
Edge
Page
Addr
Shinya T-Y, NAIST
2014-10-22
l  外部から読み出すための CoramInChannel
Compare Logic
InStream
評価環境:FPGAシステム
n  CoRAMメモリ x2 + BRAM x1
FSM
InStream
Main
CThread
Read Edge
Read Node
Priority Queue
Node
Addr
Read Edge
Cthread
Next Node Addr
Node Addr
OutStream
DMAC
Read Node
Cthread
Priority Queue Cthread
AXI4 Master Interfaces
53
Shinya T-Y, NAIST
2014-10-22
User Definition (Modeled in Verilog HDL and Python)
Mark Visited
Cthread
Generated by
PyCoRAM
User Definition (Modeled in Verilog HDL and Python)
Control Threads (Modeled in Python)
Mark Visited
Cthread
DRAM (128MB)
55
2014-10-22
Shinya T-Y, NAIST
56
14
2014/10/22
実装の詳細
評価
n  FPGAボード実機で評価
n  AXI4インターコネクト:4構成
l  ボード: Digilent Atlys
l  クロスバー2種:パイプラインレジスタ等を持つ高性能タイプ
•  FPGA: Spartan-6 LX45
•  C128: 128ビット幅
•  C32: 32ビット幅
•  DRAM: DDR2-800 (1.6GB/s), 128MB
l  共有バス2種:リソース使用量を優先した省エリアタイプ
l  ツール: Xilinx PlanAhead 14.7, XPS 14.7
•  S128: 128ビット幅
n  汎用PC上と比較
•  S32: 32ビット幅
l  Intel Core i7 3770K (3.5GHz), DDR3-1600 (12.8GB/s ×2)
n  AXI4バスでは異なるマスターポート間では
Read/WriteのIn-order順番が保証されていない
l  Linux (Ubuntu 14.04), gcc 4.8.2 (-O3)
n  グラフ
l  先にバスにリクエストが発行したからといって
必ず先に処理されるわけではない
l  XORSHIFT乱数を用いてランダムに生成
l  特に Write → Read の依存関係には注意が必要
l  ノード数: 5000,エッジ数: 100000
l  解決策
•  より大規模なグラフはデバッグが間に合わなかったので
今後の課題ということで・・・
•  AXI4バスの設定で書き込みポートのPriorityを高くする
57
Shinya T-Y, NAIST
2014-10-22
実行時間
58
Shinya T-Y, NAIST
2014-10-22
実行時間
n  FPGA上の実装は汎用PCと比べて25倍程度低速L
l  メモリバンド幅あたりの性能でも1.5倍程度悪い・・・
n  FPGAでの実行時間を比べてみると直感と真逆の結果
l  なぜか?
l  クロスバーよりも共有バスの方が高性能!
•  データセットが小さい・OoOプロセッサのMLP抽出能力は凄い
500.0
498.9
l  バス幅が狭い方が高性能!
n  なぜか?
492.7
413.4
400.0
l  共有バスの方が
レイテンシが短い
404.3
25x
300.0
l  バス幅が短い方が
レイテンシが短い
200.0
100.0
l  必要なモノ:
高バンド幅ではなく
短レイテンシ
16.2
0.0
500.0
498.9
C32
S128
Shinya T-Y, NAIST
S32
492.7
413.4
404.3
S128
S32
400.0
300.0
200.0
100.0
16.2
0.0
C128
C128
2014-10-22
600.0
Execution Time [msec]
Execution Time [msec]
600.0
C32
x86
x86
59
2014-10-22
Shinya T-Y, NAIST
60
15
2014/10/22
今後の展望
n  ロジックのモデリング方式
l  コンピューティングロジックもHDLで書きたくない
l  計算カーネルに特化したマルチパラダイム処理系・DSL?
まとめ
•  MyHDLとの連携方式を実装中
n  静的解析による性能・電力チューニング
l  より少ないエフォートでより高いメモリ性能
l  電力効率の高いネットワーク・システム構成の自動選択
n  実アプリケーションへの適用
l  イーサネット直結系のオフローダ(ストリーム処理?)
l  ストレージ直結系のアクセラレータ(ビッグデータ?)
Shinya T-Y, NAIST
2014-10-22
61
2014-10-22
Shinya T-Y, NAIST
62
63
2014-10-22
Shinya T-Y, NAIST
64
まとめ
n  PyCoRAM: 高位合成技術とメモリシステム抽象化を用い
たアクセラレータIPコア開発のためのフレームワーク
n  開発したツール・フレームワークはgithubにて公開中
l  PyCoRAM: http://shtaxxx.github.io/PyCoRAM/
l  Pyverilog: http://shtaxxx.github.io/Pyverilog/
Modeled in RTL
(Verilog HDL) User
I/O
GPIO
PyCoRAM IP
User Logic
CoRAM
Register
CoRAM
Channel
CoRAM
Memory
2014-10-22
Master
DMAC
CoRAM
Stream
Master
Shinya
T-Y, NAIST
DMAC
Control
Thread
Memory Access
Pattern
in Python
FSM
CoRAM
IoChannel
Slave
DMAC
16
2014/10/22
Pyverilog: Python-based Hardware Design
Processing Tool-kit for Verilog HDL
PyCoRAMの実装と動作環境
Parser
n  ピュアなPythonによる実装
module TOP
(input CLK,
input RST,
output rslt, …
l  全体で4947行で実装できたのでコンパクト!
•  Python-Verilogコンパイラ: 3828行
Verilog HDL
Code
Lexical
Analyzer
Code
Generator
Syntax
Analyzer
AST
AST
module TOP
(input CLK,
input RST,
output rslt, …
Verilog HDL
Code
•  RTLトランスレータ: 769行
l  Verilog HDLのRTL静的解析にはPyverilogを利用
Dataflow Analyzer
•  Python-based Hardware Design Processing Tool-kit for Verilog HDL
Module
Analyzer
•  全体で12665行とかなりコンパクト
Signal
Analyzer
Bind
Analyzer
l  コード生成にはJinja2 (テキストテンプレートエンジン)を利用
Visualizer
Dataflow
•  テンプレート用テキストファイルが8000行くらい
Graphical
Output
Optimizer
n  動作環境:LinuxかMacを推奨
l  Python 3.3 (or later)
Control-flow Analyzer
l  Icarus Verilog 0.9.6 (or later)
State
Machine
Pattern
Matcher
l  Jinja2 (2.7 or later)
2014-10-22
65
Shinya T-Y, NAIST
2014-10-22
Input
Active
Condition
Analyzer
Output
Control-flow
Shinya T-Y, NAIST
66
Visualizerの出力
Dataflow
2014-10-22
Shinya T-Y, NAIST
State
Machine
67
17