假设我想用连续内存位置的值加载四个连续的 aarch64 向量寄存器。一种方法是
ldp q0, q1, [x0]
ldp q2, q3, [x0, 32]
根据ARM优化指南 https://static.docs.arm.com/uan0016/a/cortex_a72_software_optimization_guide_external.pdf对于 Cortex A72(我的目标处理器),这两条指令中的每一条都在 L 管道上占用 6 个周期的执行时间,总共 12 个周期。
但我也可以使用带交错的加载,这允许我一次加载所有 4 个寄存器:
ld4 {v0.2d, v1.2d, v2.2d, v3.2d}, [x0]
这也节省了代码大小,并且根据上述指南,总共只需要 8 个周期的执行时间。
我知道交错意味着数据以不同的方式存储在我的寄存器中,但应该假设我以后的使用可以处理交错和非交错数据。(例如,对数组求和。)
正如我从理论执行时序中读到的那样,LD4 真的比 LDP 快两倍吗?
当然,对于 STP 和 ST4 也可以提出同样的问题。
也许这里有人已经对这个主题进行了基准测试。
(我是否正确地解释了时间?)