2

我很好奇浮点运算在专用硬件与固定硬件上的速度有多快。

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

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

12 个固定时钟和 13 个浮动时钟。那么我是否遗漏了一些东西,并且有真正的性能优势,还是只是易于使用?我只是使用四个时钟进行乘法,显然它不会在所有处理器上都相同,但它提供了一个总体思路。

4

2 回答 2

1

使用定点数 1.54 已经以适合您的格式存储。然后,您只需进行整数乘法,然后进行常数加法以补偿舍入误差和一些筛选以使基数正确。参见维基百科:Q 数字格式

例如,假设 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.54b使用您假设的 CPU 两个负载,双精度乘法,常数加法(如果您一次执行多次乘法,则已经在寄存器中)和移位。

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

于 2012-12-25T07:36:27.520 回答
1

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

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

于 2012-12-25T09:49:30.290 回答