私のファミコンのfpsは530000です。もちろんフルパワーで(以下略
TRANSCRIPT
私のファミコンのfpsは530000です。ですがもちろんフルパワーで(略
みかん県在住 なかはら
@oboe7man
ゆっくりしていってね!
1
今日のお話
• Vivado HLS使ってFPGAでファミコン作ったよ~
2
ソースコードどうぞ• みきゃんウェア
ゆるキャラグランプリ2015でみきゃんに投票すればおk
煮るなり焼くなり論文発表するなり好きにしてください
必要な分は
見せたという
ことだ
これ以上は
見せぬ
※ちゃんとお見せするのでコンタクトしてくださいね
高位合成 NES 検索
3
なかはら@oboe7man is 誰• 中原啓貴 (HIROKI Nakahara)
• みかん大学で研究しています
• みかん県(収穫量日本一とは言っていない)在住
通称愛媛県…
【みかん県の物価】近所のスーパーで一箱50個入り580円!つまり…
1みかん=11.6円
4
みかん県の物価!
11みかん
※2015年7月30日時点. FPGAはSpartan3 XC3S50VQ100 (Digikey1個購入価格) 5
約2~3週間分(By みかん県民)
2.5箱みかん
表の顔• ディープニューラルネットワーク
• 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).
表の顔• インターネット用検索エンジン
• 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).
表の顔
• 電波望遠鏡用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
何の脈絡もなくファミコンを作ることに• 先行者多数、ソースコードも豊富
• マリオという超有名タイトルが!
安直だね!
9
でも(息子が寝てくれないんで)時間がないんです…
※夜11時過ぎ… 10
Vivado HLSを採用
• Xilinxの中の人に「これスゴイデース」と勧められたから• アカデミック価格は10万 (System Editionに含まれる)• XUP(Xilinx University Program)だと25ライセンス無料
• 上司(教授)のケツを蹴っ飛ばして導入しましょう
• Nexys4 DDR を恵んで頂いたから• Xilinxさんありがとう!
• Google先生が「HLSでNESを作った人いないよ」って
教えてくれたから(←重要)
• 高位合成使うと短期間で設計できますよ~と煽られたから
• ちなみにVivado HLSを使ったのは初めて(誰も信じてくれない…)• 前身のAuto-ESLの元になったアルゴリズムを知ってる程度• 何故が高位合成ツールの査読が降ってくる…
11
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
エミュレータのコーディング• といいつつ、キモの6502コアは拝借
• M. Fayzulli (iNESの作者) (http://fms.komkon.org/EMUL8/)
• #define (マクロ) ゴリゴリ…, 後でgcc使うと展開できるからネ
• C言語で• いつも通りにビヘイビア(クロック無視)を書く
• 標準ライブラリ&再帰&動的ポインタはダメよ~ダメダメ• 配列はstaticで初期値をあらかじめ指定
• レジスタ値を端末に, ゲーム画面をBMPファイルに出力• ただし, 関数間のやりとりは外部変数を多用
• 高位合成が上手く扱ってくれることを期待• C++から(メンバ変数)の移植がすっごい楽
• 環境• [email protected]のgcc (使ったオプション-O3くらい)
13
案の定…
signed charによる符号拡張ぬけ
ミラーリングが逆
14
こいつ…動くぞ…• マッパ0専用(マ○オのみ動けばおk)
• ミラーリングは垂直のみ(マ○オのみ動けばおk)
• APU(サウンド)は未実装
• Java版はバグ有り…orz
15
高位合成ツールVivado HLSでGO!
ここからが
本当の
地獄だ…
16
Vivado HLSに投入…の前に手直し• main()はテストベンチとして記述(つまり合成対象外)
• ファミコンはプロセッサ+周辺回路, つまり順序回路…どうやって状態を保持?
• 外部・内部変数→Vivado HLS任せ 【今回はこれ】
• 関数外→自分のRTLで管理 main(){// テスト読込みread();
// エミュレーションnes_emu();
}
void nes_emu(){int reg_a;// エミュレーション部}
main(){// テスト読込みread();
int reg_a;
// エミュレーションnes_emu( ®_a);
}
void nes_emu( int *reg_a){// エミュレーション部}
17
リセットは?
• Vivado HLS上で設定
• プラグマでも可
Solution
→ General
→ Add…
→Commandで
→config_rtlを設定
• none (電源オン時にリセット)
• control (制御レジスタのみ)
• state (制御+FSMをリセット)
• all (メモリも含めてすべてリセット)
• 外部変数に static 修飾子をつける• ちなみに const だとROMを明示
18
UG902: Vivado HLS高位合成ガイドからざっと解説• 1章をざっと読んで、3章を読むと取り敢えず書けるようになる
• main()をテストベンチ, 以降の関数を合成対象とする記述を強く奨励
• main()は何を記述しても可
• 今回はゲームパッドデータ(テキストファイル)を読み込んでBMP画像を出力しました
• Vivado HLSさん弱気…
• まぁ、いきなり高位合成は勇気がいるよ
• 一部のシステムコールは記述可(RTL生成時に無視してくれる)• printf, puts, putcharなどデバッグによく使う関数はおk
• 逆にfprintf, getc, time, malloc等はダメ!
• 当たり前だけど再帰、動的メモリ確保等は、ダメ
19
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
Run C-synthesis…ウボァー
21
Vivado HLSさん優秀っす…
• こちらの想定していない状況まで解析していた!
int func( int a, int b){if( a != 0)func( a, b);elsereturn a + b;}
a == 0を期待してコードを書いていた…
22
再帰を直したら合成…できた!?
結構リソース食ってるな、、という感想Vivadoにかけると全く違う量だったので、アテになりません(怒)
23
NES全体をHDLで記述• クロックドメインなVGAコントローラのみHDL手書き
• RAM(BRAM)を馬鹿でかいバッファping-pong RAMとして
NES本体
@50MHz
NESカートリッジ
(RAM)
バッファRAM
VGACtrl.@25MHz
Vivado HLSで設計
ROM吸出しby Arduino
ゲームパッドby Arduino
24
先生…検証が…したいです…
な…
なんという
ことだ…
……
世界が
ちがいすぎる…
…あ…
あまりにも…
……
Viva
do
SIM
では
どうしようも
ない…
…
Cygwin (Wind8.1, Vaio Pro 11)上の
Cで1フレーム(256x240ドット)検証: 1秒
1フレームをVivadoで
Behavioral Simulation: 3時間
25
サイクルベースで検証
• タイミング検証を省いてロジックのみ検証• イベントドリブン:任意時刻の信号変化
• サイクルベース:クロックエッジの変化時のみ
• Verilator (http://www.veripool.org/wiki/verilator)• HDLをC++に逆変換 (当時は何故?と思っていました…スマンカッタ)
• Ubuntuだと「apt-get install verilator」でインストールできるお手軽さ
• べんりな よのなかに なった もの よのう
サイクルベース
イベントドリブン
Clock NESの検証だと1フレーム約10秒
26
ウボァー(2回目)
• 人手を介した所(グルーロジック)にバグが…
XとYが逆
RとBが逆
27
やり直し!
• 今度は動いた!
28
~働いたら負けかなと思ってる
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
手書き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倍短い期間で設計できる
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
53万FPSへの挑戦 (魔改造)
32
とりあえず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
一方Vivado HLSで解析すると…
Analysisをクリック
34
すでに描画とCPUエミュレーションを並列化してくれてる!→ループをインライン展開してループ回数を減らせばおk?
高位合成による設計のポイント
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
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
作戦
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
解決策: アルゴリズムの改良
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
解決策②: メモリ帯域の向上
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
ゲームを絞るべ(マリオ専用化!)
• FPGAにROMを埋め込む• さまざまな変数を定数にできる!
→条件文が浅くなる
→メモリアクセス回数が減る
• ゲームの性質を利用して投機実行・並列化• TASの管理人謹製のNESエミュがすごかった…
40
FPGAならではのテクニック
• マリオしかできないYO…リコンフィギュレーション
→ FPGAは 再 構 成 できるじゃん!
41
MEM CPU
MEM
CPU
ROM
MEM
MEM
CPUマリオ専用CPU MEM
CPUMEM
MEM
CPUサッカー専用CPU
再構成
ROM
性能は低いけどなんでもできるよ!
性能高いしなんでもできるよ!
で、こうなった
NET FPGA SumeVirtex7 690T
Nexys4ボードはインタフェースのみ(VGA + JoyPad)
早すぎて何が起こっているか実機で確認できません…(シミュレーションではうまくいってるっぽいけど)
(;´Д`)42
感想• HLSに改宗しました
• だってTAT短いんだもん
• クロックマターなとこだけHDL
• HDLに触れたら負け• サイクルベース等上位レイヤで検証しておけばおk
• でも…やっぱり…ねぇ…• 秒オーダでコンパイルするCコンパイラさん手放せない…
• Softwareエンジニアにはギャップがでかい
• (使いどころを選べば) HWエンジニアには強力な武器• コード生成品質・ツールの使い勝手・値段のバランスが良い
• 人柱!人柱!• みんなで使おうHLS, もっと事例(SWやHWとの比較)が欲しい
43
おしまい!
ご清聴ありがとうございました@oboe7man
44