クロスツールチェーンを使用してCコードをコンパイルすると、実行可能ファイルはハードフロートを使用しているが、libcはソフトフロートを使用しているという警告のページがリンカーによって出力されます。違いは何ですか?
5 に答える
ハードフロートは、オンチップ浮動小数点ユニットを使用します。ソフトフロートはソフトウェアで1つをエミュレートします。違いは速度です。チップにFPUがあるかどうかにかかわらず、両方が同じターゲットアーキテクチャで使用されているのを見るのは奇妙です。-msoft-floatを使用して、GCCでソフト浮動小数点を有効にできます。libcを使用する場合は、ハードウェア浮動小数点を使用するようにlibcを再コンパイルすることをお勧めします。
浮動小数点演算を実行するには、次の3つの方法があります。
- CPUにFPUがある場合は、float命令を使用します。(速い)
- コンパイラに浮動小数点演算を整数演算に変換してもらいます。(スロー)
- フロート命令とFPUのないCPUを使用してください。CPUは例外(予約済み命令、未実装命令など)を生成し、OSカーネルに浮動小数点エミュレーターが含まれている場合はそれらの命令をエミュレートします(最も遅い)。
厳密に言えば、これらの答えはすべて私には間違っているようです。
クロスツールチェーンを使用して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浮動小数点)をサポートする必要があることです。
libcはソフトウェア浮動小数点演算用に構築されているようですが、exeは浮動小数点のハードウェアサポートを想定してコンパイルされています。短期的には、コンパイラフラグとしてソフトフロートを強制することができます。(gccを使用している場合は、-msoft-floatだと思います)
長期的には、ターゲットのプロセッサが浮動小数点演算をハードウェアでサポートしている場合は、通常、速度を上げるためにハードウェアフロートが有効になっているクロスツールチェーンを構築または検索する必要があります。一部のプロセッサファミリには、ハードウェアサポートがあるモデルとないモデルバリアントがあります。したがって、たとえば、プロセッサがARMであると言うだけでは、ハードウェア浮動小数点をサポートしているかどうかを知るには不十分です。
計算は、浮動小数点ハードウェアまたは整数演算に基づくソフトウェアのいずれかで実行できます。
ハードウェアでそれを行うのははるかに高速ですが、多くのマイクロコントローラーには浮動小数点ハードウェアがありません。その場合、浮動小数点(通常は最良のオプション)の使用を避けるか、Cライブラリの一部となるソフトウェアの実装に依存することができます。
ARMなどの一部のコントローラファミリでは、浮動小数点ハードウェアはファミリの一部のモデルに存在しますが、他のモデルには存在しないため、これらのファミリのgccは両方をサポートします。あなたの問題は、2つのオプションを混同したことのようです。