在桌面CPU上,交错整数和浮点计算(例如使用浮点数组:在计算数组值时更新整数索引(比全整数计算快,然后是全浮点计算。这是因为整数运算和浮点运算由CPU的不同部分处理,所以它们可以基本上同时处理。
一般来说,新手机的CPU和ARM架构是一样的吗?
在评论中已经讨论了x86体系结构之后,现在讨论ARM:
基本上,这也取决于所使用的处理器型号。大多数ARM处理器只有两条用于SIMD计算的流水线。有些指令只能在两个管道中的一个管道上执行,但大多数都不在乎。这也适用于简单的ALU操作,如
- 浮点SIMD的
FADD
、FSUB
、FMUL
- 整数SIMD的
ADD
、SUB
、MUL
例如,如果这个添加已经具有每个周期(最大(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寄存器上的标量运算(使用s0
到s31
、d0
到d31
等(和对它们的矢量运算(v0
到v31
(总是在两个SIMD流水线上进行。只有通用寄存器(w0
到w30
、wzr
、wsp
、x0
到x31
、xzr
、xsp
(上的操作在两个非SIMD ALU流水线I0/I1和M-流水线上运行。这就是为什么在某些情况下,一个ALU流水线I0/I1也用于SIMD指令的地址计算。