手机CPU是否有独立的整数和浮点计算单元,可以并行操作



在桌面CPU上,交错整数和浮点计算(例如使用浮点数组:在计算数组值时更新整数索引(比全整数计算快,然后是全浮点计算。这是因为整数运算和浮点运算由CPU的不同部分处理,所以它们可以基本上同时处理。

一般来说,新手机的CPU和ARM架构是一样的吗?

在评论中已经讨论了x86体系结构之后,现在讨论ARM:

基本上,这也取决于所使用的处理器型号。大多数ARM处理器只有两条用于SIMD计算的流水线。有些指令只能在两个管道中的一个管道上执行,但大多数都不在乎。这也适用于简单的ALU操作,如

  • 浮点SIMD的FADDFSUBFMUL
  • 整数SIMD的ADDSUBMUL

例如,如果这个添加已经具有每个周期(最大(2条指令的吞吐量,这意味着这两个管道都得到了充分利用。所以这里简单的整数指令和浮点指令一样快。由于吞吐量高,使用SIMD甚至SISD整数运算的流水线无法获得速度优势。当然,在这里,我假设指令之间没有依赖关系。

除了吞吐量之外,还必须考虑指令的延迟:整数SIMDADD的最大延迟为3个周期,浮点FADD为4个周期。另一方面,非SIMDadd仅具有一个周期延迟。延迟表示最早可获得结果的周期数。如果下面的指令是基于上一个指令的结果,则吞吐量是有限的,并且将使用其他流水线的其他指令(例如非SIMD ALU(放在两者之间可能很有用。

至少Cortex-A72和Cortex-A76就是这样。对于较旧的Cortex-A55,它有点复杂。您可以在相应的";软件优化指南";,例如:

  • Arm®Cortex®-A55软件优化指南
  • Arm®Cortex®-A72软件优化指南
  • Arm®Cortex®-A76软件优化指南

评论后的澄清:SIMD寄存器上的标量运算(使用s0s31d0d31等(和对它们的矢量运算(v0v31(总是在两个SIMD流水线上进行。只有通用寄存器(w0w30wzrwspx0x31xzrxsp(上的操作在两个非SIMD ALU流水线I0/I1和M-流水线上运行。这就是为什么在某些情况下,一个ALU流水线I0/I1也用于SIMD指令的地址计算。

最新更新