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

时间:2009-09-18 23:27:26

标签: hardware decimal

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


抱歉,我认为很明显我在谈论十进制有理数!好的就像{+ 3}}对于C ++,decNumber++对于.NET ...希望现在很清楚:)

12 个答案:

答案 0 :(得分:18)

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

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

C standards committee希望添加对十进制浮点的支持,并且该工作是TR 24732。

答案 1 :(得分:5)

某些IBM处理器包含专用的十进制硬件(十进制浮点数| DFP单位)。

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

主要原因是DFP单位需要更多晶体管,然后是BFP单位。原因是BCD代码在二进制环境中计算十进制数。 IEEE754-2008有几种方法可以最大限度地减少过载。与BID hxxp://en.wikipedia.org/wiki/Binary_Integer_Decimal方法相比,似乎DPD hxxp://en.wikipedia.org/wiki/Densely_packed_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.0110011001100110011001100110 ...二进制,因此可以避免重复分数。

excel中的overhelming round()函数将不再有用:D ( - > function = 1 *(0,5-0,4-0,1)wtf!)

希望稍微解释一下你的问题!

答案 2 :(得分:4)

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

这是一个很好的问题。我的第一反应是“宏操作总是无法证明”,但在考虑之后,如果在功能单元中实现,你所谈论的内容会更快。我想这归结为这些操作是否足够重要。宏观操作和特定于应用程序的特殊用途指令有一个相当令人遗憾的历史,特别是十进制金融格式的旧尝试现在只是传统的包袱。例如,我怀疑它们是否被广泛使用,但是每个PC has the Intel BCD opcodes都是由

组成的
DAA, AAA, AAD, AAM, DAS, AAS

曾几何时,十进制字符串指令在高端硬件上很常见。目前尚不清楚他们是否已经取得了很大的基准差异。程序花费大量时间测试和分支,移动和计算地址。将宏操作放入指令集体系结构通常没有意义,因为如果给CPU提供最少量的基本事情,总体情况似乎会更快,因此它可以将所有资源放入尽可能快。

现在,甚至所有的二进制操作都不在真正的 ISA中。 cpu在运行时将遗留ISA转换为micro-ops。通过专注于核心运营,这是快速发展的一部分。目前,剩下的转换器似乎在等待一些图形和3D工作,即MMX,SSE,3DNow!

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

答案 3 :(得分:2)

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

答案 4 :(得分:2)

您想要的硬件过去很常见。

较旧的CPU具有硬件BCD(Binaray编码的十进制)算法。 (如早期海报所述,小小的英特尔芯片有一点支持)

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

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

由于每个人(相对而言)都有家用PC运行窗口,市场变得微不足道 百分比。所以没人再做了。

由于你不介意大多数事情都有64位双精度(二进制浮点数),所以它大部分都有效。

如果在现代硬件矢量单元上使用128位二进制浮点,那也不算太糟糕。仍然不如80位BCD准确,但你明白了。

在早期的工作中,一位以前来自JPL的同事感到惊讶,我们仍然使用FORTRAN。 “他告诉我们,我们已经转换为C和C ++。”我问他如何解决缺乏精确度的问题。他们没有注意到。 (它们也具有与之前相同的太空探测着陆精度。但任何人都可能错过一颗行星。)

因此,矢量单元中的128位双打基本上更好,并且可以广泛使用。

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

答案 5 :(得分:2)

十进制浮点标准(IEEE 754-2008)已由两家公司在硬件中实现; IBM 基于POWER 6/7的服务器,以及 SilMinds 基于SilAx PCIe的加速卡。

SilMinds 发布了一个关于将十进制算术执行转换为使用其HW solutions的案例研究。提出了大大提高时间和大幅降低能耗的方法。

此外,“Michael J. Schulte”等人的一些出版物揭示了非常积极的基准测试结果,以及DPD和BID格式之间的一些比较(均在IEEE 754-2008标准中定义)

您可以找到pdf:

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

  2. 十进制算术的硬件设计调查

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

  4. 这3篇论文对你的问题应该足够了!

答案 6 :(得分:1)

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

答案 7 :(得分:1)

小数(更常见的是,分数)相对容易实现为一对整数。通用库无处不在,并且对于大多数应用来说都足够快。

任何需要最高速度的人都会亲自调整它们的实现(例如,更改除数以适应特定用法,代数组合/重新排序操作,巧妙使用SIMD shuffle ......)。仅仅将最常见的功能编码到硬件ISA中肯定永远不会满足它们 - 很可能它根本没用。

答案 8 :(得分:1)

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

顺便说一句:十进制和二进制是数字基,而定点和浮点是近似有理数的机制。这两个是完全正交的:你可以有浮点十进制数(.NET的System.Decimal以这种方式实现)和定点二进制数(正常整数只是一个特例)。

答案 9 :(得分:0)

浮点数学本质上是尝试在硬件中实现小数。这很麻烦,这就是为什么Decimal类型部分是在软件中创建的。这是一个很好的问题,为什么CPU不支持更多类型,但我认为它可以追溯到CISC与RISC处理器 - RISC赢得了性能战,因此他们试图让这些日子变得简单。

答案 10 :(得分:0)

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

答案 11 :(得分:-1)

你的意思是典型的数字积分类型“int”,“long”,“short”(等)?因为这些类型的操作肯定是在硬件中实现的。如果你在谈论任意精度的大数字(“BigNums”和“Decimals”等),它可能是使用这些数据类型的罕见操作和构建硬件以处理任意大数据格式的复杂性的组合。 / p>