我正在阅读有关VFP寄存器以及与基于标量的处理器(或基于标量的超级标量处理器,如intel x86)相比的事实 但我的问题更详细一点。
我猜(只是猜测)VFP寄存器和Vector处理器正在更快地计算数学运算。但是如果我们只是用来存储价值呢?
什么是更快地存储和读取寄存器的值到VFP寄存器或存储/读取通用臂寄存器的值?
提出这个问题背后的原因(不是问题的真正部分): 你可能在想我为什么要那样做?因为我正在向应用程序注入一些ARM汇编代码,以便在数组中保存一些寄存器值(特别是LR和FP)。对我来说问题是当我想将这个寄存器值存储到一个数组时,首先必须将它们保存到其他一些通用寄存器(例如r8,r9,r10),然后将它们指向我的数组。但是因为我注入的ARM汇编代码位于某些函数的中间,所以我必须推送并弹出堆栈以维护这些寄存器上的先前值(这是内存操作并减慢整个应用程序,因为我的代码被注入到每个函数中应用程序)。因此,我想到使用VFP寄存器来保存数据并避免推送弹出,因为在我的目标应用程序中它永远不会被使用。是正确的道路还是跛脚?
答案 0 :(得分:1)
它取决于所涉及的微体系结构,但一般来说,您应该考虑在寄存器(任何类型)和内存之间进行传输,以便更好地在整数和VFP寄存器之间进行传输。
现代ARM CPU的设计非常适合在寄存器和内存之间移动 - 它是他们必须要做的事情,所以你希望它能够大大优化。除非您处于某种非典型工作负载中,否则可以合理地假设堆栈底部可能在L1缓存中很热,在这种情况下,您只需要从它加载几个周期的延迟(并且商店可能直接进入写缓冲区,使得延迟可以忽略不计。)
另一方面,整数流水线和浮点流水线之间的数据传输很少见。在绝对最糟糕的情况下,您将出现故障,必须让操作系统上电并启用FPU然后重试该指令,所有这些都可能比缓存中完全丢失的简单加载/存储更慢一路走向记忆。即使在最好的情况下,通常存在相当显着的延迟,甚至达到(我被引导相信)某些微体系结构的点,例如:
vmov r0, s0
实际上可能需要更长才能执行
vstr s0, [sp]
vldr r0, [sp]
所以,如果你只关心做一半的工作(即只是移动寄存器内容某处),那么点击堆栈可能是迄今为止最快的选择。
与任何性能问题一样,如果有疑问,请对每个选项进行基准测试,并在目标硬件上选择最快的代码和数据。