【问题标题】:Detecting floating point software emulation检测浮点软件仿真
【发布时间】:2011-08-20 08:17:56
【问题描述】:

我正在开发一个运行时速度比精度更重要的应用程序。数字运算涉及浮点运算,我担心 double 和/或 long double 是在软件中处理而不是在处理器上处理(这在 32 位架构上总是如此,对吧?)。我想有条件地使用硬件支持的最高精度进行编译,但我还没有找到一种快速简便的方法来检测软件仿真。我在 GNU/Linux 上使用 g++,我不关心可移植性。它在 x86 架构上运行,所以我假设 float 始终是原生的。

【问题讨论】:

  • 为什么人们会有这种神秘的信念,即“float”是原生的、更快、更好?
  • @unapersson:提问者比8087小9岁,太可怕了。
  • @unapersson:因为在某些架构上确实如此,可能(并且因为整数数据类型很常见)
  • @Steve Aye,我记得当我买(或者更确切地说是我的雇主买给我)我的第一个 8087 协处理器时,当时它是一个单独的芯片,并且双手颤抖(肯定我要打破这个非常昂贵的产品的引脚)我将它插入我的 IBM XT 的 copro 插座。 Lahey F77 编译器需要它,它不进行 FP 仿真。快乐的时光!当然,当时我也住在高速公路的洞里。
  • @jalf 整数的常见情况是什么?

标签: c++ c floating-point


【解决方案1】:

在 x86 上,硬件通常在内部使用 80 位,这对于 double 来说绰绰有余。

您确定性能是一个真正的问题(通过分析代码)还是只是猜测它可能不受支持?

【讨论】:

    【解决方案2】:

    现代 x86 上的浮点单元 (FPU) 本身是双精度的(实际上,它甚至比双精度还要大),而不是浮点数(32 位中的“32”描述整数寄存器宽度,而不是浮点数宽度)。但是,如果您的代码利用向量化 SSE 指令(并行执行 4 个单操作或 2 个双操作),则情况并非如此。

    如果没有,那么将应用从浮点数切换到双倍数所达到的主要速度将是内存带宽的增加。

    【讨论】:

      【解决方案3】:

      (在 32 位架构上总是如此,对吧?)

      没有。普通 CPU 具有专用于 double 的硬件(在某些情况下还有 long double)。老实说,如果性能是一个问题,那么您应该了解您的 CPU。查看 CPU 手册,找出每种数据类型的性能损失。

      即使在缺乏“适当”double 支持的 CPU 上,它仍然无法在软件中进行仿真。 Cell CPU(以 Playstation 3 闻名)只是将 double 两次通过 FPU,因此它比 float 计算成本高得多,但它不是软件仿真。对于double 处理,您仍然有专门的说明。它们只是比等效的float 指令效率低。

      除非您的目标是使用 20 年的 CPU 或小型、有限的嵌入式处理器,否则浮点指令将在硬件中处理,尽管并非所有架构都能同等有效地处理每种数据类型

      【讨论】:

      • 有人愿意解释为什么这被否决了吗?我有没有说错什么?
      【解决方案4】:

      x86 在硬件方面做了floatdouble 等,并且已经做了很长时间。许多现代 32 位程序都假定支持 SSE2,因为它已经存在了好几年,并且可以依赖于出现在消费类芯片上。

      【讨论】:

        猜你喜欢
        • 2022-01-21
        • 1970-01-01
        • 1970-01-01
        • 2022-10-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-07-26
        • 1970-01-01
        相关资源
        最近更新 更多