電波望遠鏡用の分光器をaltera sdk for opencl使ってサクッと作ってみた

44
電波望遠鏡⽤の分光器を サクッと作ってみた 中原啓貴 (東京⼯業⼤学) @oboe7man 1

Upload: hiroki-nakahara

Post on 13-Apr-2017

1.757 views

Category:

Engineering


0 download

TRANSCRIPT

Page 1: 電波望遠鏡用の分光器をAltera SDK for OpenCL使ってサクッと作ってみた

電波望遠鏡⽤の分光器をサクッと作ってみた

中原啓貴 (東京⼯業⼤学)@oboe7man

1

Page 2: 電波望遠鏡用の分光器をAltera SDK for OpenCL使ってサクッと作ってみた

⾃⼰紹介• Hiroki Nakahara• @oboe7man• 東京⼯業⼤学 准教授• ビール解禁• クラシック⾳楽(演奏側)• ⾼位合成にシフト中

• Altera OpenCL歴約半⽉• Vivado HLS歴約10か⽉

2

Page 3: 電波望遠鏡用の分光器をAltera SDK for OpenCL使ってサクッと作ってみた

Custom Computing Machine

3

Multi‐valued logic Pattern matching circuit• Regular expressionmatching circuit

• Packet classifier• IP address look‐up

40m

Radio telescopeDeep neural network

Page 4: 電波望遠鏡用の分光器をAltera SDK for OpenCL使ってサクッと作ってみた

たまーに…

4

暇人だなぁ…

Page 5: 電波望遠鏡用の分光器をAltera SDK for OpenCL使ってサクッと作ってみた

電波望遠鏡

5

45m

AirBUS A321

44.51m

53m

Page 6: 電波望遠鏡用の分光器をAltera SDK for OpenCL使ってサクッと作ってみた

SKA (Square Kilometer Array)

6

Page 7: 電波望遠鏡用の分光器をAltera SDK for OpenCL使ってサクッと作ってみた

分光器

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

Page 8: 電波望遠鏡用の分光器をAltera SDK for OpenCL使ってサクッと作ってみた

Next Generation of “ROACH”

8

Net FPGA Sume(Virtex7 FPGA)

FMC-ZDOCConnector

CASPER ADC1.3(5Gsps)

はみ出し!!

Page 9: 電波望遠鏡用の分光器をAltera SDK for OpenCL使ってサクッと作ってみた

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

Page 10: 電波望遠鏡用の分光器をAltera SDK for OpenCL使ってサクッと作ってみた

要求スペック

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]

Page 11: 電波望遠鏡用の分光器をAltera SDK for OpenCL使ってサクッと作ってみた

分光器の構成

11

ADC

BRAM

FFT Magnitude

WindowCoefficient

Data from

 Antenna

Power Spe

ctrum

FFT

FFT

Magnitude

Magnitude + Reg.

+ Reg.

+ Reg.

窓関数 FFT 積算処理

Page 12: 電波望遠鏡用の分光器をAltera SDK for OpenCL使ってサクッと作ってみた

窓関数

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

Page 13: 電波望遠鏡用の分光器をAltera SDK for OpenCL使ってサクッと作ってみた

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

Page 14: 電波望遠鏡用の分光器をAltera SDK for OpenCL使ってサクッと作ってみた

積算処理

14

ADC

BRAM

FFT Magnitude

WindowCoefficient

Data from

 Antenna

Power Spe

ctrum

FFT

FFT

Magnitude

Magnitude + Reg.

+ Reg.

+ Reg.

14Frequency

Power

Power

Frequency

Page 15: 電波望遠鏡用の分光器をAltera SDK for OpenCL使ってサクッと作ってみた

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

俗にいうモデルベース開発ネ

Page 16: 電波望遠鏡用の分光器をAltera SDK for OpenCL使ってサクッと作ってみた

問題点• とーにかくシミュレーション・合成が遅い

• MATLABベースですので…• 修正が⾮常にだるい…

• 今どきパイプラインレジスタを⼿で挿⼊してるんですよ︕• 新しいブロックを作るのが⾯倒、というかHDL書かないと

• とくにループが超⾯倒(LabViewのときにトラウマ経験)

16

Page 17: 電波望遠鏡用の分光器をAltera SDK for OpenCL使ってサクッと作ってみた

そこで⾼位合成• 今回はAltera社OpenCLを採⽤

• HDL書いてたんじゃ間に合わない…(最近来た依頼︓Rスクリプトを3⽇以内にHWに落として︕)

• Vivado HLSだと、ロジック周辺回路(特にDDR3, Etherとか)のサポートが厳しい…

• Altera OpenCLだとBSP(Board Support Package)が提供されてれば周辺回路を設計する必要なし

• 研究室に⼊ってくる学⽣にHDLを教える⼿間が省ける

17楽したいだけじゃん

Page 18: 電波望遠鏡用の分光器をAltera SDK for OpenCL使ってサクッと作ってみた

= $ !?ハードルが…• ⾼性能PC

• とにかくメモリが必要 (32GB以上)• ツールライセンス

• Quartus II• Altera OpenCL

• BSPが提供されているボードの⼀例

18

Donation多謝!

TerasicDE5‐NET

TerasicDE1‐SoC

Nallatech385A

GiDELProc V

Page 19: 電波望遠鏡用の分光器をAltera SDK for OpenCL使ってサクッと作ってみた

たまたま︕

19あれ!︖

Page 20: 電波望遠鏡用の分光器をAltera SDK for OpenCL使ってサクッと作ってみた

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

Page 21: 電波望遠鏡用の分光器をAltera SDK for OpenCL使ってサクッと作ってみた

(これ→にあわせて)環境構築

• 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

Page 22: 電波望遠鏡用の分光器をAltera SDK for OpenCL使ってサクッと作ってみた

ポイント①• CentOSはPCI Expressのドライバが…

• カーネルのバージョンまで合わさないといけなかったのでCentOS 6.4に

• Ubuntu だとPCIドライバのコンパイルで失敗orz• 添付のコンフィギュレーションをUSB Blaster経由でボードに書いて電源を⼀度落とす(再起動だとダメ︕)

• パワーサイクルしないとPCIとして認識してくれなかった…• ディップスイッチはデフォルトのままでおk• Quartus II, OpenCLのインスコは特に問題なし• 仮想環境へのインストールはお勧めしません…

• ただし、シミュレーションまでならインストールしてもいいかも

22詳細は後⽇公開するんだってよ

Page 23: 電波望遠鏡用の分光器をAltera SDK for OpenCL使ってサクッと作ってみた

ポイント②• 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

Page 24: 電波望遠鏡用の分光器をAltera SDK for OpenCL使ってサクッと作ってみた

とりあえず設計開始• まずはアクセラレーションしたい部分をCで書く…

(といいつつ、ほとんどネットを参考にしました)• 【所要時間】1時間位

(gnuplotのインストールに時間がかかったorz)

24

Win8.1のエディタでコードを書いてVMWare Player上のUbuntu14.04LTSのgccで開発(なんてややこしい…)

Page 25: 電波望遠鏡用の分光器をAltera SDK for OpenCL使ってサクッと作ってみた

Cソースを元にAltera OpenCLの設計開始• カーネル+ホストで構成

• カーネル︓FPGAに落として⾼速化したい部分• ホスト︓カーネルにデータを送る部分

25ホストプログラム

DDR3 SDRAM x 2DDR3 SDRAM x 2

PCI Express (+DMAとか)

ここらへんの⾯倒なHWはBSPで提供

カーネル

FPGA

PC

Page 26: 電波望遠鏡用の分光器をAltera SDK for OpenCL使ってサクッと作ってみた

カーネルを書くにあたって…• 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

Page 27: 電波望遠鏡用の分光器をAltera SDK for OpenCL使ってサクッと作ってみた

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

ここに依存するアプリだと負け

Page 28: 電波望遠鏡用の分光器をAltera SDK for OpenCL使ってサクッと作ってみた

プログラミングモデルの違い

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⽂ダメ)

• 帯域・動作周波数が⾼い

• 特定な演算を時間的に並列実⾏(要はパイプライン︕)

• カスタマイズした演算器• 帯域・動作周波数は低い

Page 29: 電波望遠鏡用の分光器をAltera SDK for OpenCL使ってサクッと作ってみた

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エミュレータだけなら時間かからないよ

Page 30: 電波望遠鏡用の分光器をAltera SDK for OpenCL使ってサクッと作ってみた

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

Page 31: 電波望遠鏡用の分光器をAltera SDK for OpenCL使ってサクッと作ってみた

開発⾵景

31

VMWare Player上のUbuntu14.04LTSで

aoc -march=emulatorを実⾏

分光器の動作確認はターミナル上の数値と

Gnuplotによるスペクトルで確認

積算1回

積算50回

積算200回

テスト信号として⽩⾊雑⾳に800Hzと4kHzの信号を⽤意

ホストとカーネルが正しくかけていればチューニングへ

Page 32: 電波望遠鏡用の分光器をAltera SDK for OpenCL使ってサクッと作ってみた

性能チューニング• FPGAで早く動作させたいっ…• #pragma unroll指定っ…• 論理合成や配置配線に時間がかかるからHDLを吐いた時点でのHW量を⾒積もりっ…$aoc -g -v -c --report fft.cl-g: プロファイル情報を含んでコンパイル-v: コンパイル進捗状況をレポート-c: HDLを吐いた時点で停⽌--report: HW量⾒積もり表⽰ (なくてもログファイルに出⼒される)

32

Page 33: 電波望遠鏡用の分光器をAltera SDK for OpenCL使ってサクッと作ってみた

…。

33メモリ利⽤率1423%wwwwww

Page 34: 電波望遠鏡用の分光器をAltera SDK for OpenCL使ってサクッと作ってみた

現実(しょぼいボードを使っていること)を受け⼊れよう• 性能チューニングを諦めてHW量を減らす⽅向へ

• どこがボトルネック︖メモリ量なのでFFT内部が怪しい$aoc -c -v -g --report fft1d.cl $aocl vis fft1d.aoco (←オプション-cで⽣成する中間ファイル)

34

カーネルのどのレジスタがどのメモリにアクセスしているか

視覚的に⾒える

カーネルのレジスタのサイズ

該当するコードを表⽰(超重要︕︕)

Page 35: 電波望遠鏡用の分光器をAltera SDK for OpenCL使ってサクッと作ってみた

メモリを減らすには• #pragma unroll → #pragma unroll 4とかに変更

• 展開量を制限• double2 とかを float2 や int2 に変更

• ※float2 というのはベクトル型で, FFTは複素数を扱うので便利• float2 val; と宣⾔すれば, val.x, val.y アクセスできる

• アルゴリズムを⼯夫する

35

Page 36: 電波望遠鏡用の分光器をAltera SDK for OpenCL使ってサクッと作ってみた

近似計算の利⽤• 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

三角関数の性質を利用

Page 37: 電波望遠鏡用の分光器をAltera SDK for OpenCL使ってサクッと作ってみた

メモリ量の削減

37‐1.5

‐1

‐0.5

0

0.5

1

1.5 COS(2piX) SIN(2piX)

Shift the phase

PointSymmetry

Computethe firstquadrant

Page 38: 電波望遠鏡用の分光器をAltera SDK for OpenCL使ってサクッと作ってみた

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(

x)

Page 39: 電波望遠鏡用の分光器をAltera SDK for OpenCL使ってサクッと作ってみた

係数テーブル• 傾き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(

x)

Page 40: 電波望遠鏡用の分光器をAltera SDK for OpenCL使ってサクッと作ってみた

とりあえずうごいた︕

40

Page 41: 電波望遠鏡用の分光器をAltera SDK for OpenCL使ってサクッと作ってみた

今回の開発フロー

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

動いた︕

• チューニング前に⼀度実機で動作させておく

Page 42: 電波望遠鏡用の分光器をAltera SDK for OpenCL使ってサクッと作ってみた

実⾏時間の⽐較• 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

Page 43: 電波望遠鏡用の分光器をAltera SDK for OpenCL使ってサクッと作ってみた

考察• オンチップRAMによる積算処理

• PCIe通信量削減

43

FPGAFPGA

||||||||

DDRDDR

DDRDDR

I/OI/O I/OI/O

RAM

Page 44: 電波望遠鏡用の分光器をAltera SDK for OpenCL使ってサクッと作ってみた

まとめ• Altera OpenCLを使って分光器を作った

• インストール&環境構築︓約2週間• OpenCLの勉強と使い⽅︓約1週間• Cで分光器を書いた時間︓約1時間• OpenCLに書き直して動作︓約1⽇(←ここ重要︕)• 【参考】フルHDLによる設計︓約1ヵ⽉〜2ヵ⽉• 【参考】Matlab/Simulinkによる設計︓約2週間

• CPUと⽐較して数倍⾼速, まだ速くなりそう• ほとんどチューニングしてないので…

• 今後の展開• 論理合成の時間を短縮したい(LogicLockを使う︖)• HDLを吐いた時点で⼤体の速度を⾒積もりたい• (同上) で各ブロック毎のHW量を⾒積もりたい

44