代码之家  ›  专栏  ›  技术社区  ›  Khaled Alshaya

为什么浮点十进制数字的硬件加速不像浮点二进制数字?

  •  16
  • Khaled Alshaya  · 技术社区  · 16 年前

    在硬件上实现它是否值得?如果是,为什么?如果不是,为什么不呢?


    对不起,我想很明显我在说十进制有理数!好吧,有点像 decNumber++ 对于C++, decimal 为了……网…希望现在清楚了:)

    12 回复  |  直到 10 年前
        1
  •  18
  •   Jonathan Leffler    16 年前

    最新版本的 IEEE 754:2008 标准确实使用问题中引用的软件中显示的表示定义了硬件十进制浮点数。本标准以前的版本( IEEE 754:1985 )未提供十进制浮点数。大多数当前的硬件实现1985年的标准,而不是2008年的标准,但是IBM的iSeries计算机使用 Power6 chips 有这样的支持,而且 z10 大型机。

    十进制浮点数的标准化工作由IBM英国公司的Mike Cowleshaw带头,他拥有 web site 充满有用的信息(包括问题中的软件)。很可能在适当的时候,其他硬件制造商也会在他们的芯片上引入十进制浮点单位,但我还没有听到英特尔何时(或是否)会增加一个方向的声明。英特尔确实优化了 software libraries 为了它。

    这个 C standards committee 希望增加对十进制浮点的支持,其工作是tr 24732。

        2
  •  5
  •   Charakterlos    16 年前

    一些IBM处理器包含专用的十进制硬件(十进制浮点dfp-单位)。

    贡献 9月18日23:43回答 丹尼尔·普莱登

    主要原因是DFP单元在芯片中需要更多的晶体管,而不是BFP单元。原因是BCD代码在二进制环境中计算十进制数。IEEE754-2008有几种方法来最小化过载。似乎DPD HXXP://en.wikipedia.org/wiki/浓密_-packed_-decimal方法比投标HXXP://en.wikipedia.org/wiki/binary_-integer_-decimal方法更有效。

    通常,您需要4位来覆盖从0到9的十进制范围。位10到15是无效的,但仍然可以与BCD。 因此,DPD将3*4=12位压缩为10位,以覆盖从000到999的范围,并提供1024(10^2)的可能性。

    一般来说,bfp比dfp快。 而BFP在芯片上需要的空间比DFP少。

    IBM为什么要实现一个DFP单元的问题回答得很简单: 他们为金融市场建造服务器。如果数据代表金钱,它应该是可靠的。

    在硬件加速的十进制算法中,有些错误与二进制错误不符。 1/5=0.2=>0.011001100110011001100110…在二进制中,可以避免重复分数。

    Excel中压倒性的round()函数将不再是无用的:d (->函数=1*(0,5-0,4-0,1)wtf!)

    希望能解释一下你的问题!

        3
  •  4
  •   DigitalRoss    16 年前

    有(一点点)十进制字符串加速,但是…

    这是个好问题。我的第一反应是 “宏操作总是无法证明” 但是,在考虑了它之后,如果在一个功能单元中实现,那么您所说的将会更快。我想归根结底是这些行动是否足够重要。对于宏操作和特定于应用程序的特殊用途指令,有一段相当遗憾的历史,尤其是对十进制财务格式的旧尝试现在只是遗留问题。例如,我怀疑它们是否被大量使用,但是每台电脑 has the Intel BCD opcodes ,包括

    DAA, AAA, AAD, AAM, DAS, AAS
    

    从前,十进制字符串指令在高端硬件上很常见。目前还不清楚他们是否曾在基准上有过很大的差异。程序花费大量时间测试、分支、移动事物和计算地址。通常,将宏操作放入指令集体系结构中是没有意义的,因为如果给CPU最少的基本操作数,那么总体情况似乎会更快,因此它可以尽可能快地将所有资源投入到执行这些操作中。

    现在,不是所有的二进制操作都在 真实的 伊莎CPU将旧的ISA转换为 micro-ops 在运行时。所有这些都是通过专门从事核心业务快速发展的一部分。目前,剩下的晶体管似乎正在等待一些图形和3D工作,即MMX、SSE、3DNow!

    我认为一个干净的表单设计可能会做一些激进的事情,统一当前(硬件)科学和(软件)十进制浮点格式,但不要屏住呼吸。

        4
  •  2
  •   willeM_ Van Onsem    16 年前

    不,它们的内存效率很低。而且计算也在硬件上不容易实现(当然可以,但也可以用很多时间)。 十进制格式的另一个缺点是,它没有被广泛使用,在研究表明二进制格式的数字更准确之前,这种格式一度很流行。但是现在程序员更清楚了。十进制格式效率不高,而且更有损耗。另外,额外的硬件表示需要额外的指令集,这可能导致更困难的代码。

        5
  •  2
  •   Jonathan Leffler    16 年前

    你想要的硬件过去相当普通。

    旧的CPU有硬件BCD(二进制编码十进制)算法。(如前几张海报所示,小小的英特尔芯片得到了一些支持)

    硬件BCD非常擅长加快FORTRAN的速度,FORTRAN使用80位BCD作为数字。

    科学计算曾在全球市场占有很大比例。

    因为每个人(相对而言)都有家用电脑运行Windows,市场变得很小。 以百分比表示。所以没人再这样做了。

    因为您不介意在大多数情况下使用64位双精度(二进制浮点),所以它基本上可以工作。

    如果您在现代硬件向量单元上使用128位二进制浮点,那也不算太差。仍然不如80位BCD准确,但你得到了。

    在之前的一份工作中,JPL的一位同事惊讶地发现我们仍然使用Fortran。”我们已经转换成C和C++,他告诉我们。“我问他如何解决了缺乏精确性的问题。他们没有注意到。(它们也不像以前那样具有空间探测器着陆精度。但任何人都可能错过一个星球。)

    所以,基本上,向量单元中的128位双精度比较好,并且广泛可用。

    我的二十美分。请不要将其表示为浮点数:)

        6
  •  2
  •   willeM_ Van Onsem    10 年前

    十进制浮点标准(IEEE754-2008)已经由两家公司在硬件上实现; 国际商用机器公司 基于6/7的Power服务器,以及 西尔维思 基于Silax PCIe的加速卡。

    西尔维思 发布了一个关于将十进制算术执行转换为使用其 HW solutions . 大大提高了时间,降低了能耗。

    此外,“Michael J.Schulte”和其他人发表的几篇文章显示了非常积极的基准结果,以及DPD和投标格式之间的一些比较(均在IEEE754-2008标准中定义)。

    您可以在以下位置找到PDF:

    1. 十进制浮点库的性能分析及其对十进制软硬件解决方案的影响

    2. 十进制算法硬件设计综述

    3. 通过十进制浮点单位提高能量和延迟

    这3篇论文应该足够回答你的问题了!

        7
  •  1
  •   Roberto Bonvallet    16 年前

    我推测十进制数没有计算密集型的应用。另一方面,浮点数在工程应用中得到了广泛的应用,它必须处理大量的数据,不需要精确的结果,只需要保持在期望的精度内。

        8
  •  1
  •   Richard Berg    16 年前

    小数(更一般地说,分数)相对容易实现为一对整数。对于大多数应用程序来说,通用库是无处不在的,而且速度很快。

    任何需要终极速度的人都将手动调整其实现(例如更改除数以适应特定的用法、代数组合/重新排序操作、巧妙地使用SIMD随机播放…)。仅仅将最常见的函数编码到硬件ISA肯定无法满足它们——很有可能,它根本没有帮助。

        9
  •  1
  •   Daniel Pryden    16 年前

    简单的答案是计算机是二进制机器。他们没有十个手指,只有两个。因此,为二进制数字构建硬件要比为十进制数字构建硬件快得多、容易得多,而且效率更高。

    顺便说一下:十进制和二进制是数字的基数,定点和浮点是有理数的近似机制。这两个是完全正交的:您可以有浮点十进制数(.net的系统。十进制是这样实现的)和定点二进制数(普通整数只是这种情况的一种特殊情况)。

        10
  •  0
  •   Lee B    16 年前

    浮点数学本质上是一种在硬件中实现小数的尝试。这很麻烦,这就是为什么十进制类型部分是在软件中创建的。这是一个很好的问题,为什么CPU不支持更多的类型,但是我想它可以追溯到cisc和risc处理器——risc赢得了性能战,所以我想他们现在尽量保持简单。

        11
  •  0
  •   Joren    16 年前

    现代计算机通常是通用的。浮点运算是非常通用的,而小数则有更具体的用途。我认为这是原因之一。

        12
  •  -1
  •   Mike Daniels    16 年前

    你是指典型的数值积分类型“int”、“long”、“short”(等等)吗?因为这些类型的操作肯定是在硬件中实现的。如果你说的是任意精度的大数字(“bignums”和“decimals”等),它可能是使用这些数据类型的操作的稀有性和构建硬件处理任意大数据格式的复杂性的结合。