CPUはオワコン

FPGAでCPUを組んでると、フェッチ部やデコーダ部で足し算や掛け算をしようとして、そんなことしたらCPUの意味ないなーと思ってしまうことがありました。
で、よく考えたら、FPGAでロジックを組むならCPUの意味はないんです。
だいたい、ひとつの処理実行するのに何クロックかかってんですか!と。


CPUでは、計算効率をよくするためにパイプラインという仕組みが使われています。
最近では、18段とかのパイプラインもあるようです。
ここで、18段のパイプラインのうち、実際に計算を行うのは2段か3段だったりします。残りの15段くらいは、命令や計算結果を読んだり書いたりしているだけです。
このパイプラインも、ほとんどはメモリの読み書き、それも命令の読み込みに多くが使われます。
であれば、CPUにしなければ、18段全部計算に使えるんじゃね?という話になりますね。


決まりきった計算を行うのに、いちいちメモリ、それもクソ遅いメモリから命令とってきて実行するのなら、最初からそういう回路にしておけばいいんです。
貴重なメモリバスはデータの読み書きに使いましょう。


HTTPリクエストを受け取り始めて150クロック後には、もう処理が始まっているとか、かっこいいじゃないですか。つまり「GET /index.html\n\n」というHTTPリクエスト17バイト×8=136ビットを受け取ったらすぐに処理を行い始める。
100MHzであれば1クロックは10nsなので、150クロックは0.15マイクロ秒です。
「リクエストを受け取ったと思ったときには、すでに処理がおこなわれているッ!」


メモリを一回読み込むのに70クロックかかったりするわけなので、64bitのバス幅で1回のアクセスで8バイト読めるとしても、これは17バイトをメモリから読み込むより速かったりします。
プログラム言語からすれば
「何を言ってるのかわからねーと思うが、おれも何をされたのかわからなかった」
という世界。
ハードウェアでは1クロックの間に数段の処理が行えるのですが、CPUにとっては、1クロックと1クロックの間は止まった世界なので、まさに「ザ・ワールド」です。
「催眠術とか超スピードとかチャチなもんじゃ断じてねえ」
のです。


もちろん、アプリケーションの手続き処理を行うのに、CPUは便利であり、適しています。
しかし2005年ごろから言われていることですが、Webアプリを作るのに、I/Oが一番足をひっぱっていて、CPUは遊んでいるということがあります。だから実行効率のそれほどよくないインタプリタでも問題ないんだと。
つまり、アプリケーションの手続き処理を行うだけなら、CPUなんか遅くていいんです。そのかわりI/OにはCPUを使わずクソ速くする。


このような世界を実現するのに、FPGAが有効なわけですが、実際に使われるようになるには、プログラム実行中に回路を切りかえれる動的FPGAが必要になります。
そして、この動的FPGAの回路切り替えが短時間で行われるのであれば、例えばリクエスト先ごとに回路を切り替えて処理を行うということも可能になります。
回路接続情報をDRAMに記録するDRAM-FPGAでは、全回路切り替えが70ナノ秒(100MHzで10クロック)というものも出来ているようなので、スレッドごとに回路を切り替えるということも可能になるでしょう。


このあたりは、次の書籍によくまとめられています。

リコンフィギャラブルシステム

リコンフィギャラブルシステム

2005年の本なので、いまではもっと進んでいると思います。


あと、前回のエントリで「FPGAはASICのプロトタイプや代替にすぎない」とか「組み込み技術者がモテる?」とかいうコメントがあったのですが、こういった背景があるので、FPGAはASICの単なる代替ではないし、ソフトウェアを知らない組み込み技術者もモテません。モテるのは、ソフトウェアがわかってFPGAがわかる技術者です。
GPUは、単一処理の並列には向いていますが、セル間のデータの結合などを行ったパイプライン処理には向いていません。また、スループットはあがりますが、レイテンシはコントロールできません。


スピードを求めたい、とくにレイテンシを最小化したいのであれば、CPUはもうすぐオワコンになると思われます。
CPU使って高速処理を書いていいのは、小学生まで。