CPUが苦手でFPGAが得意な処理にどんなのがあるか考えたときに、案外 LUT-Network はそれに近いかもしれないと思う。
ここで手元にある KV260 を考えてみると 117,120個 のLUTがある。
LUT-Network で行われる動作としては
- ランダムに結線されている別のノードの 6つのノードの結果を取得してくる
- その値をアドレスに 64bit のテーブルを引き結果とする
という、FPGA のLUTの動作ほぼそのままだ。この時テーブルの内容の情報エントロピーが十分高ければ(要するにランダムに近ければ)、CPUに備わった命令で計算するよりテーブル引きする方が早いという状況になる。
そうすると
- 1bit取得するためだけにキャッシュラインサイズだけ周辺を巻き込んだランダムアクセスが6回起こる
- 6回で取ってきた値をシフトしてORして入力値にする
- 64bit のテーブルをロードしてくる
- 入力値分シフトしてAND取って1bitを得る
というのが CPU で出来る最速の方法と思われる。
117,120個 のLUTがあるとテーブルサイズは 1Mバイト程度になってくるので L2キャッシュには収まるがL1キャッシュだと厳しくなってくる。 メニイコアのCPUやGPUを持ってくればL1に収まるかもしれないがそれにしてもコアを挟んでデータ交換しなければならないので load/store のコストは軽くはならない。
軽く10サイクルはかかると思われるので、500MHz でFPGAと同じ速度を出そうとしたら、仮にデータ交換のコストがゼロでも 5GHz で動く117,120コアのCPU/GPUを持ち出さないといけない計算になる。
要するに FPGA の LUT の数と同じコア数で10倍周波数の CPU を揃えてすら無いと同じことをするのが難しいという話になる。
GOWIN とかの Tang Nano 4K とかでも LUT4 になるとはいえ 4,608 LUT あるので、やりようによっては 1000コアのCPUに勝てるかもしれない(笑)。 (逆説的だが RTLシミュレータが遅いのもいろいろと納得がいくのである)
まあ、逆もしかりで、某CPU が最も得意である、「x86命令のエミュレーション」みたいなので勝負するとFPGAはぼろ負けするわけですが。
(それ以前の問題として、x86 とか ARM とかの命令セットエミュレータをFPGAでロジック実装したら、なんかいろいろ怒られそうな予感)