46

在 ARM Cortex-A8 处理器中,我了解 NEON 是什么,它是一个 SIMD 协处理器。

但是VFP(Vector Floating Point)单元,它也是一个协处理器,是否可以作为一个SIMD处理器工作?如果是这样,哪个更好用?

我读了一些链接,例如-

  1. 链接1

  2. 链接2

但并不是很清楚它们的含义。他们说 VFP 从未打算用于 SIMD,但在Wiki上我读到以下内容 - “ VFP 架构还支持执行短向量指令,但这些指令按顺序对每个向量元素进行操作,因此不提供真正的 SIMD 的性能(单指令多数据)并行性。

不太清楚该相信什么,有人可以详细说明这个话题吗?

4

4 回答 4

46

两者之间有相当的区别。Neon 是作为 ARM 内核一部分的 SIMD(单指令多数据)加速器处理器。这意味着在执行一条指令期间,将在多达 16 个并行数据集上发生相同的操作。由于 Neon 内部具有并行性,因此您可以从 Neon 中获得比以相同时钟速率运行的标准 SISD 处理器更多的 MIPS 或 FLOPS。

Neon 最大的好处是如果你想用向量执行操作,即视频编码/解码。它还可以并行执行单精度浮点(浮点)运算。

VFP 是经典的浮点硬件加速器。它不是像 Neon 这样的并行架构。基本上它对一组输入执行一个操作并返回一个输出。它的目的是加快浮点计算。它支持单精度和双精度浮点。

您有 3 种使用 Neon 的可能性:

  • 使用内在函数 #include "arm_neon.h"
  • 内联汇编代码
  • 让 gcc 通过提供参数为您进行优化-mfpu=neon(gcc 4.5 对此很好)
于 2010-11-04T13:53:48.367 回答
17

从架构上讲,VFP(它没有被称为 Vector Floating Point)确实提供了在单个指令中对浮点向量进行操作的规定。我认为它实际上不会同时执行多个操作(如真正的 SIMD),但它可以节省一些代码大小。但是,如果您阅读了 Shark 帮助中的 ARM 架构参考手册(正如我在对 NEON 的介绍中描述的,问题中的链接 1),您将在 A2.6 部分看到 VFP 的矢量功能在 ARMv7 中已弃用(这是 Cortex A8 实现的),并且软件应该使用高级 SIMD 进行浮点向量运算。

更糟糕的是,在 Cortex A8 实现中,VFP 是使用 VFP Lite 执行单元实现的(将 lite 读取为占用更小的硅表面,而不是具有更少的功能),这意味着它实际上比在 ARM11 上慢!幸运的是,大多数单精度 VFP 指令都由 NEON 单元执行,但我不确定向量 VFP 操作是否可以;即使他们这样做了,它们的执行速度肯定比使用 NEON 指令要慢。

希望能解决问题!

于 2010-11-05T09:33:42.793 回答
17

对于 armv7 ISA(和变体)

NEON 是用于整数和浮点数据的 SIMD 和并行数据处理单元,而 VFP 是完全兼容 IEEE-754 的浮点单元。特别是在 A8 上,NEON 单元在几乎所有方面都快得多,即使您没有高度并行的数据,因为 VFP 是非流水线的。

那么你为什么要使用VFP?!

最大的不同是 VFP 提供了双精度浮点。

其次,VFP 提供了一些在 NEON 单元中没有等效实现的专用指令。想到了 SQRT,也许是一些类型转换。

但是 Cosmin 的回答中没有提到的最重要的区别是 NEON 浮点流水线并不完全符合 IEEE-754。差异的最佳描述在FPSCR 寄存器描述中。

因为它不符合 IEEE-754,所以编译器无法生成这些指令,除非您告诉编译器您对完全符合性不感兴趣。这可以通过多种方式完成。

  1. 使用内在函数来强制使用 NEON,例如参见GCC Neon Intrinsic Function List
  2. 很好地询问编译器。除非-mfpu=neon您还指定-funsafe-math-optimizations.

对于 armv8+ ISA(和变体) [更新]

NEON 现在完全符合 IEE-754,从程序员(和编译器)的角度来看,实际上并没有太大的区别。双精度已被矢量化。从微架构的角度来看,我有点怀疑它们甚至是不同的硬件单元。ARM 确实分别记录了标量和向量指令,但它们都是“高级 SIMD”的一部分。

于 2013-02-07T22:46:13.063 回答
4

IIRC, the VFP is a floating point coprocessor which works sequentially.

This means that you can use instruction on a vector of floats for SIMD-like behaviour, but internally, the instruction is performed on each element of the vector in sequence.

While the overall time required for the instruction is reduced by this because of the single load instruction, the VFP still needs time to process all elements of the vector.

True SIMD will gain more net floating point performance, but using the VFP with vectors is still faster then using it purely sequential.

于 2010-11-04T13:47:41.243 回答