Ryuz's tech blog

FPGAなどの技術ブログ

続・計算機の効率(x86の加算器を推定してみる)

はじめに

つい最近、x86 CPU が割と長らく整数乗算をスループット1で処理していなかったことに気が付いてこんなブログを書きました。

ついでなので、工夫や構成でトランジスタ数の変わる乗算は置いておいて、比較的変化の少ない加算器で専用計算機との比較をしてみようと思い、ChatGPT さんにいろいろ聞きながら適当な表を作ってみました。なので間違いがあれば「ハルシネーション って事にしておこう」という、逃げ道を作って、適当な調査で見積もりを進めていきます。

ここでは 加算のみを行う専用計算機 との比較を題材にしてみようと思います。

「加算のみの専用計算機ってなんやねん?」となるわけですが、まあ、「DIS-SWで二進数で値を入れると、二進数で加算結果が点灯する装置」とか、「同期の取れたデジタルビデオ信号を2つ入れると合成した画像を出力する」とか、まあ何でもいいんですが、そのものずばり加算器しかないものを考えます。

当初真面目に全加算器のトランジスタ数を数えようかとも思いましたが、こちらで、64bit加算器が約1,000個との記述を見かけたので、エイヤで、

という事にして見積もります。フェルミ推定的な事がしたいだけなので、目をつぶってください(苦笑)。

x86 とかの効率を推定してみる

で、Z80とかも混ざってますが、ざっくりトランジスタ数と、レジスタ to レジスタでの add 命令のサイクル数と、スーパースカラの way 数と、で専用計算機との効率差を計算したのが次の表です。 (対メモリとするともう1~2桁悪化しかねませんが、キャッシュミスとか言い出すと見積もり不能になるのでレジスタ間演算にしておきます)。

プロセッサ 全体Tr数 bit cycle way 加算器Tr数(推定) 効率
8080 6,000 8 4 1 125 1/192
Z80 8,200 8 4 1 125 1/262
8086 29,000 16 3 1 250 1/348
80186 55,000 16 3 1 250 1/660
80286 134,000 16 2 1 250 1/1072
80386 275,000 32 2 1 500 1/1100
80486 1,200,000 32 1 1 500 1/2400
Pentium 3,100,000 32 1 2 500 1/3100
Pentium Pro 5,500,000 32 1 3 500 1/3666
Pentium II 7,500,000 32 1 3 500 1/5000
Pentium III 9,500,000 32 1 3 500 1/6333
Pentium 4 42,000,000 32 1 3 500 1/28000

例えば 8086 なら 「16bit の加算器が 250個のトランジスタで出来てるものとして、これが全力でadd命令を実行しても 3サイクルに一回しか仕事をしてくれないので、投入している全体の29,000個のトランジスタを専用計算機につぎ込んだ場合に比べて、250 / 3 / 29,000 = 1/348 の効率しかないよね。」という感じの乱暴な計算をしています。 クロック周波数は無視して、あくまでその世代のトランジスタを目的の計算をするのに効率的に稼働させてるかだけを見ています。

世代が進むと効率はどんどん悪くなり、最後は 1/28000 という見積りになってしまいました(まあ後半浮動小数点ユニットも入ってくるので一概に比較してはいけないのかもですが)。

それでもまあ、専用計算機に比べて汎用機が千倍~数万倍非効率と言われる話とはそう乖離してない気はします。

ご承知の通り、この頃はシングルコアのままどんどん周波数を上げるのにトランジスタが使われていた時代で、パイプラインはどんどん深くなり、Pentium4Prescott でついに限界を迎えて、この後、マルチコア/メニイコアの方向に進んでいく事になります。

この後は MMX命令(SIMD)なども出てきてますます比較が難しくなるので、ざっくりシングルコア時代で覗いてみるのはわかりやすくて良い気がします。

じゃあFPGAはどうなのか?

ということで、FPGA に話を持っていくわけですが、まあ Pentium とかと比べるなら Spartan3 ぐらいの LUT4 時代が適当なのかなとも思います。

Xilinx の場合 LUT4(6T の SRAM として、これが16bitとマルチプレクサ ) の後ろに加算用のキャリーチェーンがいて、FFが居るわけですが、データシートとか見てみると何となく見積もりやすそうです。

適当に ChatGPT に聞きながら 1bit 分で300トランジスタぐらいじゃないかと大雑把に試算して 8bit 加算器分で 2400 トランジスタぐらいという事にします。で、FPGAの配線スイッチの比率は 70~90% ぐらいはあるらしいので、まあそこも含めて 10000トランジスタぐらいとして、8bit 加算器の125 で換算するとまあ、専用計算機(ASIC)の 1/100 ぐらいの効率でしょうか?

後は、なんか加算に関しては LUT6 だと逆に見積もり悪化しそうな気がしますが、FPGAの場合、ベンダーが効率を下げる改変をするわけがないと思うので、きっと加算以外のCLBの使われ方の方が多いのでしょう、多分。

おわりに

超適当な見積もりですが、FPGAは ASIC の 1/100 の効率で、CPU はそのさらに 1/100 の効率 とか、普段あまり根拠なく言ってる戯言のオーダーとだいたい合ってるような気はするわけです。

この後、CPU はマルチコア化していき、SIMD演算器が入り、GPGPUアクセラレートしたりといろんな方向に進化していきますし、Xilinx FPGA もどんどん高度なDSPをハードマクロで持つようになり、MPSoC や ACAP で CPUが入ったり、GPU が入ったり、AI-Engine が入ったり、もうなんかどう見積もっていいかカタログだけでは難しい世界になっているわけですが。

ただし、専用計算機と比較するとこれだけ差があるわけですから、決まった演算に関しては専用計算エンジンを抱き込みたいという気持ちは確かによくわかるわけで、どう混ぜていくか? が問われる中で、FPGA はとてもバランスの良い潤滑油な気がするのですよね。

FPGAユーザー増えると嬉しいです。

おまけ

汎用計算機の本質として「プログラム次第でどんな計算でもできますよ」というのは、「足し算しかできないけど効率1万倍」よりもしばし高い価値と見なされるわけですが、価値を決めているのは人間であって、「どちらがより人間社会に役立つか」という事なのかなとは思います。

現在「AIしか計算できないけど効率1万倍」というのが脚光を浴びているのは結局AIがここに来て社会的な価値を見出されたからに他ならないわけで。今後の計算機の歴史がどうなるのかは興味津々です。