【问题标题】:Vector Floating Point Register VS Generic ARM Registers Which one is Faster?矢量浮点寄存器 VS 通用 ARM 寄存器 哪个更快?
【发布时间】:2015-12-04 14:34:31
【问题描述】:

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

我猜(只是猜测)VFP 寄存器和向量处理器在计算数学运算方面做得更快。但是如果我们只是用它来存储值呢?

将寄存器的值存储和读取到 VFP 寄存器或从通用臂寄存器存储/读取值更快的是什么?

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

【问题讨论】:

  • 这只是没有ARM官方文档的猜测,但是,一旦ARM伪装成RISC架构并且这种复制只占用一条指令,它的成本应该不会超过整数寄存器之间的复制。
  • @Netch 谢谢 :P 但是在维基百科中提到 VFP CPU(或 co-CPU)比基于标量的 CPU 更快。但我真的不知道。
  • 请注意,VFP 的“向量”方面在现代 CPU 上已被弃用且不受支持 - 它实际上只是一个常规 FPU。此外,“标量”(与“向量”/SIMD)和“超标量”(即每个周期发出 >1 条指令)之间也存在一些混淆,它们是完全不同的上下文,并不直接相关。

标签: floating-point arm cpu-registers


【解决方案1】:

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

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

另一方面,整数流水线和浮点流水线之间的数据传输不太常见。在绝对最坏的情况下,你会出错,必须让操作系统启动并启用 FPU,然后重试指令,所有这些都可能比缓存中完全丢失并不得不去的简单加载/存储要慢一直到记忆中。即使在最好的情况下,通常也会有相当大的延迟,甚至在某些微架构上(我被认为是这样的),例如:

vmov r0, s0

实际上可能需要更长的时间来执行,而不是等效的:

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

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

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

【讨论】:

    猜你喜欢
    • 2013-01-08
    • 2020-09-14
    • 2021-02-20
    • 1970-01-01
    • 2020-11-05
    • 2013-07-22
    • 1970-01-01
    • 2021-02-28
    • 2017-08-06
    相关资源
    最近更新 更多