私のファミコンのfpsは530000です。もちろんフルパワーで(以下略

44
私のファミコンのfpsは530000です。 ですがもちろんフルパワーで(略 みかん県在住 なかはら @oboe7man ゆっくりしていってね! 1

Upload: hiroki-nakahara

Post on 15-Aug-2015

294 views

Category:

Engineering


1 download

TRANSCRIPT

Page 1: 私のファミコンのfpsは530000です。もちろんフルパワーで(以下略

私のファミコンのfpsは530000です。ですがもちろんフルパワーで(略

みかん県在住 なかはら

@oboe7man

ゆっくりしていってね!

1

Page 2: 私のファミコンのfpsは530000です。もちろんフルパワーで(以下略

今日のお話

• Vivado HLS使ってFPGAでファミコン作ったよ~

2

Page 3: 私のファミコンのfpsは530000です。もちろんフルパワーで(以下略

ソースコードどうぞ• みきゃんウェア

ゆるキャラグランプリ2015でみきゃんに投票すればおk

煮るなり焼くなり論文発表するなり好きにしてください

必要な分は

見せたという

ことだ

これ以上は

見せぬ

※ちゃんとお見せするのでコンタクトしてくださいね

高位合成 NES 検索

3

Page 4: 私のファミコンのfpsは530000です。もちろんフルパワーで(以下略

なかはら@oboe7man is 誰• 中原啓貴 (HIROKI Nakahara)

• みかん大学で研究しています

• みかん県(収穫量日本一とは言っていない)在住

通称愛媛県…

【みかん県の物価】近所のスーパーで一箱50個入り580円!つまり…

1みかん=11.6円

4

Page 5: 私のファミコンのfpsは530000です。もちろんフルパワーで(以下略

みかん県の物価!

11みかん

※2015年7月30日時点. FPGAはSpartan3 XC3S50VQ100 (Digikey1個購入価格) 5

約2~3週間分(By みかん県民)

2.5箱みかん

Page 6: 私のファミコンのfpsは530000です。もちろんフルパワーで(以下略

表の顔• ディープニューラルネットワーク

• 9月にロンドンで開催される国際会議(FPL2015)で発表

• 現時点でFPGAで面積性能効率トップ(なはず)

• GPUさん首を洗ってまっとれよ

6H. Nakahara and T. Sasao, "A deep convolutional neural network based on nested residue number system," 25th International Conference on Filed-Programmable Logic and Applications (FPL 2015), (Accepted).

Page 7: 私のファミコンのfpsは530000です。もちろんフルパワーで(以下略

表の顔• インターネット用検索エンジン

• IPv6プレフィックス

• パケットヘッダ

• ペイロード(正規表現マッチ)

Packet

FPGA FPGA

+ + +

+ + +

Adder

+

RAM

M.

M. M. M. M.

M. M. M. M.

M. M. M. M.

誰もが設計する方法 提案手法

7H. Nakahara, T. Sasao, M. Matsuura, and H. Iwamoto, " LUT Cascades Based on Edge-Valued Multi-Valued Decision Diagrams: Application to Packet Classification,"IEEE Journal on Emerging and Selected Topics in Circuits and Systems (JETCAS), (To be published).

Page 8: 私のファミコンのfpsは530000です。もちろんフルパワーで(以下略

表の顔

• 電波望遠鏡用FFT• CASPER ROACH2

45m

AirBUS A321

44.51m

CASPER ROACH-2 Revision 2Stand-alone FPGA board-FPGA: Xilinx Virtex-6 SX475T-PowerPC 440 EPx-Multi-gigabit transceiver (SFP+)-2 x ZDOKs

8

Page 9: 私のファミコンのfpsは530000です。もちろんフルパワーで(以下略

何の脈絡もなくファミコンを作ることに• 先行者多数、ソースコードも豊富

• マリオという超有名タイトルが!

安直だね!

9

Page 10: 私のファミコンのfpsは530000です。もちろんフルパワーで(以下略

でも(息子が寝てくれないんで)時間がないんです…

※夜11時過ぎ… 10

Page 11: 私のファミコンのfpsは530000です。もちろんフルパワーで(以下略

Vivado HLSを採用

• Xilinxの中の人に「これスゴイデース」と勧められたから• アカデミック価格は10万 (System Editionに含まれる)• XUP(Xilinx University Program)だと25ライセンス無料

• 上司(教授)のケツを蹴っ飛ばして導入しましょう

• Nexys4 DDR を恵んで頂いたから• Xilinxさんありがとう!

• Google先生が「HLSでNESを作った人いないよ」って

教えてくれたから(←重要)

• 高位合成使うと短期間で設計できますよ~と煽られたから

• ちなみにVivado HLSを使ったのは初めて(誰も信じてくれない…)• 前身のAuto-ESLの元になったアルゴリズムを知ってる程度• 何故が高位合成ツールの査読が降ってくる…

11

Page 12: 私のファミコンのfpsは530000です。もちろんフルパワーで(以下略

NES (Nintendo Entertainment System)のお勉強

• アーキテクチャ• NES Info (http://nesdev.com/)• NES研究室

(http://hp.vector.co.jp/authors/VA042397/nes/)• すずめ愛好会

(http://symfo.web.fc2.com/nes/nes_suzume.html)

• アセンブラ• ギコ猫でもわかるファミコンプログラミング

(http://gikofami.fc2web.com/)

• エミュレータのソースコード(C++)• TASの管理人謹製(http://bisqwit.iki.fi/source/nes.html)• 美しい日本のファミコンエミュレータ

(https://github.com/tanakh/bjne/blob/master/README.ja)

12

Page 13: 私のファミコンのfpsは530000です。もちろんフルパワーで(以下略

エミュレータのコーディング• といいつつ、キモの6502コアは拝借

• M. Fayzulli (iNESの作者) (http://fms.komkon.org/EMUL8/)

• #define (マクロ) ゴリゴリ…, 後でgcc使うと展開できるからネ

• C言語で• いつも通りにビヘイビア(クロック無視)を書く

• 標準ライブラリ&再帰&動的ポインタはダメよ~ダメダメ• 配列はstaticで初期値をあらかじめ指定

• レジスタ値を端末に, ゲーム画面をBMPファイルに出力• ただし, 関数間のやりとりは外部変数を多用

• 高位合成が上手く扱ってくれることを期待• C++から(メンバ変数)の移植がすっごい楽

• 環境• [email protected]のgcc (使ったオプション-O3くらい)

13

Page 14: 私のファミコンのfpsは530000です。もちろんフルパワーで(以下略

案の定…

signed charによる符号拡張ぬけ

ミラーリングが逆

14

Page 15: 私のファミコンのfpsは530000です。もちろんフルパワーで(以下略

こいつ…動くぞ…• マッパ0専用(マ○オのみ動けばおk)

• ミラーリングは垂直のみ(マ○オのみ動けばおk)

• APU(サウンド)は未実装

• Java版はバグ有り…orz

15

Page 16: 私のファミコンのfpsは530000です。もちろんフルパワーで(以下略

高位合成ツールVivado HLSでGO!

ここからが

本当の

地獄だ…

16

Page 17: 私のファミコンのfpsは530000です。もちろんフルパワーで(以下略

Vivado HLSに投入…の前に手直し• main()はテストベンチとして記述(つまり合成対象外)

• ファミコンはプロセッサ+周辺回路, つまり順序回路…どうやって状態を保持?

• 外部・内部変数→Vivado HLS任せ 【今回はこれ】

• 関数外→自分のRTLで管理 main(){// テスト読込みread();

// エミュレーションnes_emu();

}

void nes_emu(){int reg_a;// エミュレーション部}

main(){// テスト読込みread();

int reg_a;

// エミュレーションnes_emu( &reg_a);

}

void nes_emu( int *reg_a){// エミュレーション部}

17

Page 18: 私のファミコンのfpsは530000です。もちろんフルパワーで(以下略

リセットは?

• Vivado HLS上で設定

• プラグマでも可

Solution

→ General

→ Add…

→Commandで

→config_rtlを設定

• none (電源オン時にリセット)

• control (制御レジスタのみ)

• state (制御+FSMをリセット)

• all (メモリも含めてすべてリセット)

• 外部変数に static 修飾子をつける• ちなみに const だとROMを明示

18

Page 19: 私のファミコンのfpsは530000です。もちろんフルパワーで(以下略

UG902: Vivado HLS高位合成ガイドからざっと解説• 1章をざっと読んで、3章を読むと取り敢えず書けるようになる

• main()をテストベンチ, 以降の関数を合成対象とする記述を強く奨励

• main()は何を記述しても可

• 今回はゲームパッドデータ(テキストファイル)を読み込んでBMP画像を出力しました

• Vivado HLSさん弱気…

• まぁ、いきなり高位合成は勇気がいるよ

• 一部のシステムコールは記述可(RTL生成時に無視してくれる)• printf, puts, putcharなどデバッグによく使う関数はおk

• 逆にfprintf, getc, time, malloc等はダメ!

• 当たり前だけど再帰、動的メモリ確保等は、ダメ

19

Page 20: 私のファミコンのfpsは530000です。もちろんフルパワーで(以下略

UG902: Vivado HLS高位合成ガイドからざっと解説(続)• 小さい関数は自動でインライン展開される

• 逆に, 各関数はそのままHDLのモジュールとして出力+プリミティブ(BRAMと初期値ファイル(*.dat), DSP48E)

• 任意精度型サポート• int24, uint1 (じゃあbooleanサポートしてよ…)とか• 1024ビットまでおk…VLIWマシン書けるじゃん• #include “ap_cint.h”をインクルード• (当然のことながら)通常のコンパイラの対象外• Vivado HLSのCシミュ専用コードになってしまうぞなもし

• RAMインプリは static, ROMだと const• 初期化はプラグマ(static int a=2とか書いて,

#pragma HLS reset variable=a)、またはconfig_rtlで設定

20

Page 21: 私のファミコンのfpsは530000です。もちろんフルパワーで(以下略

Run C-synthesis…ウボァー

21

Page 22: 私のファミコンのfpsは530000です。もちろんフルパワーで(以下略

Vivado HLSさん優秀っす…

• こちらの想定していない状況まで解析していた!

int func( int a, int b){if( a != 0)func( a, b);elsereturn a + b;}

a == 0を期待してコードを書いていた…

22

Page 23: 私のファミコンのfpsは530000です。もちろんフルパワーで(以下略

再帰を直したら合成…できた!?

結構リソース食ってるな、、という感想Vivadoにかけると全く違う量だったので、アテになりません(怒)

23

Page 24: 私のファミコンのfpsは530000です。もちろんフルパワーで(以下略

NES全体をHDLで記述• クロックドメインなVGAコントローラのみHDL手書き

• RAM(BRAM)を馬鹿でかいバッファping-pong RAMとして

NES本体

@50MHz

NESカートリッジ

(RAM)

バッファRAM

VGACtrl.@25MHz

Vivado HLSで設計

ROM吸出しby Arduino

ゲームパッドby Arduino

24

Page 25: 私のファミコンのfpsは530000です。もちろんフルパワーで(以下略

先生…検証が…したいです…

な…

なんという

ことだ…

……

世界が

ちがいすぎる…

…あ…

あまりにも…

……

Viva

do

SIM

では

どうしようも

ない…

Cygwin (Wind8.1, Vaio Pro 11)上の

Cで1フレーム(256x240ドット)検証: 1秒

1フレームをVivadoで

Behavioral Simulation: 3時間

25

Page 26: 私のファミコンのfpsは530000です。もちろんフルパワーで(以下略

サイクルベースで検証

• タイミング検証を省いてロジックのみ検証• イベントドリブン:任意時刻の信号変化

• サイクルベース:クロックエッジの変化時のみ

• Verilator (http://www.veripool.org/wiki/verilator)• HDLをC++に逆変換 (当時は何故?と思っていました…スマンカッタ)

• Ubuntuだと「apt-get install verilator」でインストールできるお手軽さ

• べんりな よのなかに なった もの よのう

サイクルベース

イベントドリブン

Clock NESの検証だと1フレーム約10秒

26

Page 27: 私のファミコンのfpsは530000です。もちろんフルパワーで(以下略

ウボァー(2回目)

• 人手を介した所(グルーロジック)にバグが…

XとYが逆

RとBが逆

27

Page 28: 私のファミコンのfpsは530000です。もちろんフルパワーで(以下略

やり直し!

• 今度は動いた!

28

Page 29: 私のファミコンのfpsは530000です。もちろんフルパワーで(以下略

~働いたら負けかなと思ってる

R T L に 触 れ た らエミュレータの

ビヘイビアモデルをCで記述

Vivado HLS用に手直し・ビット幅の調整

・再帰構造の見直し

Vivado HLSCシミュレーション

Vivado HLS 高位合成

Verilatorによるサイクルベース検証

Vivado HDL合成

全体のHDL記述

6日

30分

3分

5分

30分

10分

20分

Vivado SIMをすると約3時間x60フレーム

2~3回

2~3回

数1000回?

全部で約1週間を費やしたVivado SIMだと1回シミュレーション(60フレーム)する時間だよ…

こんな画面がでるまで真っ暗=検証できない

29

Page 30: 私のファミコンのfpsは530000です。もちろんフルパワーで(以下略

手書きHDLと比較# 18Kb BRAMs # FFs #LUTs Off‐chip RAM

(1) Spartan3E1000

5 1588 5088 PSRAM

(2) Spartan6LX16

5 1348 2236 16MB MicronCellular RAM

Artix‐7 byVivado HLS

75(カートリッジ含む)

6004 6885 ‐‐‐

(1) http://danstrother.com/fpga‐nes/ (2) http://fpganes.blogspot.jp/2013/01/luddes‐fpga‐nes.html

設計期間…約1週間(ソフト6日+高位合成1日), 手書きは約4か月(http://gadget.itmedia.co.jp/gg/articles/1105/30/news103.html)

30

手設計より3倍HWが増加するが20倍短い期間で設計できる

Page 31: 私のファミコンのfpsは530000です。もちろんフルパワーで(以下略

ZedboardのCortex A9と比較• 800MHz Dual-Core• DDR3 512MB• Xillunux上で計測• 自作エミュのCコードを使用• gcc –O3 でコンパイル

• APU(サウンド), PPU(描画)は行わない

【結果】 66.5 fps そこそこ早い!?(HDL不要じゃん…)Vivado HLSでは296.6fps相当

消費電力は意外といい勝負HDL: 1.04 WCortexA9: 2.42 W

高位合成によるHW高位合成によるHW

ARM上のSWARM上のSW

高位合成によるHWは消費電力性能比で10.79倍優れる

高位合成によるHWは消費電力性能比で10.79倍優れる

31

Page 32: 私のファミコンのfpsは530000です。もちろんフルパワーで(以下略

53万FPSへの挑戦 (魔改造)

32

Page 33: 私のファミコンのfpsは530000です。もちろんフルパワーで(以下略

とりあえずgprofを使ってプロファイリング…

ppu_render34%

ppu_render_bg30%

cpu_exec15%

mbc_read12%

ppu_render_spr6%

mbc_read_chr_rom 3% その他 0%残りは 0.01%未満…

ppu_なんとか→描画処理cpu_exec→命令実行mbc_なんとか→メモリアクセス

33

Page 34: 私のファミコンのfpsは530000です。もちろんフルパワーで(以下略

一方Vivado HLSで解析すると…

Analysisをクリック

34

すでに描画とCPUエミュレーションを並列化してくれてる!→ループをインライン展開してループ回数を減らせばおk?

Page 35: 私のファミコンのfpsは530000です。もちろんフルパワーで(以下略

高位合成による設計のポイント

35C. Zhang, P. Li, G. Sun, Y. Guan, B. Xiao and J. Cong, ”Optimizing FPGA‐based Accelerator Design for Deep Convolutional Neural Networks,” FPGA 2015

Page 36: 私のファミコンのfpsは530000です。もちろんフルパワーで(以下略

2つの屋根

36

システムには2つの限界が存在・リソース量 (Computation)・メモリ帯域 (Bandwidth)

Bandwidth roofが求められる!(性能)/(帯域, ここでは4.5GB/s)

C. Zhang, P. Li, G. Sun, Y. Guan, B. Xiao and J. Cong, ”Optimizing FPGA‐based Accelerator Design for Deep Convolutional Neural Networks,” FPGA 2015

Page 37: 私のファミコンのfpsは530000です。もちろんフルパワーで(以下略

作戦

37

デザインはこの範囲内に収まらなければならない!

デザインAだと, 95GFlops/5.34 GBs だからメモリ帯域制限 4.5GBsをオーバー!

実効性能は60 Gflopsに落ちる

結論: この線を狙っていこう!

C. Zhang, P. Li, G. Sun, Y. Guan, B. Xiao and J. Cong, ”Optimizing FPGA‐based Accelerator Design for Deep Convolutional Neural Networks,” FPGA 2015

Page 38: 私のファミコンのfpsは530000です。もちろんフルパワーで(以下略

解決策: アルゴリズムの改良

38

デザインはこの範囲内に収まらなければならない!

アル

ゴリズムA

アル

ゴリズムB

C. Zhang, P. Li, G. Sun, Y. Guan, B. Xiao and J. Cong, ”Optimizing FPGA‐based Accelerator Design for Deep Convolutional Neural Networks,” FPGA 2015

Page 39: 私のファミコンのfpsは530000です。もちろんフルパワーで(以下略

解決策②: メモリ帯域の向上

39

RAM RAM RAM

RAM RAM RAM

RAM RAM RAM

RAM RAM RAM

RAM RAM RAM

RAM RAM RAM

FPGAのメモリ数百~千個 (・∀・)

小さい(36Kb)(´・ω・`)

C. Zhang, P. Li, G. Sun, Y. Guan, B. Xiao and J. Cong, ”Optimizing FPGA‐based Accelerator Design for Deep Convolutional Neural Networks,” FPGA 2015

Page 40: 私のファミコンのfpsは530000です。もちろんフルパワーで(以下略

ゲームを絞るべ(マリオ専用化!)

• FPGAにROMを埋め込む• さまざまな変数を定数にできる!

→条件文が浅くなる

→メモリアクセス回数が減る

• ゲームの性質を利用して投機実行・並列化• TASの管理人謹製のNESエミュがすごかった…

40

Page 41: 私のファミコンのfpsは530000です。もちろんフルパワーで(以下略

FPGAならではのテクニック

• マリオしかできないYO…リコンフィギュレーション

→ FPGAは 再 構 成 できるじゃん!

41

MEM CPU

MEM

CPU

ROM

MEM

MEM

CPUマリオ専用CPU MEM

CPUMEM

MEM

CPUサッカー専用CPU

再構成

ROM

性能は低いけどなんでもできるよ!

性能高いしなんでもできるよ!

Page 42: 私のファミコンのfpsは530000です。もちろんフルパワーで(以下略

で、こうなった

NET FPGA SumeVirtex7 690T

Nexys4ボードはインタフェースのみ(VGA + JoyPad)

早すぎて何が起こっているか実機で確認できません…(シミュレーションではうまくいってるっぽいけど)

(;´Д`)42

Page 43: 私のファミコンのfpsは530000です。もちろんフルパワーで(以下略

感想• HLSに改宗しました

• だってTAT短いんだもん

• クロックマターなとこだけHDL

• HDLに触れたら負け• サイクルベース等上位レイヤで検証しておけばおk

• でも…やっぱり…ねぇ…• 秒オーダでコンパイルするCコンパイラさん手放せない…

• Softwareエンジニアにはギャップがでかい

• (使いどころを選べば) HWエンジニアには強力な武器• コード生成品質・ツールの使い勝手・値段のバランスが良い

• 人柱!人柱!• みんなで使おうHLS, もっと事例(SWやHWとの比較)が欲しい

43

Page 44: 私のファミコンのfpsは530000です。もちろんフルパワーで(以下略

おしまい!

ご清聴ありがとうございました@oboe7man

44