矢量浮点寄存器与通用 ARM 寄存器哪个更快?

Vector Floating Point Register VS Generic ARM Registers Which one is Faster?

我正在阅读有关 VFP 寄存器的信息以及与基于标量的处理器(或基于超标量的处理器,如英特尔 x86)相比的事实 但我的问题更详细一点。

我猜想(只是猜想)VFP 寄存器和矢量处理器在计算数学运算时速度更快。但是如果我们只是用它来存储值呢?

将寄存器的值存储和读取到 VFP 寄存器或storing/reading来自通用 arm 寄存器的值的速度更快?

问这个问题的原因(不是问题的一部分): 你可能在想我为什么要那样做?因为我将一些 ARM 汇编代码注入应用程序以将一些寄存器值(特别是 LR 和 FP)保存在数组中。我的问题是当我想将这个寄存器值存储到一个数组但首先必须将它们保存到其他一些通用寄存器(例如 r8、r9、r10)然后将它们指向我的数组时。但是因为我注入的 ARM 汇编代码位于某些函数的中间,所以我必须压入和弹出堆栈以维护这些寄存器上的先前值(这是内存操作并减慢整个应用程序,因为我的代码被注入到每个函数中应用程序)。所以我想到了使用 VFP 寄存器来保存数据并避免 push pop,因为在我的目标应用程序中它从未被使用过。这是正确的道路还是蹩脚的?

这取决于所涉及的微体系结构,但一般来说,您可能应该考虑在寄存器(任何类型)和内存之间进行传输,而不是直接在整数和 VFP 寄存器之间进行传输。

现代 ARM CPU 被设计为非常擅长在寄存器和内存之间移动内容 - 这是他们必须做的相当多的事情,因此您希望它能够得到显着优化。除非你在一些非典型的工作负载,这是一个合理的假设,即堆栈底部可能在 L1 缓存中很热,在这种情况下,你只有几个周期的延迟来从它加载(并且存储可能会直接进入一个写缓冲区,使那里的延迟可以忽略不计)。

另一方面,整数管道和浮点管道之间的数据传输不太常见。在绝对最坏的情况下你会出错,必须让 OS 通电并启用 FPU 然后重试指令,所有这些都可能比简单的 load/store 完全丢失慢缓存并且必须一直到内存。即使在最好的情况下,通常也会有相当大的延迟,甚至到了(我被引导相信)某些微体系结构上的延迟,例如:

vmov r0, s0

实际上可能比等价物 更长 来执行:

vstr s0, [sp]
vldr r0, [sp]

因此,如果您只关心完成一半的工作(即将寄存器内容移动到某处),那么访问堆栈可能是迄今为止最快的选择。

不过,就像任何性能问题一样,如果有疑问,请对每个选项进行基准测试,并在您的目标硬件上使用您的代码和数据选择实践中最快的那个。