浮动与固定点数和性能

时间:2012-12-25 06:41:24

标签: floating-point fixed-point decimal

我很好奇浮动点操作在专用硬件和固定硬件上的速度。

对于固定点,假设您有数字555并且想要乘以1.54,则将值555,154和100加载到寄存器(三个时钟)中,将555乘以154(四个时钟),并且除以100(四个时钟),然后将输出寄存器加载到存储器中(一个时钟)。

使用浮点,您可以将值555和1.54加载到寄存器(两个时钟),获得更大的缩放/指数(一个时钟),减去缩放(一个时钟),归一化一个(四个时钟乘以一个),乘以(四个时钟),然后将输出寄存器保存到存储器中(一个时钟)。

固定12个时钟,浮动13个时钟。所以,我错过了一些东西,并且有一个真正的性能优势,还是只是易用性?我只使用了四个时钟进行乘法运算,显然它在所有处理器上都不一样,但它给出了一个大致的想法。

2 个答案:

答案 0 :(得分:1)

使用固定点数1.54将以适当的格式存储。然后,您需要进行整数乘法,然后进行常量加法以补偿舍入误差,并进行一些筛选以使基数正确。请参阅Wikipedia:Q number format

E.g。假设Q15.16格式(整数为15位,小数部分为16位),您可以执行乘法运算:

int32_t a = 555 * (1 << 16);  /* constant */
int32_t b = 1.54 * (1 << 16); /* constant, no calculations needed at run time */

int64_t temp = ((((int64_t) a) * b) + (1 << 15)) >> 16;
int32_t result = (int32_t) temp;

不需要除法或其他计算就可以1.54进入b(除非您需要从外部读取输入)。假设CPU有两个加载,双精度乘法,加常数(如果一次执行多次乘法,则已经在寄存器中),并且移位。

使用专用硬件(例如DSP内核或指令扩展),也可以以矢量化方式直接支持某些Qn.m类型。虽然具有更高级别的CPU(现代英特尔或AMD),但我相信使用固定点可能没有那么多好处,因为浮点指令已经非常有效。

答案 1 :(得分:1)

对于现代处理器,查看单个指令的性能并不是很有用。许多都是pipelined和超标量,因此多个指令处于同时执行的不同阶段。

从处理器规范和代码计算性能非常困难。我通常只会这样做来估计尚不存在的处理器的性能。如果处理器和代码都存在,则更容易测量。