111

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

4

5 に答える 5

109

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

于 2010-07-23T19:21:40.200 に答える
34

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

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

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

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

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

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

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

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

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

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

于 2015-04-17T17:25:47.133 に答える
13

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

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

于 2010-07-23T19:21:32.697 に答える
9

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

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

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

于 2010-07-23T19:26:23.673 に答える