Download - 電波望遠鏡用の分光器をAltera SDK for OpenCL使ってサクッと作ってみた
電波望遠鏡⽤の分光器をサクッと作ってみた
中原啓貴 (東京⼯業⼤学)@oboe7man
1
⾃⼰紹介• Hiroki Nakahara• @oboe7man• 東京⼯業⼤学 准教授• ビール解禁• クラシック⾳楽(演奏側)• ⾼位合成にシフト中
• Altera OpenCL歴約半⽉• Vivado HLS歴約10か⽉
2
Custom Computing Machine
3
Multi‐valued logic Pattern matching circuit• Regular expressionmatching circuit
• Packet classifier• IP address look‐up
40m
Radio telescopeDeep neural network
たまーに…
4
暇人だなぁ…
電波望遠鏡
5
45m
AirBUS A321
44.51m
53m
SKA (Square Kilometer Array)
6
分光器
Feed horn
Amplifier Mixer
CASPER ROACH-2 Revision 2Stand-alone FPGA board-FPGA: Xilinx Virtex-6 SX475T-PowerPC 440 EPx-Multi-gigabit transceiver (SFP+)-2 x ZDOKs
7
Sub Reflector
Main Reflector
Next Generation of “ROACH”
8
Net FPGA Sume(Virtex7 FPGA)
FMC-ZDOCConnector
CASPER ADC1.3(5Gsps)
はみ出し!!
Origin of Life?
9
1. Protoplanetary Disks– protoplanetary disk can
be observed even at cm-wavelength
2. Complex molecule– Large molecules related to
the life radiate longer emission
3. SETI– Airport radar and
TV radio etc. can be targets
Chandler et al. 2005
要求スペック
10
広帯域⾼分解能230‐240 points FFT• OFDM: 28• CT Scanner: 216
0.1 – 1000GHz• Digital TV: 470‐770MHz
(UHF in Japan)• Cellular phone: 0.8‐2GHz
Frequency [Hz] Frequency [Hz]
分光器の構成
11
ADC
BRAM
FFT Magnitude
WindowCoefficient
Data from
Antenna
Power Spe
ctrum
FFT
FFT
Magnitude
Magnitude + Reg.
+ Reg.
+ Reg.
窓関数 FFT 積算処理
窓関数
12
ADC
BRAM
FFT Magnitude
WindowCoefficient
Data from
Antenna
Power Spe
ctrum
FFT
FFT
Magnitude
Magnitude + Reg.
+ Reg.
+ Reg.
×
Volta
ge
Volta
ge
Time Time
Fast Fourier Transform (FFT)
13
ADC
BRAM
FFT Magnitude
WindowCoefficient
Data from
Antenna
Power Spe
ctrum
FFT
FFT
Magnitude
Magnitude + Reg.
+ Reg.
+ Reg.
Time Frequency
Volta
ge
Power
積算処理
14
ADC
BRAM
FFT Magnitude
WindowCoefficient
Data from
Antenna
Power Spe
ctrum
FFT
FFT
Magnitude
Magnitude + Reg.
+ Reg.
+ Reg.
14Frequency
Power
Power
Frequency
CASPER Toolflow• MATLAB/Simulink
• Yellow box (Dedicated DSP library)
• Xilinx System Generator• Xilinx EDK• BORPH
• Debian Linux on PowerPC• Spectrometer on FPGA• http://casper.berkeley.edu/wiki/BORPH
俗にいうモデルベース開発ネ
問題点• とーにかくシミュレーション・合成が遅い
• MATLABベースですので…• 修正が⾮常にだるい…
• 今どきパイプラインレジスタを⼿で挿⼊してるんですよ︕• 新しいブロックを作るのが⾯倒、というかHDL書かないと
• とくにループが超⾯倒(LabViewのときにトラウマ経験)
16
そこで⾼位合成• 今回はAltera社OpenCLを採⽤
• HDL書いてたんじゃ間に合わない…(最近来た依頼︓Rスクリプトを3⽇以内にHWに落として︕)
• Vivado HLSだと、ロジック周辺回路(特にDDR3, Etherとか)のサポートが厳しい…
• Altera OpenCLだとBSP(Board Support Package)が提供されてれば周辺回路を設計する必要なし
• 研究室に⼊ってくる学⽣にHDLを教える⼿間が省ける
17楽したいだけじゃん
= $ !?ハードルが…• ⾼性能PC
• とにかくメモリが必要 (32GB以上)• ツールライセンス
• Quartus II• Altera OpenCL
• BSPが提供されているボードの⼀例
18
Donation多謝!
TerasicDE5‐NET
TerasicDE1‐SoC
Nallatech385A
GiDELProc V
たまたま︕
19あれ!︖
Cyclone V GT Development Kit
• $1299• Cyclone V GT5CGTFD9
• 301K LEs• 454K Regs• 1220 M10Ks• 684 18b Multipliers• 8 PLLs• 12 6Gbps Transceivers
• Power: 14-20V DC(PCIeも可)
20
PCI Express x4DDR3 HMC x 40DDR3 SMC x 64
HSMC x 2
GibEPH
Y
(これ→にあわせて)環境構築
• CPU: Pentium [email protected]• MEM: DDR3 PC3-12800 8GBx2• Motherboard: HASWELL対応H81M
mini ITX• OS: CentOS 6.4 64bit• Tool:
• Quartus II Prime 16.0 Subscription Edition
• Altera OpenCL 16.0 Linux• Device Cyclone V
(サイズがでかいので今回はC5Vのみ)
21
ポイント①• CentOSはPCI Expressのドライバが…
• カーネルのバージョンまで合わさないといけなかったのでCentOS 6.4に
• Ubuntu だとPCIドライバのコンパイルで失敗orz• 添付のコンフィギュレーションをUSB Blaster経由でボードに書いて電源を⼀度落とす(再起動だとダメ︕)
• パワーサイクルしないとPCIとして認識してくれなかった…• ディップスイッチはデフォルトのままでおk• Quartus II, OpenCLのインスコは特に問題なし• 仮想環境へのインストールはお勧めしません…
• ただし、シミュレーションまでならインストールしてもいいかも
22詳細は後⽇公開するんだってよ
ポイント②• Windowsで環境構築する場合
• Visual Studio 2010 Professionalが必要• Express版もできるらしいが、どうあがいてもできませんでした• 私はVS2013 Proを使って構築• Quartus II, OpenCLのパスを通すのはもちろんだが、VS2013⾃⾝のパスも通さないといけない. C:¥Program Files (x86)¥Microsoft Visual Studio 12.0
¥VC¥bin¥amd64¥vcvars64.bat を実⾏する必要アリ• ⽇本語アカウントダメ絶対︕︕できれば英語版をお勧めします
23
必死だなw
とりあえず設計開始• まずはアクセラレーションしたい部分をCで書く…
(といいつつ、ほとんどネットを参考にしました)• 【所要時間】1時間位
(gnuplotのインストールに時間がかかったorz)
24
Win8.1のエディタでコードを書いてVMWare Player上のUbuntu14.04LTSのgccで開発(なんてややこしい…)
Cソースを元にAltera OpenCLの設計開始• カーネル+ホストで構成
• カーネル︓FPGAに落として⾼速化したい部分• ホスト︓カーネルにデータを送る部分
25ホストプログラム
DDR3 SDRAM x 2DDR3 SDRAM x 2
PCI Express (+DMAとか)
ここらへんの⾯倒なHWはBSPで提供
カーネル
FPGA
PC
カーネルを書くにあたって…• Altera OpenCL Design Exampleshttps://www.altera.com/support/support-resources/design-examples/design-software/opencl.html
OpenCL meets FPGA #1 ⼊⾨編http://qiita.com/iitaku/items/6c20ebb1099e595f3371
• OpenCL meets FPGA #2 最適化編http://qiita.com/iitaku/items/e114272fe4235baaa9b2
• FPGA Channelizer Design in OpenCLhttps://www.altera.co.jp/content/dam/altera-www/global/en_US/pdfs/support/examples/download/exm_opencl_channelizer.pdf
• Altera SDK for OpenCL Best Practices Guidehttps://www.altera.com/content/dam/altera-www/global/en_US/pdfs/literature/hb/opencl-sdk/aocl_programming_guide.pdf
• OTB Transnational Inc., BittWare Developper’s Bundleを使ったAltera OpenCL SDKによるFPGA開発の紹介
http://www.slideshare.net/nabesan
26
FPGAに適した計算法• ×ホストやオフチップメモリを頻繁にアクセス
• GPUやCPUと⽐較して帯域が1桁狭い• ○外部I/Oやオンチップメモリを利⽤
FPGAFPGA
||||||||
DDRDDR
DDRDDR
I/OI/O I/OI/O
FPGAFPGA
||||||||
DDRDDR
DDRDDR
I/OI/O I/OI/O
ADC
RAM
ここに依存するアプリだと負け
プログラミングモデルの違い
28
D1 D2 D3 D4 D5
↓ ↓ ↓ ↓ ↓
CC CC CC CC CC
↓ ↓ ↓ ↓ ↓
広帯域
DDR4/DDR5 DDR3
HW1 D1 D2 D3 D4
HW2 D1 D2 D3 D4
HW3 D1 D2 D3 D4
HW4 D1 D2 D3 D4
狭帯域
GPU FPGA
• 均⼀な演算を空間的に並列実⾏• 均⼀な演算器• ワープダイバージェント (if⽂ダメ)
• 帯域・動作周波数が⾼い
• 特定な演算を時間的に並列実⾏(要はパイプライン︕)
• カスタマイズした演算器• 帯域・動作周波数は低い
FFTのカーネルを書いた• __kernel を関数の前につけるとか#pragma unrollとかをつける• ⾃前で書いたのだが、サンプルがあることに気付く…
https://www.altera.co.jp/support/support-resources/design-examples/design-software/opencl/fft-1d.html
• エミュレータの動作が⼀致したからいっか• エミュレータ: CPUでFPGAの動作を模倣する
$aoc -march=emulator (カーネルコード).cl↓ (カーネルコード名).aocx が⽣成されるので$make を叩いてホストをコンパイル↓ (デフォルトではbinディレクトリが⽣成されるので移動)$cp ../(カーネルコード名).aocx ./$env CL_CONTEXT_EMULATOR_DEVICE_ALTERA=1 ./(カーネルコード名)
29エミュレータだけなら時間かからないよ
FFTを動作させるホストを書く• フルスクラッチは恐らく無理…
• Alteraのサイト(Design Example)を落として書換えましょうhttps://www.altera.co.jp/support/support-resources/design-examples/design-software/opencl/opencl.html
• お作法は基本的に本家のOpenCLと同じ• たまにAltera OpenCL特有の記述がある• 関数や型の前にclをつける• カーネルを動かす前後に⾊々関数を呼び出す(結構⾯倒…)• ホスト内部の同期はイベントで管理• ココ(↓)がよくまとまってわかりやすかったです
C#でOpenCL⼊⾨チュートリアル⼀覧http://memeplex.blog.shinobi.jp/opencl/
30
開発⾵景
31
VMWare Player上のUbuntu14.04LTSで
aoc -march=emulatorを実⾏
分光器の動作確認はターミナル上の数値と
Gnuplotによるスペクトルで確認
積算1回
積算50回
積算200回
テスト信号として⽩⾊雑⾳に800Hzと4kHzの信号を⽤意
ホストとカーネルが正しくかけていればチューニングへ
性能チューニング• FPGAで早く動作させたいっ…• #pragma unroll指定っ…• 論理合成や配置配線に時間がかかるからHDLを吐いた時点でのHW量を⾒積もりっ…$aoc -g -v -c --report fft.cl-g: プロファイル情報を含んでコンパイル-v: コンパイル進捗状況をレポート-c: HDLを吐いた時点で停⽌--report: HW量⾒積もり表⽰ (なくてもログファイルに出⼒される)
32
…。
33メモリ利⽤率1423%wwwwww
現実(しょぼいボードを使っていること)を受け⼊れよう• 性能チューニングを諦めてHW量を減らす⽅向へ
• どこがボトルネック︖メモリ量なのでFFT内部が怪しい$aoc -c -v -g --report fft1d.cl $aocl vis fft1d.aoco (←オプション-cで⽣成する中間ファイル)
34
カーネルのどのレジスタがどのメモリにアクセスしているか
視覚的に⾒える
カーネルのレジスタのサイズ
該当するコードを表⽰(超重要︕︕)
メモリを減らすには• #pragma unroll → #pragma unroll 4とかに変更
• 展開量を制限• double2 とかを float2 や int2 に変更
• ※float2 というのはベクトル型で, FFTは複素数を扱うので便利• float2 val; と宣⾔すれば, val.x, val.y アクセスできる
• アルゴリズムを⼯夫する
35
近似計算の利⽤• FFTの計算→回転因⼦(三⾓関数)の乗算
• sin(), cos()関数の利⽤ → 遅い• プレコンピューティング → メモリバカ⾷い• 線形⼀次近似法を利⽤ → 早くてメモリ⼩・ただし低精度
36
88
08 WW
18W
28W
38W
48W
58W
68W 7
8WImaginary
Real
WNnk e
j 2N
k
cos 2N
k j sin 2
N
k
三角関数の性質を利用
メモリ量の削減
37‐1.5
‐1
‐0.5
0
0.5
1
1.5 COS(2piX) SIN(2piX)
Shift the phase
PointSymmetry
Computethe firstquadrant
Piecewise Linear Approximation• 定義域xをセグメントに分割• 各セグメントを⼀次関数(y=ax+b)で近似→aとbのみメモリに格納• Example: Linear approximation of cos(x)
38
Seg1=-1.35925x+1.010063
Seg2=-3.30703x+1.126829
Seg3=-5.14436x+1.342521
Seg4=-6.16934x+1.542548
0
0.002
0.004
0.006
0.008
0.01
0.012
0.014
0.016
0.018
0
0.2
0.4
0.6
0.8
1
1.2
0.0
00
0.0
14
0.0
28
0.0
42
0.0
56
0.0
70
0.0
84
0.0
98
0.1
12
0.1
26
0.1
40
0.1
54
0.1
68
0.1
82
0.1
96
0.2
10
0.2
24
0.2
38
cos(2πx) Approximation Error
Err
or
cos(
2π
x)
係数テーブル• 傾きaと重みbをメモリに格納• if⽂で選択
39
Input Outputa b
0.000 -1.35925 1.010063
0.0624 -1.35925 1.0100630.0625 -3.30703 1.126829
0.1249 -3.30703 1.1268290.1250 -5.14436 1.342521
0.1874 -5.14436 1.3425210.1875 -6.16934 1.542548
0.2499 -6.16934 1.542548
0
0.002
0.004
0.006
0.008
0.01
0.012
0.014
0.016
0.018
0
0.2
0.4
0.6
0.8
1
1.2
0.0
00
0.0
14
0.0
28
0.0
42
0.0
56
0.0
70
0.0
84
0.0
98
0.1
12
0.1
26
0.1
40
0.1
54
0.1
68
0.1
82
0.1
96
0.2
10
0.2
24
0.2
38
cos(2πx) Approximation Error
Err
or
cos(
2π
x)
とりあえずうごいた︕
40
今回の開発フロー
41
分光器のモデルをCで記述
Kernel, hostコードに書き直し, HDL生成
$aoc ‐g ‐v ‐‐report ‐c xxx.cl
OpenCL エミュレーション
論理合成, 配置配線(ビットストリーム生成)
$aoc xxx.aoco
実機動作確認
1時間
3~4時間
1時間
Kernel チューニング$aoc ‐g ‐v ‐‐profile xxx.cl
性能を満たす?
No
Yes
動いた︕
• チューニング前に⼀度実機で動作させておく
実⾏時間の⽐較• FFT点数: 64• FPGA動作周波数: 217MHz
42
0.18 0.43 4.29
42.89
0.37 0.36 1.47
13.00
0.00
5.00
10.00
15.00
20.00
25.00
30.00
35.00
40.00
45.00
50.00
10 100 1000 10000
CPU CPU+FPGA
積算回数
実⾏
時間
[mse
c]
思ったほど速くないねw
考察• オンチップRAMによる積算処理
• PCIe通信量削減
43
FPGAFPGA
||||||||
DDRDDR
DDRDDR
I/OI/O I/OI/O
RAM
まとめ• Altera OpenCLを使って分光器を作った
• インストール&環境構築︓約2週間• OpenCLの勉強と使い⽅︓約1週間• Cで分光器を書いた時間︓約1時間• OpenCLに書き直して動作︓約1⽇(←ここ重要︕)• 【参考】フルHDLによる設計︓約1ヵ⽉〜2ヵ⽉• 【参考】Matlab/Simulinkによる設計︓約2週間
• CPUと⽐較して数倍⾼速, まだ速くなりそう• ほとんどチューニングしてないので…
• 今後の展開• 論理合成の時間を短縮したい(LogicLockを使う︖)• HDLを吐いた時点で⼤体の速度を⾒積もりたい• (同上) で各ブロック毎のHW量を⾒積もりたい
44