FPU

FPU（Floating Point Unit、浮動小数点（演算処理）装置）とは、浮動小数点演算を専門に行う処理装置のこと。コンピュータの周辺機器のようなアーキテクチャのものもあれば、主プロセッサと一体化したコプロセッサのようなアーキテクチャのものもある。

AMDではAm9511をAPU (Arithmetic Processing Unit) と呼んでおり（2011年以降はAPUをAccelerated Processing Unitの略称として使用）、インテルではx87をNDP（Numeric data processor, 数値演算コプロセッサ）、またその命令についてNPX（Numeric Processor eXtension）とも呼んでいる。

マイクロプロセッサにおいては、Apple IIの頃は完全に周辺機器のようなアーキテクチャだったが、8087の頃には命令の一体化など、CPUの拡張装置のようなアーキテクチャになった。

1990年代中盤以降の高性能プロセッサではFPUはプロセッサ内部のサブユニットとなっている。インテルのx86系CPUでは独立ユニットのFPUは387（386用）が最後となり、486からは同一のチップ内に内蔵された（486の初期には、FPUを内蔵しない廉価版と、事実上はオーバードライブプロセッサであった487もあった）。同様に、モトローラの68000系でもMC68040以降はチップ内に内蔵している。プロセッサに内蔵されたFPUはスーパースカラーで他ユニットと並列動作させることができるなど様々なメリットがあるため、現在ではFPUを単体で用いることは珍しくなっている。

接続の形式

I/Oプロセッサ形式 
FPUをI/Oポートに接続して、通常の周辺機器と同様にI/Oポートを介してデータのやり取りを行なう形式。たとえばAm9511はこの形式で設計されている。FPUは周辺機器として扱われるので、CPUと同じメーカのFPUを使わなくてもよく、8ビットCPUの時代には、コストのかかるAm9511などの代わりに別メーカの電卓用CPUをI/Oポートに接続して使うことがホビイストの間で実験的に行なわれた。

また、対応機種として設計されていない組み合わせ、たとえばモトローラのMC68881（MC68020/MC68030用FPU）や、インテルの287（286用FPU）を、MC68000やMC68010に接続する場合は、データの入出力をプログラム上で明示的に行わなくてはならない。そのマシンに対応した数値演算ライブラリを使用すれば、アプリケーションソフトウェアのプログラミングにおいては、FPUを使用することを意識する必要は無いが、I/Oポートを介してデータをやり取りするため直接接続されている場合に比べて、大きなオーバヘッドが生ずる。逆に利点としては、主プロセッサと、副プロセッサの動作速度を個別に設定できるなど、自由度が高い点がある。

2018年現在では、Graphics Processing Unit及びそれをベースにしたプロセッサを用い、暗号通貨や各種演算処理に用いられる事が増え、グラフィックボードが品薄になる程の需要が生じている。

コプロセッサ方式 
CPUとFPUがアドレスバスとデータバスを共有し、協調して動作する方式。ユーザから見るとCPUの命令が拡張されたように見える。

8087ではデコーダを独立して内蔵しており、真の意味でコプロセッサだったが、287以降はCPUのデコード結果を専用I/Oポートを介し引き渡す方式を採った。8086/87では次の浮動小数点命令を実行する前に、直前の(8087の)命令が終わるまで待つための(8086の) wait 命令が必要だったが、286/287からは必要なくなっている。

モトローラのMC68881やMC68882を同社MC68020またはMC68030と組み合わせる場合、専用に用意された制御線を使用して接続すれば、ソフトウェアの変更は必要なく、プログラマからは単純にCPUの機能が拡張されたように扱える。MC68020の場合、厳密にはコプロセッサの存在を示すフラグが立つ。

乗っ取り形 
コプロセッサ方式の発展形。コプロセッサが実際にはCPUとしての全機能を持っており、制御は完全にコプロセッサ側に渡してしまい、既存のCPUは停止させてしまう。

487がこれで、要するにFPUというのは名前だけで、実態はオーバードライブプロセッサである。

脚注・出典

関連項目 

CPU
マイクロプロセッサ
オーバードライブプロセッサ
ハードウェアアクセラレーション

FPU
コンピュータの算術