チップセット黒歴史が一段落してしまったので、しばらくは、やや違うロードマップを伝えていきたい。そこで今回からは、コプロセッサーの歴史をいくつか取り上げよう。

コプロセッサー、英語で書くとCo-Processorで、名前から判るようにProcessorの機能を補うものである。日本語では副プロセッサーなどと呼ばれた事もあるが、最近はコプロセッサーで話が通じるようだ。
副、というからにはもちろん正プロセッサーもあり、両方が対になって動くことでシステムを構成する。ただし「正プロセッサーはなにを処理し、副プロセッサーはなにを処理するか」はケースバイケースで決まる。
連載139回でお伝えしたRenditionの「Vérité V1000」の場合、正プロセッサーに当たるものは固定機能の描画パイプラインで、副プロセッサーが独自のRISC CPUだった。
あるいは(オンライン連載にない、書籍版だけの書きおろし記事で恐縮だが)MotorolaのMC88100の場合、「MC88200」というBus I/F兼キャッシュコントローラー兼キャッシュが別チップの形で用意されており、コンパニオンチップと分類すべきか微妙なところではあるが、一応MMUが入っているあたりは、コプロセッサーと呼べなくもない。
もっと巨大なシステムでは、「Intel iAPX 432」の場合、I/O処理などのために8086/8088プロセッサーを接続することになっており、システム的にはこれらはコプロセッサーの扱いとなっていた。つまり、システムの構成や定義次第で、どんなものでもコプロセッサーと扱われる可能性があるということだ。
ただPCのマーケットでは、主にFPU(Floating Point Unit:浮動小数点演算ユニット)をコプロセッサーとして扱うことが非常に多い。事実、FPUは80486の世代になるまでは別チップで実装されていたし、その後もNexGenのNX586は、FPUとして「NX587」というチップをコプロセッサーとして別に必要としていた。なぜ別チップとして用意する必要があるのかを、今回は解説していきたい。
CPU回路の巨大化を防ぐために
FPUを別のチップとして供給
小数点の演算には、大別して固定小数点演算と浮動小数点演算の2種類がある。固定小数点演算の場合、10進数の表現は32bitだと
XXXX.YYYYY
で固定になる。小数点の位置はインプリメント次第で変更可能だが、普通は
0.YYYYYYYYY~XXXXXXXX.Y
という範囲までである。32bitでは有効桁数が9桁ほどしかないので、整数部の最大値はどんなにがんばっても8桁どまりになる。9桁をフルに使うと小数でなくなってしまうからだ。これが64bitになると有効桁数が18桁に増えるので、
0.YYYYYYYYYYYYYYYYYY~XXXXXXXXXXXXXXXXX.Y
までの表現が可能になるが、場合によってはこれでも足りないことがある。他方浮動小数点の場合、10進数の表現は32bitだと
0.YYYYYY×10ZZ
で、有効桁数が若干減る代わりに、-10-126~10127という非常に広い範囲の数字を表現できる。同様に64bitでは
0.YYYYYYYYYYYYYYY×10ZZZ
となり、-10-1022~101023までが表現可能となる。小数部の有効桁数も15桁まで広がるので、科学技術演算であっても、それなりの精度で演算できる。
こうした特殊なデータフォーマットを扱うことの必要性そのものは昔から知られていたものの、問題はこれを実現しようとするとCPUの回路が巨大化してしまうことだ。特に乗算/除算の処理や、Sin/Cosやexp/logといった特殊関数の演算回路がかなり大きくなってしまう。
実際、後述する「Intel 8086」と、そのFPUである「Intel 8087」を比較した場合、8086のトランジスター数は2万9000個なのに対し、8087は4万5000個とFPUのほうがサイズが大きくなっている。これを1つのパッケージにすると、当然ダイサイズも大きくなり、歩留まりが悪くなるため、価格も引き上げざるを得ない。
かといって、8086を購入したユーザー全員がFPUを必要としたかというと、そういうわけではなく、大多数のユーザーはFPUを使っていなかった。したがって、FPUを別チップに分けるのは経済合理性の観点から言っても、生産の容易さからいっても理にかなっている。
余談であるが、浮動小数点数演算の標準をまとめたものに、IEEE 754がある。このなかでは基本形式や交換形式、丸め規格、演算、例外処理など浮動小数点演算に求められる要素を規格化したもので、x86系以外にも多くのCPUやFPUがこのIEEE 754に準じた形でFPUを構成している。
IEEE 754の基本形式のうち2進数に関して、当初は16bit(半精度)、32bit(単精度)、64bit(倍精度)、128bit(4倍精度)の4種類のフォーマットが予定されていたが、8087は最大でも80bit精度しか搭載しない。
これは128bitをフルに実装すると回路規模が大きくなりすぎてしまうため、80bitという中間的な桁数を認めるようにIEEEに強く働きかけた結果である。ただこの結果として、4倍精度をサポートするFPUは非常に少なくなってしまい、ほとんどのものが80bit精度の実装で済ませてしまっているあたりは、先例を作った8087の罪は重いと筆者は考える。

この連載の記事
- 第668回 メモリーに演算ユニットを実装するSK HynixのGDDR6-AiM AIプロセッサーの昨今
- 第667回 HPですら実現できなかったメモリスタをあっさり実用化したベンチャー企業TetraMem AIプロセッサーの昨今
- 第666回 CPU黒歴史 思い付きで投入したものの市場を引っ掻き回すだけで終わったQuark
- 第665回 Windowsの顔認証などで利用されているインテルの推論向けコプロセッサー「GNA」 AIプロセッサーの昨今
- 第664回 Zen 3+で性能/消費電力比を向上させたRyzen Pro 6000 Mobileシリーズを投入 AMD CPUロードマップ
- 第663回 Hopper GH100 GPUは第4世代NVLinkを18本搭載 NVIDIA GPUロードマップ
- 第662回 グラボの電源コネクターが変わる? 大電力に対応する新規格「12VHPWR」
- 第661回 HopperはHBM3を6つ搭載するお化けチップ NVIDIA GPUロードマップ
- 第660回 第3世代EPYCは3次キャッシュを積層してもさほど原価率は上がらない AMD CPUロードマップ
- 第659回 ISSCC 2022で明らかになったZen 3コアと3D V-Cacheの詳細 AMD CPUロードマップ
- 第658回 人間の脳を超える能力のシステム構築を本気で目指すGood computer AIプロセッサーの昨今
- この連載の一覧へ