Floating point 如果不用于浮点运算,现代CPU中的浮点硬件是否用于整数运算?

Floating point 如果不用于浮点运算,现代CPU中的浮点硬件是否用于整数运算?,floating-point,x86-64,Floating Point,X86 64,在整数性能密集型应用程序中,cpu能否自动使用浮点硬件来辅助此类计算?或者除了特定于浮点的计算外,浮点硬件是否未被使用(例如,如果达到整数性能限制,在应用程序代码中将某些计算从整数更改为浮点计算是否会加快)?问题的答案取决于处理器 我很抱歉链接到数百页的PDF文档,但基本上你的问题的答案是,你需要阅读Agner Fog的文章来了解现代(甚至是老式)处理器的工作原理 您将注意到,在某些处理器型号中,某些执行端口同时处理某些浮点指令和整数指令。这使得在处理器内部的某个地方,原本可以用来计算浮点运算的

在整数性能密集型应用程序中,cpu能否自动使用浮点硬件来辅助此类计算?或者除了特定于浮点的计算外,浮点硬件是否未被使用(例如,如果达到整数性能限制,在应用程序代码中将某些计算从整数更改为浮点计算是否会加快)?

问题的答案取决于处理器

我很抱歉链接到数百页的PDF文档,但基本上你的问题的答案是,你需要阅读Agner Fog的文章来了解现代(甚至是老式)处理器的工作原理


您将注意到,在某些处理器型号中,某些执行端口同时处理某些浮点指令和整数指令。这使得在处理器内部的某个地方,原本可以用来计算浮点运算的晶体管被用于整数运算的可能性变得模糊不清。它甚至不是必需的(执行端口与执行单元不同)。但是,即使像Agner Fog所做的那样,将现代处理器的工作反向工程到执行端口的规模,也是一项巨大的任务。这个问题无论如何都没有意义。重要的是处理器消耗的电流有多大,完成任务的速度有多快。一些晶体管是否在整数和浮点之间共享只是这个问题的一小部分。

考虑到int->float会导致值损坏,我们希望不会<代码>(int)3!=(int)3.0,basically@MarcB实际上,
3.0
精确地表示值3,浮点可以用来精确地计算恰好是整数的值。您是否执行了
(int)3!=(c)3(c),java,C++,……,结果是,两种语言都没有产生代码>错误< /代码>吗?我对细节非常好奇。嗯,还有很多其他值不能精确地表示为浮点数。我会从相对较少的几个数字中选择一个。@MarcB所有32位整数都可以在IEEE 754 64位二进制浮点中精确表示。整数加法器/乘法器需要处理多达64位的操作数。80位浮点具有64位尾数/有效位。在Intel SnB上,FP mul在端口0上运行,vector int mul也在端口0上运行。(都有5个周期的延迟)。不过,标量整数mul在端口1上运行(延迟为3个周期,与该端口上的FP add相同)。矢量mul单元可能在FP和int矢量mul之间共享一些晶体管,也可能不共享,但结果来自不同的输出。当使用某些FP INSN的输出作为某些vec int INSN的输入时,存在数据转发旁路延迟。