phone CPU 是否有可以并行运行的独立整数和浮点计算单元?

Does phone CPU have separate integer and floating point compute units that can operate in parallel?

在桌面上 CPU,交错的整数和浮点计算(例如浮点数组:在计算数组值时更新整数索引)比所有整数计算都快,然后所有浮点计算。这是因为整型ops和float ops是在CPU的不同部分处理的,所以基本可以同时处理。

新手机的 CPU 和一般的 ARM 架构是否相同?

x86架构已经在评论中讨论过了,现在说一下ARM:

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

  • FADDFSUBFMUL 用于浮点 SIMD
  • ADDSUBMUL 整数 SIMD

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

除了吞吐量,还必须考虑指令的延迟:整数 SIMD ADD 的最大延迟为 3 个周期,对于浮点数 FADD 4个周期。另一方面,非 SIMD add 只有一个周期延迟。延迟表示最早可获得结果的周期数。如果后续指令基于前一条指令的结果,则吞吐量有限,将其他指令置于使用其他流水线的指令之间可能很有用,例如非 SIMD ALU 指令。

至少 Cortex-A72 和 Cortex-A76 是这样。对于较旧的 Cortex-A55,它有点复杂。您可以在相应的《软件优化指南》中找到相关信息,例如:

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