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


98

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


それはARMアーキテクチャの場合はタグ:-)にこれを入れてください
ニルスPipenbrinck

3
@Nils Pipenbrinck:MIPSチップにもこの問題があります
Javier

回答:


100

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


3
「両方が同じターゲットアーキテクチャで使用されるのを見るのは奇妙です」これは、ライブラリがマシンに依存せず、精度が重要なパーツではビットが正確(ソフトフロート)であり、小さな偏差が存在するパーツでは高速(ハードフロート)であることに意味があります。関係ない。
PhilLab、2017年

32ビットARMで発生します。
アーロンフランケ2018

31

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

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

23

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

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

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

  • soft -これは純粋なソフトウェアです
  • softfp-これはハードウェアFPUをサポートしていますが、ABIはソフト互換です。
  • hard-ABIは浮動小数点またはVFPレジスタを使用します。

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

Linuxカーネルは、VFP命令のエミュレーションをサポートできます。明らかに、-mfpu=noneこの場合はコンパイルして、Linuxカーネルエミュレーションに依存するのではなく、コンパイルでコードを直接生成することをお勧めします。ただし、OPのエラーが実際にこの問題に関連しているとは思いません。これは独立しており、と一緒に処理する必要があります-mfloat-abi

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

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


1
最新のGCC(〜4.8 +)バージョンは、ハードフロートライブラリとソフトフロートライブラリを備えた「マルチライブラリ」をサポートしています。以前のバージョンでは、特定のバージョンでビルドされたコンパイラーが必要でした。いくつかのバージョンのライブラリーがあるため(コンパイラーのビルドにより長い時間が必要)、「マルチライブラリ」gccディストリビューションとリンクするときに、正しいライブラリーへのパスが必要になる場合があります。ディレクトリ名は「hf」、「hardf」、「libhf」、または「hard-float」の場合がありますが、通常は通常の「soft」ディレクトリまたは近くの場所にあります。
アートレスノイズ2017

これが正解です。floatの呼び出し変換は、コードとlibcの間で一致する必要があります。浮動小数点libc関数を決して呼び出さない場合でも、ミスマッチが発生する可能性があります。
Tor Klingberg

13

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

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


8

計算は、浮動小数点ハードウェアまたは整数演算に基づくソフトウェアで行うことができます。

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

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.