C++ 为什么不’;t假定常用的算术表示法?

C++ 为什么不’;t假定常用的算术表示法?,c++,math,floating-point,hardware,C++,Math,Floating Point,Hardware,我最近发现,它似乎提供了自己的实数类型和运算,比普通浮点运算快2到3个数量级 该库基于对实数使用不同的表示。一种被描述为比浮点posit更有效、数学上更精确的方法 如果这种表示法如此有效,为什么它不能广泛应用于各种应用程序中,并在硬件中实现,或者可能是这样?据我所知,大多数典型的硬件对实数使用某种IEEE浮点表示 它是否只适用于一些非常具体的人工智能研究,因为他们似乎大多将其列为一个例子 如果这种表示法不仅比浮点运算快几百到几千倍,而且更具确定性,设计用于并发系统,为什么不在GPU中实现呢?GP

我最近发现,它似乎提供了自己的实数类型和运算,比普通浮点运算快2到3个数量级

该库基于对实数使用不同的表示。一种被描述为比浮点posit更有效、数学上更精确的方法

如果这种表示法如此有效,为什么它不能广泛应用于各种应用程序中,并在硬件中实现,或者可能是这样?据我所知,大多数典型的硬件对实数使用某种IEEE浮点表示

它是否只适用于一些非常具体的人工智能研究,因为他们似乎大多将其列为一个例子


如果这种表示法不仅比浮点运算快几百到几千倍,而且更具确定性,设计用于并发系统,为什么不在GPU中实现呢?GPU基本上是处理实数的大规模并发计算器?它不会在渲染性能和GPU计算能力方面带来巨大的进步吗


更新:链接库背后的人发布了一份关于其设计和实现的报告。

据我所知,最客观、最有说服力的理由是,该库是在不到4年前推出的。这还没有足够的时间进入市场(人们需要时间来开发实现),更不用说接管了(这需要克服与现有软件的不兼容性)

行业是否希望做出这样的改变是一个独立的问题,它倾向于主观性。

IEEE标准似乎较慢的原因是因为IEEE解决了一些更重要的主题。例如:

。 .

IEEE浮点运算标准(IEEE 754)定义:

算术格式:二进制和十进制浮点数据集,由有限数(包括有符号的零和次正常数)、无穷大和特殊的“非数字”值(NaN)组成

交换格式:可用于以高效紧凑的形式交换浮点数据的编码(位字符串)

舍入规则:在算术和转换期间对数字进行舍入时要满足的属性

运算:算术和其他算术格式的运算(如三角函数)

异常处理:异常情况的指示(如除零、溢出等)

以上内容摘自维基百科:

。 .

您的链接库(似乎被称为posit number系统)具有以下优点

经济型-无冗余位模式。无穷大有一种表示法,表示为±inf和零。所有其他位模式都是有效的非零实数。±inf用作NaN的替代品

数学优雅-零只有一种表示,编码在1.0左右对称。通过quire的延迟舍入支持关联和分布法则,从而在任何并发环境中实现可复制的线性代数算法

锥形精度-锥形精度是指指数小的值具有更多精度位数,而指数大的值具有更少精度位数。Morris(1971)在其论文《锥形浮点:一种新的浮点表示法》中首次引入了这个概念

参数化精度和动态范围——位置由大小nbits和指数位数es定义。这使系统设计人员能够自由选择应用程序所需的正确精度和动态范围。例如,对于AI应用程序,我们可以选择5或6位的位置,而不选择任何指数位,以提高性能。对于嵌入式DSP应用,例如5G基站,我们可以选择一个16位posit和1个指数位,以提高每瓦的性能

更简单的电路-只有两种特殊情况,不是实数和零。没有非规范化数字、溢出或下溢

以上是从GitHub复制的:

。 .


因此,在我看来,正数系统更喜欢性能,而IEEE浮点运算标准(IEEE 754)更喜欢技术兼容性和互换性。

我强烈质疑该库比IEEE浮点更快的说法:

现代硬件包括专门设计用于处理IEEE浮点运算的电路。根据您的CPU型号,它可以在每个时钟周期执行大约0.5到4个浮点操作。是的,这种电路可以做复杂的事情,但是因为它内置在硬件中,并且经过多年的积极优化,它达到了这种速度

任何提供不同浮点格式的软件库都必须在软件中执行算术运算。它不能只说“请使用双精度算术将这两个数字相乘”,然后在两个时钟周期后看到结果出现在相应的寄存器中,它必须包含代码,该代码接受posit格式的四个不同部分,分别处理它们,并将结果融合在一起。代码需要时间来执行。时间远远超过两个时钟周期


“通用”库可能有其posite number格式闪耀的角落案例。但速度并不是它希望竞争的地方。

IEEE无处不在。如果有人提出了更有效的实现,那么切换将需要很多时间。一些软件依赖于IEEE表示,可能永远无法切换到新的。尽管如此,我没有对你链接的库做足够的研究,因此我无法提供任何有意义的评论。”比正常浮动快2到3个数量级