先日、CodeLunchというpodcastの収録へ行ってきました。
本職はスマフォアプリをC++で書いてる(書けるとは言っていない)とかそのへんなのですが、ハードの話をしようということでFPGAの話をしてきました。
Beatroboの竹井さんに随所で助けてもらいつつ、どうにかこうにか喋れた気がしますが、元々専門ではないエリアなので間違ってること喋ってるかも、という不安もありつつでした。
そういうわけで収録後に周辺情報を補足する資料を書こうと思って書いたのがこれです。
なんでFPGAが注目されてるの?という話
Field Programmable Gate Array
どういうところで注目されてる?
1: 金融取引
http://www.hpcwire.com/2011/07/13/jp_morgan_buys_into_fpga_supercomputing/な話
金融取引でスピードは大事という話
- podcastでは実際の想定利用シーンとしてアービトラージ(裁定取引)の話をしてる
- 補足: 実際にはデリバティブでの利用だったか
- 改めて読むと流れてくるデータの正規化あたりが発端だったらしい
- 途中で制御の必要ないような計算モデルにしている
- 500段ぐらいのパイプラインを組んでるというのが2011年ぐらいの記事にあった
- http://techon.nikkeibp.co.jp/article/NEWS/20110502/191552/?rt=nocnt
- モンテカルロ法でのリスク評価に使ってるよという話
- 価格情報が届いた瞬間に発注してしまう
- 補足: FPGAでの完全自動トレードは比較的新しい領域
- 補足: メモリアクセスが頻繁に発生するとやはり遅いので、いかにこれを避けられる用途に絞るかというところにはなるはず
CPUに届く前にやろう
- 補足: どちらかというとCPUに対して予め処理しやすい形式へと速やかに変換して値を渡すような部分がメイン(前出)ということで、話したのは少々飛ばしすぎたかもしれない
早さ大事という話
- 金融取引所の近くにサーバを配置
- 大西洋の海底ケーブルを新たに敷設して他社より有利に取引をおこなうという話
- 補足: 通信を 6 ミリ秒縮めるための海底ケーブル 、3 億ドルかけて敷設へ
- http://www.bloomberg.com/bw/articles/2012-03-29/trading-at-the-speed-of-light
- ニューヨークからロンドンまでの通信を64.8msから59.6msへと縮める新ケーブル(敷設費用$300M)
- 記事の通りだと2013年には開通しているはず
- Project Express
- このプロジェクトは遅延したのか、なんとタイムリーに2015年夏(9月)に開通という話
- http://www.bloomberg.com/bw/articles/2012-03-29/trading-at-the-speed-of-light
価格情報配信ってどれぐらい安定してる?
- NYSEの価格配信遅れの話
- 補足: 改めて調べると、これは証券会社によって差が生じたことに対するペナルティだった
- 純粋な価格情報遅延によるペナルティを受けたことはないぽい?調べきれなかった
金融関係のアルゴリズムってそんなに複雑じゃない?という疑問
- 学習部分にコストが大きくかかって、それに基づく発注はさほど重くないのではという話をしたけど成否は定かでないので各位調べてください(すいません)
- 比較的最近のふわっとまとめ記事: http://www.eetimes.com/author.asp?section_id=36&doc_id=1323278(読む)
補足: フラッシュトレード絡みだとフラッシュ・クラッシュ
Flash Crashについては別途ちゃんと読もう
- http://en.wikipedia.org/wiki/2010_Flash_Crash
- このへんの話
- http://jp.wsj.com/articles/SB11350573174384774502804580595153927093416
- めっちゃ最近(収録後)、この件で逮捕者が出た
- 意図的に起こしてたという話
2. FPGAで機械学習
MSのBing(補足: 2014年末時点では本番環境へ投入されていなかったけれど、そろそろ?)
ページランクみたいなやつに使い始めた
- http://qiita.com/kazunori279/items/6f517648e8a408254a50
- 例によってかずのりさん
- 安定のかずのりさん
- 補足: しっかりまとまってたので読み返そう
- ランク付けをFPGAで
- サーバ台数を半分ぐらいに減らせたよ
- ランキングアルゴリズムは普遍的だから?→スパム対策などでよく更新されるということなのでは
- 完全にハード化すると数ヶ月ごとにハードを捨てないといけなくなって辛い
- だからFPGAなんじゃないかな(推測)
ほかの用途
- 画像処理。最近は展示会などでも車載用が押されてる
- カメラの中の画像処理にFPGAを使うとかもあった
- 画像のフィルタリングに使われる
- FPGAだと作り付けの回路よりも書き換えの手間が発生する
- カメラの中身に、とか
- 補足: http://japan.xilinx.com/japan/j_prs_rls/2011/fpga/spartan-6-in-46-megapixel-digital-slr.htm
- 調べるとSIGMAから出ててびびった(2011年)
- コストダウン面よりはハイエンド寄りということで、喋っていた方面とは一致している
FPGAってどうやって焼く?の
- コンフィグROMから読み出すよ
- 起動時にコンフィグ
- 補足: なおZynqとかだと起動後に別途コンフィグもできる
FPGA 基礎の基礎
論理の表現
- 図とかなしにどう説明しようかなと思い
- すごく雑に仕組みを説明すると、カンペ+メモ帳
- AND回路とかOR回路とかふんわり分かればFPGAの仕組みは分かります
- ANDは、全部の入力が1の場合のみ1を出す、それ以外は0
- ORはどれか1つでも1だったら1を出す
- NOTは入力が1なら0を、0なら1を出す
- これをFPGAはカンペで実現する
- まずはとても単純な、1値の入力で1値の出力をおこなうものから考える
- NOTをあらわすカンペには1→0 0→1と書いておく
- 2値以上でも基本は同じ
- 2値のANDなら0・0→0、0・1→0、1・0→0、1・1→1というカンペを書いておく
- 6値の入力から1bitの出力を作る、と考えると64パターン。結構複雑な回路が作れる
フリップフロップ
- (フリップフロップ、一度手組でもしないと自分の中のイメージきちんと固まらないのでは)
- 要はメモリです。次のクロックが来たタイミングで、つながってる先へと値を渡す役割を持ちます
配置配線
- ゲート数がいっぱいあればいい感じに動く?動かない
- 配線が大事になる
- FPGAのクロックはナノ秒単位
- あるユニットから他のユニットへどれぐらいの時間で信号が届くかが大事になる
- 配線が異常に長い部分ができると、その信号が到達するのを他の部分で待つ必要が生じる
- クロックを落とせばいいけれど、そうするとシステムの動作速度が下がってしまう
- どこのゲートにつなぐか(配置配線)はFPGAベンダーのツールでやる
- 書き方によって生成される配線も変わる
- ここは職人芸(経験とカン)
FPGA上にあるロジックセル
- 数は200万とかある
- Flip-Flopでも消費されたりする(SRAMとして使ったり)。小規模なものならいくつか入れられたりする
- 全部をプリミティブに組むのはあまり効率が悪い
- 加算処理をする専用の回路とかが予め含まれるようになってきている
- キャリーフラグなども流せる
Alteraがここしばらく(数年)力を入れてきたFPGA上の最適化
- ロジックセルは8値の入力から2値の出力というのが基本セット
- これを4値入力1値出力 2セットというふうにも使えるようになっている
- 補足: 限られたロジックセルを有効に使って柔軟に回路構築をできるというウリ
- 考えてみると、ここの最適化を人力でやるのは非常につらい
- 他のベンダーがいきなり入ってきてちゃんとしたツールセットを提供するのもむずい
論理合成・配置配線
- 最適化問題。むずい
- 肌感覚、割と単純な回路でもMacBook Proで4-5分とか合成/配置配線にかかる
- 複雑なのを作りたければ高いの買え的な?
- 同じアーキテクチャ世代でも回路規模によって値段が全然違う
- 回路規模が大きくなると合成も時間がかかりすぎて個人では無理なのでは?
- ツールのお高い版には分散処理をする仕組みが含まれていたりするらしい
- ツールはFPGAボードごとに別? → XilinxとAlteraでそれぞれ1種類ずつ持っている
プログラムを書いて合成していく
- VHDLとかVerilogとかで書く
- アセンブリ言語なイメージ
- コードが上から順に実行されるわけではない
- あるブロックをまとめて実行する
- この性質を使って、パラレルにできる部分はパラレルにする
- 例えば16個の入力それぞれに4ずつ値を足すような処理は、それだけ分の回路を割り当てれば同時に処理できる
- FPGAで高速化できるパターンの半分ぐらいはこれだと思う(主観)
- 行列計算とかいい感じにできる
- ハードウェアとソフトウェアのいいとこ取りができるエリア
FPGAつらい話
- VHDLやVerilogでいきなりBingのランキング処理書け!とか言われてもつらい
- Xilinxのツール、生成した回路の中でネックっぽい場所は見つけてくれる
- VHDLやVerilogはアセンブリ言語みたいな立ち位置、これで大規模なアプリを作るのは辛い
FPGAのざっくり開発工数
- より高級な言語で書けばいいのでは?という感じもする→後で出てくる
- Xilinxの人による2012年の講演資料: FPGA 2032 Roadmap: A Personal Perspective
- CPUだと1時間で書けるような処理にFPGAだと1週間ぐらいかかる。その段階で1時間かけて作ったコードの4倍ぐらい速い。いっぽうCPU側も1週間ほど続けると更に4倍速いあたりになる
- FPGAを採用してうまみのある部分は数ヶ月間かけてチューニングしていくようなもの
- 最初の立ち上げはCPUで書いて、後から時間をかけて最適化していくのにFPGAを使うなどがモデルとして良さそうという話
- 「相当なコストをかけても、それだけのリターンがあれば使いたい」という領域にしか当初は使いにくい→最たるものが金融
- 細かく辛いところ: コンパイルに時間かかる
- 多少コード書き換えてコンパイルし直しに5分とかかかると辛い
OpenCores
- 開発効率がなかなか上がらない点は、再利用可能な部品がいっぱいあると効率よくなるかも
- OpenCoresというプロジェクトではIPを公開している
GPUを使う話
- GPGPUとかGPU Computingというエリア
- さきの資料、1週間ぐらいかけてできるFPGA実装よりも4倍ぐらい速い状態(CPU実装の1週間分あたり)が、GPUだと2日程度でできるよという話
- 最終的にスケールする度合いもFPGAと結構近いとされている
- FPGAほど辛いことやらなくても良いかも
- GPUでいいんじゃない?ってなる
高位合成
- FPGA向けのハードウェア設計をもっと書きやすい言語で書けるようにする
- CとかからFPGAのデザインを作るのを高位合成と呼ぶ
- ここがホットなエリア
- ものによってはCで書かれたコードをなるべく並列化して最初のデザインを仕上げるというもの
- 竹井さん: 以前やったところだとSystemC、変換効率がさほどよくなかった
- 竹井さん: VHDLを書いていると「こんだけ書いたのにまだこれだけしか動かない」となる
- ボトルネック部分を手動で頑張るような感じになると良い
- Pythonの拡張みたいな感じ
- そういえばPythonからの高位合成を研究している
- XilinxのツールセットでもVivado HLSというのがある
- 25万円ぐらいのエディションでないと使えない
- Lavaあたりで論理合成を先にやってしまって、実際のFPGAボードにあわせた配置配線だけXilinxあたりのツールでやるとかも現実的かもしれない
- 補足: ここは、IP-XACT(IEEE 1685)あたりで書きだしたものを各種ツール側でインポートするのを想定している
開発環境
- 今は開発しているコードの情報などをXilinxやAlteraへと共有する(これを売り渡すと表現している)代わりに無料で使える範囲が大きい
- XilinxのSUZAKUというシリーズを使っていた。これには1年分のライセンスがくっついてきてた
- Zynqも似た感じ
高位合成が普通になると、FPGAはGPGPUと張り合える?
- 基本的には両方が選択肢になるのではと思っている
- FPGAとGPU、少々特性が違う
- GPUにもつらさがある
- GPUで処理するためにメインメモリからデータを転送し、GPUでの処理を終えてからCPU側へ引き上げるのにレイテンシがかかる
- このコストを上回るほどGPGPU側の処理が速ければペイする?というのを考える必要がある
- GPUで処理するためにメインメモリからデータを転送し、GPUでの処理を終えてからCPU側へ引き上げるのにレイテンシがかかる
GPU側も進化していっている
- GPUも進んでいるエリアがある。CPUとGPUを統合する向きにある
- AMDだとAPU(Accelerated Processing Unit)と呼ばれる
- CPUメモリとGPUメモリを統合する向き
- CPU側とGPU側のメモリをリニアに共有する形になっている
- CPU側でデータを作り、GPUには場所だけを伝えるとGPU側から直接データを読み出して処理、結果アドレスをCPUへ返して直接利用できるようになっている
- AppleのA7あたりでも似た話
- Metalは描画コマンドの送り方が違うなどの他にも、CPUから書き込んだメモリをGPU側で直接読み出して処理するようなモデルが整備されている
- GPU統合CPUというモデルがハイエンド化していくのでは
- これまでは安いノートPC用というイメージだった
- メインメモリの一部をGPUに割り当てていたが、従来だと垣根があった
- GPUも進化している
- FPGA一人勝ちという感じはしない
FPGAとCPUがミックスされたようなもの
- 昔だとFPGAの中に小さなCPUコアを構築する形だった
- 最近は逆、というか普通にARMのCPUが載っていて、それに加えてFPGAも載っている形のものをXilinx(補足: Zynq)もAltera(補足: FPGA & SoC)も出している
- ARMのCPUに自分で拡張命令を実装して、それを普通にLinuxなどから呼び出せる
- 中澤が最近やっているのはARMv8に載っている拡張命令をFPGA側に実装してARMv7でも使えるようにするというもの。なかなかパフォーマンス上がらない
- どこから手を付けて良いかよくわからず、ツールの使い方で苦労した
- 数十年間練られてきたツールだけに、慣れないとなかなか効率があがらない(補足: PlanAhead+Vivadoで15年ぐらい?)
竹井さん: FPGA学習の仕方 / Design Wave
- FPGAな人向けのやつ
- 最近のツールの使い方とか説明してた
- 最近だとFPGA Magazine
- Design Wave 2009年の最終号
- (ここで主要トピックが「Cベース設計の時代がやってきた」となってたあたりがとても趣深い)
- もう10年ぐらい前だと、5万円でめちゃくちゃショボいボードを買って触ってた
- ucLinux(MMUの要らないもの)をMicroBlazeで動かしていた
- 秋月で売ってた液晶を買ってきてコア拡張した部分の物理アドレスへデータを書き込んで画面表示する
- 大学の研究室で、ディスプレイ出力とか諸々全部含めてシューティングゲームを作る的なのやってるひといた
- 敵のスプライトを移動させるとかそういう処理も
- 大学の演習でCPU作るところからやるのとかあるという話
クロージング: まずはここから
- 最近話題になっていた$30のボードがあるのでそれで($30で始めるFPGAが素晴らしい資料)
- 8000ロジックエレメントでできることを考える
- 飯塚さんが小さなCPUを作るのを目標にする
0 件のコメント:
コメントを投稿