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 操作,例如
FADD
、FSUB
、FMUL
用于浮点 SIMD
ADD
、SUB
、MUL
整数 SIMD
例如,如果此添加已经具有每个周期(最大)2 条指令的吞吐量,这意味着两条流水线都已得到充分利用。所以这里简单的整数指令和浮点指令一样快。由于高吞吐量,使用用于 SIMD 甚至 SISD 整数运算的流水线无法获得速度优势。当然,这里我假设指令之间没有依赖关系。
除了吞吐量,还必须考虑指令的延迟:整数 SIMD ADD
的最大延迟为 3 个周期,对于浮点数 FADD
4个周期。另一方面,非 SIMD add
只有一个周期延迟。延迟表示最早可获得结果的周期数。如果后续指令基于前一条指令的结果,则吞吐量有限,将其他指令置于使用其他流水线的指令之间可能很有用,例如非 SIMD ALU 指令。
至少 Cortex-A72 和 Cortex-A76 是这样。对于较旧的 Cortex-A55,它有点复杂。您可以在相应的《软件优化指南》中找到相关信息,例如:
- Arm® Cortex®-A55 Software Optimization Guide
- Arm® Cortex®-A72 Software Optimization Guide
- Arm® Cortex®-A76 Software Optimization Guide
一些评论后的澄清: SIMD 寄存器上的标量操作(使用 s0
到 s31
、d0
到 d31
等)和对它们的矢量操作(v0
到 v31
)总是在两个 SIMD 管道上进行。仅对通用寄存器进行操作(w0
至w30
、wzr
、wsp
、x0
至x31
、xzr
、 xsp
) 运行 在两个非 SIMD ALU 流水线 I0/I1 和 M-Pipeline 上。这就是为什么在某些情况下,一个 ALU 流水线 I0/I1 也用于 SIMD 指令的地址计算。
在桌面上 CPU,交错的整数和浮点计算(例如浮点数组:在计算数组值时更新整数索引)比所有整数计算都快,然后所有浮点计算。这是因为整型ops和float ops是在CPU的不同部分处理的,所以基本可以同时处理。
新手机的 CPU 和一般的 ARM 架构是否相同?
x86架构已经在评论中讨论过了,现在说一下ARM:
基本上,这也取决于所使用的处理器型号。大多数 ARM 处理器只有两条用于 SIMD 计算的流水线。有些指令只能在两条流水线之一上执行,但大多数不在乎。这也适用于简单的 ALU 操作,例如
FADD
、FSUB
、FMUL
用于浮点 SIMDADD
、SUB
、MUL
整数 SIMD
例如,如果此添加已经具有每个周期(最大)2 条指令的吞吐量,这意味着两条流水线都已得到充分利用。所以这里简单的整数指令和浮点指令一样快。由于高吞吐量,使用用于 SIMD 甚至 SISD 整数运算的流水线无法获得速度优势。当然,这里我假设指令之间没有依赖关系。
除了吞吐量,还必须考虑指令的延迟:整数 SIMD ADD
的最大延迟为 3 个周期,对于浮点数 FADD
4个周期。另一方面,非 SIMD add
只有一个周期延迟。延迟表示最早可获得结果的周期数。如果后续指令基于前一条指令的结果,则吞吐量有限,将其他指令置于使用其他流水线的指令之间可能很有用,例如非 SIMD ALU 指令。
至少 Cortex-A72 和 Cortex-A76 是这样。对于较旧的 Cortex-A55,它有点复杂。您可以在相应的《软件优化指南》中找到相关信息,例如:
- Arm® Cortex®-A55 Software Optimization Guide
- Arm® Cortex®-A72 Software Optimization Guide
- Arm® Cortex®-A76 Software Optimization Guide
一些评论后的澄清: SIMD 寄存器上的标量操作(使用 s0
到 s31
、d0
到 d31
等)和对它们的矢量操作(v0
到 v31
)总是在两个 SIMD 管道上进行。仅对通用寄存器进行操作(w0
至w30
、wzr
、wsp
、x0
至x31
、xzr
、 xsp
) 运行 在两个非 SIMD ALU 流水线 I0/I1 和 M-Pipeline 上。这就是为什么在某些情况下,一个 ALU 流水线 I0/I1 也用于 SIMD 指令的地址计算。