ARM Cortex-A8:VFP和NEON之间的区别是什么

时间:2010-11-04 13:16:56

标签: arm simd neon cortex-a8

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

但VFP(矢量浮点)单元也是一个协处理器,可以作为SIMD处理器使用吗?如果是这样哪个更好用?

我阅读了一些链接,例如 -

  1. Link1

  2. Link2

  3. 但不是很清楚他们的意思。他们说VFP从来没有打算用于SIMD,但在Wiki上我读了以下内容 - “ VFP架构也支持短向量指令的执行,但这些指令依次对每个向量元素进行操作,因此不会提供真正的SIMD(单指令多数据)并行性能。

    如此不清楚相信什么,任何人都可以详细说明这个话题吗?

4 个答案:

答案 0 :(得分:40)

两者之间存在很大差异。 Neon是一种SIMD(单指令多数据)加速器处理器,作为ARM内核的一部分。这意味着在执行一条指令期间,最多可并行处理16个数据集。由于Neon内部存在并行性,因此您可以获得比使用相同时钟速率运行的标准SISD处理器更多的MON或FLOPS。

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

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

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

  • 使用内在函数#include“arm_neon.h”
  • 内联汇编代码
  • 让gcc通过提供-mfpu=neon作为参数为您做优化(gcc 4.5对此很好)

答案 1 :(得分:16)

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

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

希望能搞清楚!

答案 2 :(得分:16)

对于armv7 ISA(和变体)

NEON是用于整数和浮点数据的SIMD和并行数据处理单元,VFP是完全符合IEEE-754标准的浮点单元。特别是在A8上,即使你没有高度并行的数据,NEON单元对于几乎所有东西都要快得多,因为VFP是非流水线的。

那你为什么要使用VFP?!

最主要的区别是VFP提供双精度浮点。

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

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

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

  1. 使用内在函数强制使用NEON,例如,请参阅GCC Neon Intrinsic Function List
  2. 非常好地询问编译器。即使是较新的带有-mfpu=neon的GCC版本,也不会生成浮点NEON指令,除非您还指定-funsafe-math-optimizations
  3. 对于armv8 + ISA(和变体) [更新]

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

答案 3 :(得分:2)

IIRC,VFP是一个按顺序工作的浮点协处理器。

这意味着你可以使用浮点向量上的指令来实现类似SIMD的行为,但在内部,指令是按顺序顺序执行的的每个元素。

由于单个加载指令,指令所需的总时间因此而减少,因此VFP仍需要时间来处理向量的所有元素。

True SIMD将获得更多的净浮点性能,但使用VFP和矢量仍然比使用纯粹的顺序更快。