SANMAN

思いつきの考えを垂れ流すブログ

Microsoft BingのFPGAアクセラレーションについて学ぶ 2

の続き。

FPGA内部回路に関しては実のところあまり細かな部分に注目しすぎてもしょうがないところがある。

なぜならFPGAは内部リソースに対して好きな回路を構成できるから。

FPGA内部回路設計者にとってはアプリケーション実装例は参考にはなるが、あくまでMicrosoftのアプリケーションの場合だし、「如何にし大規模データセンターでのFPGAアクセラレーションを実用的にしたのか」についての関係性は低いと思う。
容易に変更できないFPGA自体のハードウェアアーキテクチャと、基板上の制限が重要。つまりFPGAの選定と基板設計。ユーザーロジックの規模、PLL、DSP、内部RAMをどれだけ用意するか、FPGA外部に何をどれだけ繋ぐか。これらによってFPGA内部リソースの使い方の制限や方向性が出てくる。

ShellとRoll

FPGAを大きく2つにわけた。

f:id:tkysktmt:20141214142106p:plain

特別にすごい工夫はなくどちらもいたって普通。
ShellのPCIeをいじったのと独立かつデュアルな構成のDRAMコントローラくらいか。

Rollはアプリケーション実現のための処理をする回路を置くスペース。
処理内容によっては1FPGAで完結する事もあるし、複数FPGAに跨ぐ場合がある。
FPGA通信のための内部ルーターと、独立動作可能な2つのDRAMコントローラの3つの接続がされている。

ShellはRollに対して各種基本機能を与えるための回路を置くスペース。
基本機能なので、全FPGA共通の回路。
基本機能としては以下

  • FPGA間通信機能
    FPGA通信用ルーター(クロスバー)、独立したSL3インターフェースx4

  • ホストCPUとの通信機能
    DMAサポートのPCIe(カスタム)、DMAC

  • 外部RAMへのアクセス機能
    DDR3-SDRAMコントローラーx2

  • ハードウェア障害検知機能
    放射線による障害(SEU)、チップ温度モニター(Temp)、SL3経由による他の4FPGAの状態監視

外部RAM(DDR3)はデュアルランク品で667MHz(図の構成)、シングルランク品で800MHzで動作可能。 PCIeはMicrosoftによるカスタムもので、低レイテンシ化のためのシステムコール回避や、スレッドセーフのために64分割のバッファを用意するなど。 PCIe bar空間にマップした各種レジスタによってRollは基本制御されるはずだ。そして処理結果がDRAMの特定領域に保存され、ホストCPUはDMAによりそれを読み出すという使い方となるはず。

Rollはアプリケーションによりがらっと変わるが、Shellはそう簡単に変わらない(変えられない)。なので、Shellは駆動させ続けながら(FPGAルーティング等維持)Rollだけリコンフィギュレーションしてしまおうというのが「パーシャルリコンフィギュレーション」というFPGAが提供するダイナミックリコンフィギュレーション機能の一種。Microsoftはパーシャルリコンフィギュレーション機能に将来的に対応する予定だとか。もうできてるかも。
パーシャルでないダイナミックリコンフィギュレーションは、これはパーシャルのようなエリア指定が無いだけで基本同じ。

ダイナミックリコンフィギュレーション=動的再構成技術はFPGA特有というわけではなく、LSIが提供する技術で最近の注目すべき「1チップあたりの回路規模の問題を解決可能」なヤバい技術だ。アプリケーションに対する消費電力の改善もできたりする。画像処理ASICやら有名どころではSONYPSP Goの部品にも使われていたりと、技術としては実用段階にある。現状では、SRAMベースなFPGAでの動的再構成はLSIにくらべて遅くなる(数十msかかる)ので使い方にはより注意が必要。

これについては別エントリにする。

Microsoft自作のFFEプロセッサ

ハードウェア業界ではFPGA+CPUなシステムというのは割とよくあるシステムなので、NiosIIやMicroBlazeなどのソフトCPUコアIP(ソフトウェアライブラリと思え)をFPGAベンダは提供している。
MicrosoftのFFE処理は、マルチスレッドの浮動小数点演算が必要となる複雑な処理のため、CPUを使おうと思ったがNiosIIのマルチコア化等でも要求を満たせない。 だから特殊な処理回路を作った。

f:id:tkysktmt:20141214183654p:plain

FFEプロセッサは1FPGAに60個詰められる(FFEプロセッサだけの話)ほどの面積効率のよいプロセッサで、これを6コア+共有の特殊演算器(Complex)を1クラスターとして2FPGAに展開。1コアは4つのマルチスレッドに対応でき、共有の特殊演算器 は割り算器やら浮動小数点値の整数値変換など重い演算が入っている。

結論や課題

FPGAを使ったリコンフィギャラブルなコンピューティングシステムは、システム構築の柔軟性が良くスケーラブル。データセンターのコストパフォーマンスを良くしてくれるであろうということがわかった。ただし、リコンフィギャラブルデバイスとしてFPGAが将来も最適である保証はないし、システムも適切な運用が必要だ。
また、現状ではFPGAへのアプリケーションのインプリメントにはRTLなどのHDLに頼らざる得ないなど、開発難易度が高く、スピードが遅い。これの改善。

  • 運用の問題
    今回Microsoftは障害監視や復旧のためのHealth MonitorやMapping Manager、システムデバッグにFlight Data Recorderなどと言ったツールを新たに開発したが、まだ運用法は手探り段階だ。

  • HDLの進化
    端的に言えば高位合成。
    並列化向きなScalaとかC2Gateなど、RTLよりも上位の定義でハードウェアデザインできると良い。
    これはCができるソフトウェアエンジニアでもハードウェアが設計できるようになるというよりも、RTL設計者がC言語で設計できるようになるという感じだろう。 パフォーマンスを求めると結局コンピューティングシステムの充分な知識を要求されるし、なにしろFPGAなどのハードウェア設計技術の学習コストは高いから。
    チューンナップ等でRTLは生き残る感じかな。
    リリースのスピードを早めるという意味では、ハードもソフトも検証技術がより重要となり進化もするだろう。

  • 有用なデザインパターンの蓄積
    これは自身の扱う問題に対するデザインパターンかな。
    汎用的かつ最適な答えを出す回路はFPGAの無駄遣いになりがちなので、ほどほどなHDLデザインパターンをある程度蓄積していきたいのだろう。

  • ソフトウェアのヘテロジニアスなコンピューティングシステムへの対応
    OSやコンパイラなど。
    計算リソースがCPUだけでなくなったため、それを考慮した資源管理やアプリケーションの最適化が求められる。
    大手FPGAベンダも対応しているOpenCLが代表的だ。

  • リコンフィギャラブルコンピューティングシステムへの対応
    OSやコンパイラ、ハードウェアコンポーネントなど。 状況に応じて構成を変更できるコンピューティングシステムが持つ力がより便利に使いやすくなってほしい。 リコンフィギャラブル対応なOSとしてLEAP、BORPHなどがあるそうな。
    あとCoRAM FPGAの実用化。(動画は長い) http://www.iwls.org/iwls2011/slides/James_Hoe_IWLS2011.pdf

GPUはどうなのか

GPGPUってやつ。 Microsoftとしては「電気食い過ぎなのでNG」とのこと。データセンターなどの大規模な商用システムだからだろう。電気食い過ぎってことは熱いってことだし、熱設計も大変。性能はいいんだがね。

GPUは安価なベクタプロセッサといえるので、ベクトル演算を多用できるアプリケーションにはすごい性能を発揮する。対して一般的CPUが得意なスカラ演算には向かない。

同じアプリケーションに対して基本的にGPUはFPGAよりも高性能かつ、開発環境も整備されているので開発も容易。だが、GPUのハードウェアアーキテクチャを充分に使うようなアプリケーションでなければ電力に対するパフォーマンスが悪い。また、GPUアーキテクチャが全てのアプリケーションに対してマッチしているとは限らない。

CPUもGPUも汎用性を持ち、全てのアプリケーションを実行可能だが、最適化をするのであればプロセッサのアーキテクチャアルゴリズム(プログラム)を合わせるしか無い。長いパイプラインを作りたくても、ハードウェア的に無理だから一旦メモリに置くなどの無駄を強いられる。 対してFPGAアルゴリズムにマッチしたアーキテクチャを構築可能。FPGAリソースなどの制限はあるとはいえ、長いパイプラインが作りたければ対応した規模のFPGA構成にすれば良い。

FPGAアクセラレーションを利用したい企業の動き

MSがFPGAアクセラレーションの商業利用での実用化にこぎつけたのもあり、「よくわからんけどやってみっか」という企業が増えるだろう。
MSも含めて既にFPGA利用について研究中の企業は、CベースでなくHDLスキルを持ったエンジニアを雇用して開発にあたっているから、ASICやFPGAでの論理回路設計者が取り合いになるのかもな。
あとFPGAはASICの下位互換に見られるが、FPGAアクセラレーションにおいてそれは間違いだ。実際はFPGAという特殊なデバイス特有の難しさがあるため、FPGAに精通したエンジニアのほうが好まれるだろう。なんせ実際に使おうとしてるデバイスFPGAにほぼ決まりなのだから。

そうして集めたFPGAエンジニアを使って、社内ソフトエンジニアにハードウェア知識を教えて、ヘテロジニアスなリコンフィギャラブルコンピューティングに備えていくのではないだろうか。
FPGAエンジニアは逆にソフトやネットワークなどの知識を教えてもらう。

こう入り混じっているとハードorソフトなどとセクションを無理やり分けるのはあまり適していないと思うし、得意分野意外もそれなりに出来るレベルのエンジニアを育て集めて、それぞれの得意スキルを発揮して問題にあたってもらったほうが良いかと。

マイクロアドのRTB

日本のマイクロアドというネット広告会社もFPGAによるアクセラレーションをしている。
RTBという広告オークションのHFT的なサービスため、スループット重視なMicrosoftとは異なりレイテンシ重視なFPGA活用法。 エンジニアは信号機制御とかやってた人だとかNEに書いてあったような。

信号機メーカーのエンジニア出身で、前職時代は道路に設置したカメラからの映像をFPGAで画像認識したりといった研究開発を担当していた。このため、ハードの開発はお手の物
激速インフラ作るネット企業の秘密基地に潜入(5ページ目) | 日経クロステック(xTECH)

何でもありだな。
キャッシュサーバはアルティマというAltera系商社が売ってる2万円の「Helio」ボード(デュアルコアARM内蔵のローエンドFPGA Cyclone V Soc)を利用。 ボード自体は市販品なので、品質も良く安い。

内蔵ARMコアにはTCP/IPなどのFPGAでは面倒な処理(最初はRTL実装を試みた)をさせ、 ユーザーロジックにはKVS、URLの正規化(URL整形)処理といった自社アプリケーションのための特殊演算回路を実装。
KVSやURL正規化の処理は軽いとのことで、Microsoftみたいな巨大FPGAパイプライン化する必要性はない。 1ボードにKVSまたはURL正規化を載せた、計2台のキャッシュサーバを用意して既存のサーバーネットワークへ接続。これを複数のサーバーで共有する模様。 1台のキャッシュサーバはこれまでのx86サーバーの4倍の処理性能を見せているそうだ。

冒頭で

容易に変更できないFPGA自体のハードウェアアーキテクチャと、基板上の制限が重要。

と書いたが、マイクロアドの場合は問題解決ために新規ボードを作らなくてもで満たせるようになったということだ。

Micorsoftのようなボード開発からのゴリゴリな感じでなくても、こうしたコストパフォーマンス抜群な活用法もある。よく考えよう。

終わり

なんかやたら長くなった。 関連研究のところに書いてあったが、スパコンMaxwellはCatapultを使ったシステムとよく似ていて、FPGAを2次元トーラスネットワーク(InfinityBand)で繋いでる。ただしデータセンターというより、スパコンなのでユーザーロジックにFPGA内部ルータとかは実装してない。
http://rssi.ncsa.illinois.edu/docs/academic/Baxter_presentation.pdf

今度はAlteraやXilinxを脅かす第3のFPGAなど、リコンフィギャラブルデバイスについて最近はどうなのか調べてみるかな。