【问题标题】:What's the difference between hard and soft floating point numbers?硬浮点数和软浮点数有什么区别?
【发布时间】:2011-03-20 06:51:35
【问题描述】:

当我使用我的交叉工具链编译 C 代码时,链接器会打印出警告页面,说明我的可执行文件使用了硬浮点数,但我的 libc 使用了软浮点数。有什么区别?

【问题讨论】:

  • 如果是ARM架构,请将其放入标签中:-)
  • @Nils Pipenbrinck:MIPS 芯片也有这个问题

标签: c linux floating-point arm libc


【解决方案1】:

严格来说,所有这些答案在我看来都是错误的。

当我使用我的交叉工具链编译 C 代码时,链接器会打印出警告页面,说明我的可执行文件使用了硬浮点数,但我的 libc 使用了软浮点数。有什么区别?

Debian VFP wiki 有关于-mfloat-abi 三个选项的信息,

  • soft - 这是纯软件
  • softfp - 这支持硬件 FPU,但 ABI 是软兼容的。
  • hard - ABI 使用 floatVFP 寄存器。

链接器(加载器)错误是因为您有一个共享库,该库将在整数寄存器中传递浮点值。您仍然可以使用-mfpu=vfp 等编译您的代码,但您应该使用-mfloat-abi=softfp,以便如果 libc 需要浮点数,它会以库可以理解的方式传递。

Linux 内核可以支持 VFP 指令的仿真。显然,对于这种情况,您最好使用 -mfpu=none 进行编译,并让编译器直接生成代码,而不是依赖任何 Linux 内核仿真。但是,我不相信 OP 的错误实际上与这个问题有关。它是单独的,也必须与-mfloat-abi 一起处理。

Armv5 shared library with ArmV7 CPU 与此相反; libc 是硬浮动的,但应用程序只是 soft。它有一些解决问题的方法,但使用正确的选项重新编译总是最简单的。

另一个问题是 Linux 内核必须支持 VFP 任务(或任何存在的 ARM 浮点)才能在上下文切换上保存/恢复寄存器。

【讨论】:

  • 现代 GCC (~4.8+) 版本支持“multi-lib”,它有硬浮点库和软浮点库。早期版本需要您使用特定版本构建的编译器。当与“多库”gcc 发行版链接时,有时需要正确库的路径,因为有多个版本的库(需要更长的时间来构建编译器)。目录名称可能是“hf”、“hardf”、“libhf”或“hard-float”,但它们通常位于常规“软”目录下或附近位置。
  • 这是正确的答案。浮点数的调用转换需要在您的代码和 libc 之间匹配。如果您从不调用任何浮点 libc 函数,它可能仍然可以在不匹配的情况下工作。
  • +1 因为这似乎是最正确的答案。我还要补充一点,尽管您可能有或没有 FPU。您还可以拥有一个仅支持可以在 C 程序中表达的功能子集的 FPU,例如1.0L / 2.0L 在单精度 FPU 上是不可能的,但 1.0f / 2.0f 可以。通常情况下,编译器运行时(例如 libgcc)会提供缺失的长双除法的“软”版本。但是,单精度指令将是“软”包装的硬件指令。
【解决方案2】:

计算可以通过浮点硬件或基于整数运算的软件来完成。

在硬件中执行此操作要快得多,但许多微控制器没有浮点硬件。在这种情况下,您可以避免使用浮点(通常是最佳选择)或依赖软件中的实现,这将成为 C 库的一部分。

在某些控制器系列中,例如 ARM,浮点硬件存在于该系列的某些型号中,但不存在于其他型号中,因此这些系列的 gcc 支持两者。您的问题似乎是您混淆了这两个选项。

【讨论】:

    【解决方案3】:

    浮点运算的三种方式:

    • 如果您的 CPU 有 FPU,请使用浮点指令。 (快)
    • 让您的编译器将浮点运算转换为整数运算。 (慢)
    • 使用浮点指令和没有 FPU 的 CPU。您的 CPU 将生成异常(保留指令、未实现指令或类似指令),如果您的操作系统内核包含浮点模拟器,它将模拟这些指令(最慢)。

    【讨论】:

      【解决方案4】:

      硬浮点使用片上浮点单元。软浮动在软件中模拟一个。区别在于速度。看到两者都用在同一个目标架构上很奇怪,因为芯片要么有一个 FPU,要么没有。您可以使用 -msoft-float 在 GCC 中启用软浮点。如果您使用它,您可能需要重新编译您的 libc 以使用硬件浮点。

      【讨论】:

      • “看到两者在同一个目标架构上使用很奇怪” 这对于一个库来说是有意义的,它独立于机器并且在精度关键部分中位精确(软浮点)和快速(硬浮动)在小偏差无关紧要的部分。
      • 发生在 32 位 ARM 上。
      • 软浮点数可用于确定性计算,例如用于物理模拟。它们每次在每个平台上、每个处理器上都会给出相同的结果。
      【解决方案5】:

      听起来您的 libc 是为软件浮点运算而构建的,而您的 exe 是在假设硬件支持浮点的情况下编译的。在短期内,您可以强制软浮点作为编译器标志。 (如果你使用 gcc,我认为是 -msoft-float)

      从长远来看,如果您的目标处理器具有对浮点​​运算的硬件支持,您通常会希望构建或找到启用硬件浮点以提高速度的跨工具链。一些处理器系列有一些型号变体,有的有硬件支持,有的没有硬件支持。因此,例如,仅说您的处理器是 ARM 不足以知道您是否支持硬件浮点。

      【讨论】:

        猜你喜欢
        • 2021-09-26
        • 1970-01-01
        • 2011-01-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多