web-dev-qa-db-ja.com

ハード浮動小数点数とソフト浮動小数点数の違いは何ですか?

クロスツールチェーンでCコードをコンパイルすると、リンカーは、実行可能ファイルはハードフロートを使用しているが、libcはソフトフロートを使用しているという警告のページを印刷します。違いは何ですか?

94
Evan Kroske

ハードフロートは、オンチップの浮動小数点ユニットを使用します。ソフトフロートは、ソフトウェアの1つをエミュレートします。違いは速度です。チップがFPUを持っているか持っていないので、同じターゲットアーキテクチャで両方が使用されているのを見るのは奇妙です。 -msoft-floatを使用すると、GCCでソフト浮動小数点を有効にできます。使用する場合は、ハードウェア浮動小数点を使用するようにlibcを再コンパイルすることをお勧めします。

95
nmichaels

浮動小数点演算を行うには3つの方法があります。

  • CPUにFPUがある場合は、フロート命令を使用します。 (速い)
  • コンパイラーに浮動小数点演算を整数演算に変換させます。 (スロー)
  • FPUのないフロート命令とCPUを使用します。 CPUは例外(予約済み命令、未実装命令など)を生成し、OSカーネルに浮動小数点エミュレータが含まれている場合、それらの命令をエミュレートします(最も遅い)。
30
ninjalj

厳密に言えば、これらの答えはすべて間違っているようです。

クロスツールチェーンを使用してCコードをコンパイルすると、リンカーは実行可能ファイルがハードフロートを使用しているが、libcはソフトフロートを使用しているという警告のページを印刷します。違いは何ですか?

Debian VFP wiki には、-mfloat-abiの3つの選択肢に関する情報があります。

  • soft-これは純粋なソフトウェアです
  • softfp-これはハードウェアFPUをサポートしますが、[〜#〜] abi [〜#〜]はソフト互換性があります。
  • hard-ABIはfloatまたは[〜#〜] vfp [〜#〜]レジスタを使用します。

リンカ(ローダ)エラーは、整数レジスタに浮動小数点値を渡す共有ライブラリがあるためです。 -mfpu=vfpなどでコードをコンパイルすることはできますが、-mfloat-abi=softfpを使用して、libcがfloatを必要とする場合は、ある方法で渡されるようにしてください。ライブラリは理解しています。

Linuxカーネルは、VFP命令のエミュレーションをサポートできます。明らかに、この場合は-mfpu=noneを使用してコンパイルし、Linuxカーネルエミュレーションに依存する代わりに、コンパイルでコードを直接生成する方が良いでしょう。ただし、OPのエラーが実際にこの問題に関連しているとは思わない。これは別個であり、-mfloat-abiとともに処理する必要があります。

ArmV5 CPUを備えたArmv5共有ライブラリ は、これとは反対です。 libcはハードフロートでしたが、アプリケーションはsoftのみでした。この問題を回避するにはいくつかの方法がありますが、正しいオプションで再コンパイルするのが常に最も簡単です。

もう1つの問題は、コンテキストスイッチのレジスタを保存/復元するために、LinuxカーネルがVFPタスク(またはARM浮動小数点が存在するもの)をサポートする必要があることです。

20
artless noise

浮動小数点のハードウェアサポートを想定してexeがコンパイルされている間に、libcはソフトウェアの浮動小数点演算用に構築されたようです。短期的には、コンパイラフラグとしてソフトフロートを強制できます。 (gccを使用している場合、-msoft-floatだと思います)

長期的には、ターゲットのプロセッサが浮動小数点演算のハードウェアをサポートしている場合、一般的に、高速化のためにハードウェアフロートを有効にしてクロスツールチェーンを構築または検索する必要があります。一部のプロセッサフ​​ァミリには、ハードウェアサポートのあるモデルとないモデルがあります。したがって、たとえば、プロセッサがARMであると言うだけでは、ハードウェア浮動小数点サポートがあるかどうかを知るには不十分です。

12
Digikata

計算は、浮動小数点ハードウェアまたは整数演算に基づくソフトウェアのいずれかで実行できます。

ハードウェアで実行する方がはるかに高速ですが、多くのマイクロコントローラーには浮動小数点ハードウェアがありません。その場合、浮動小数点の使用を回避するか(通常は最適なオプション)、Cライブラリの一部となるソフトウェアの実装に依存します。

一部のコントローラファミリ(ARMなど)では、ファミリの一部のモデルには浮動小数点ハードウェアが存在しますが、他のモデルには存在しないため、これらのファミリのgccは両方をサポートします。あなたの問題は、2つのオプションを混同しているようです。

7
starblue