我很好奇,在专用硬件上的浮点运算与在固定硬件上的浮点运算相比有多快。
有了固定点,假设你有一个数字555,你想要乘以1.54,你可以将555,154和100加载到寄存器中(三个时钟),再乘以154 (四个时钟),再除以100 (四个时钟),然后将输出寄存器加载到内存中(一个时钟)。
使用浮点数,您需要将值555和1.54加载到寄存器中(两个时钟),获得较大的缩放/指数(一个时钟),减去缩放(一个时钟),归一化一(乘法需要四个时钟),乘以(四个时钟),然后将输出寄存器保存到内存(一个时钟)。
12个时钟用于固定,13个时钟用于浮动。那么,我是不是遗漏了一些东西,并且有真正的性能优势,或者这一切都只是易于使用?我只是用了四个时钟进行乘法,显然它在所有处理器上不会是一样的,但它给出了一个大致的概念。
发布于 2012-12-25 15:36:28
使用固定点数1.54将会以适当的格式为您存储。然后你只需要做整数乘法,然后是常量加法,以补偿舍入误差,并进行一些筛选,以获得正确的基数。参见Wikipedia:Q number format。
例如,假设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),但我相信使用定点可能没有那么多好处,因为浮点指令已经非常有效。
发布于 2012-12-25 17:49:30
对于现代处理器,查看单个指令的性能并不是很有用。许多指令既是pipelined指令又是超标量指令,因此多条指令处于同时执行的不同阶段。
根据处理器规格和代码计算性能是极其困难的。我通常只会评估一个还不存在的处理器的性能。如果处理器和代码都存在,则更容易测量。
https://stackoverflow.com/questions/14028346
复制相似问题