ARMの浮動小数点演算

ARMプロセッサコアは、浮動小数点演算のためのハードウェアを含んでいません。代わりに、浮動小数点演算は以下のいずれかの方法で実現されます。

1.  ハードウェアで実現
ARMプロセッサコアに接続された、浮動小数点演算に必要な命令セットを実装したハードウェアコプロセッサで演算をおこないます。浮動小数点演算コプロセッサには、以下の種類があります。
 1.1. Floating Point Accelerator (FPA)
      ARM7500FEなどで使用されていたようです。現在は使われていません。
 1.2. Vector Floating Point (VFP)
      IEEE 754に対応し、単精度と倍精度の浮動小数点演算をおこなうことができます。ARM9/ARM10/ARM11に実装することができます。
 1.3. Floating Point Unit (FPU)
      VFPと互換性を持ちます。Coretex-A9, Coretex-R4Fに実装されます。(VFPもFPUの一部だと思っていたのですが、VFPは"ARM FPU"として区別するようです。)
 1.4. その他
      上記に挙げたもの以外に、チップメーカ独自の浮動小数点演算コプロセッサがあります。CirrusLogic社製EP93xxシリーズのMaverickCrunch、Intel社製PXA270のiWMMXtなどがあり、FPAやVFPとは異なる独自の命令セットを持ちます。

2. ソフトウェアで実現
 2.1. ソフトウェアライブラリで実現
      浮動小数点演算をハードウェアではなくソフトウェアで実現するライブラリ用いておこないます。(RealView Developer Suite C libraryに含まれるfplibや、gccを初めとしたGNUツールチェインでソフトフロートを指定した場合)。浮動小数点演算コプロセッサを持っていても、持っていなくても同じコードが使用でき、同じ速度で演算を実行することができます。但し、浮動小数点演算コプロセッサを持っているハードウェアでもそれを使用しません。
 2.2. Floating Point Emulation (FPE)
      浮動小数点命令を含んだコードを生成し、それを浮動小数点演算コプロセッサを持たないハードウェアで実行した場合、未定義命令例外や不当命令例外が発生します。その例外をキャッチして、浮動小数点演算をソフトウェアでエミュレートし、もとのコンテキストに復帰する方法です。Linuxシステムでは、ユーザランドで実行されるアプリケーションコードが浮動小数点命令を含んでいた場合、Linuxカーネルが例外をキャッチしてFPEをおこないます。浮動小数点演算コプロセッサを持っていても、持っていなくても同じコードが使用できるのは、ソフトウェアライブラリを使用する場合と同じですが、浮動小数点演算コプロセッサを持っているハードウェアの場合、高速に演算を実行できます。一方で、浮動小数点演算コプロセッサを持っていない場合、毎回例外とコンテキストスイッチが発生するため、非常に遅くなります。


Comments