硬浮点数和软浮点数有什么区别?
- 2024-11-06 08:34:00
- admin 原创
- 28
问题描述:
当我使用交叉工具链编译 C 代码时,链接器会打印警告页面,指出我的可执行文件使用硬浮点,但我的 libc 使用软浮点。这有什么区别?
解决方案 1:
硬浮点使用片上浮点单元。软浮点在软件中模拟一个。区别在于速度。奇怪的是看到两者都用在同一个目标架构上,因为芯片要么有 FPU,要么没有。您可以使用 -msoft-float 在 GCC 中启用软浮点。如果您使用硬件浮点,您可能需要重新编译 libc 以使用硬件浮点。
解决方案 2:
严格来说,所有这些答案在我看来都是错误的。
当我使用交叉工具链编译 C 代码时,链接器会打印警告页面,指出我的可执行文件使用硬浮点,但我的 libc 使用软浮点。这有什么区别?
Debian VFP wiki提供了有关 的三个选择的信息-mfloat-abi
,
soft
- 这是纯软件softfp
- 这支持硬件 FPU,但ABI是软兼容的。hard
- ABI 使用浮点或VFP寄存器。
链接器(加载器)错误是因为您有一个共享库,它将在整数寄存器中传递浮点值。您仍然可以使用 等编译代码-mfpu=vfp
,但您应该使用 ,-mfloat-abi=softfp
这样如果libc需要浮点数,它就会以库可以理解的方式传递。
Linux 内核可以支持 VFP 指令的仿真。显然,在这种情况下,您最好使用 进行编译-mfpu=none
,并让编译器直接生成代码,而不是依赖任何 Linux 内核仿真。但是,我不认为 OP 的错误实际上与此问题有关。它是独立的,也必须与 一起处理-mfloat-abi
。
Armv5 共享库与 ArmV7 CPU正好相反;libc是硬浮点,但应用程序只是软浮点。它有一些方法可以解决这个问题,但用正确的选项重新编译总是最简单的。
另一个问题是,Linux 内核必须支持 VFP 任务(或任何存在的 ARM 浮点)才能在上下文切换时保存/恢复寄存器。
解决方案 3:
浮点运算有三种方法:
如果您的 CPU 有 FPU,请使用浮点指令。(快速)
让你的编译器将浮点运算转换为整数运算。(慢)
使用浮点指令和没有 FPU 的 CPU。您的 CPU 将生成异常(保留指令、未实现指令或类似指令),如果您的操作系统内核包含浮点模拟器,它将模拟这些指令(最慢)。
解决方案 4:
听起来你的 libc 是为软件浮点运算而构建的,而你的 exe 是在假设硬件支持浮点的情况下编译的。短期内,你可以强制使用软浮点作为编译器标志。(如果你使用的是 gcc,我认为它是 -msoft-float)
从长远来看,如果您的目标处理器具有对浮点运算的硬件支持,您通常会希望构建或找到启用硬件浮点的交叉工具链以提高速度。一些处理器系列有型号变体,一些有硬件支持,一些没有。因此,例如,仅仅说您的处理器是 ARM 不足以知道您是否有硬件浮点支持。
解决方案 5:
计算可以通过浮点硬件或基于整数算法的软件来完成。
在硬件中执行此操作要快得多,但许多微控制器没有浮点硬件。在这种情况下,您可以避免使用浮点(通常是最佳选择)或依靠软件实现,这将是 C 库的一部分。
在某些控制器系列中,例如 ARM,浮点硬件存在于该系列的某些型号中,但不存在于其他型号中,因此这些系列的 gcc 支持两者。您的问题似乎是您混淆了这两个选项。
解决方案 6:
可能的情况是软浮点数将数据留在 fpu 中,而硬浮点数则需要在进程激活时将 fpu 寄存器推送到缓存中。这就是为什么通常在编译时禁用内核的 FPU,不要在每次有人进行内核调用时浪费周期将其推送到内存中或从内存中推送出去。
- 2024年20款好用的项目管理软件推荐,项目管理提效的20个工具和技巧
- 2024年开源项目管理软件有哪些?推荐5款好用的项目管理工具
- 项目管理软件有哪些?推荐7款超好用的项目管理工具
- 项目管理软件哪个最好用?盘点推荐5款好用的项目管理工具
- 项目管理软件有哪些最好用?推荐6款好用的项目管理工具
- 项目管理软件有哪些,盘点推荐国内外超好用的7款项目管理工具
- 2024项目管理软件排行榜(10类常用的项目管理工具全推荐)
- 项目管理软件排行榜:2024年项目经理必备5款开源项目管理软件汇总
- 2024年常用的项目管理软件有哪些?推荐这10款国内外好用的项目管理工具
- 项目管理必备:盘点2024年13款好用的项目管理软件