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

Hag*_*ble 43 arm simd neon cortex-a8

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

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

我读了几个链接,如 -

  1. 链接1

  2. Link2.

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

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

小智 42

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

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

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

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

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


Pie*_*pin 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指令执行得慢.

希望能搞清楚!


Pet*_*r M 16

对于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. 非常好地询问编译器.即使较新的GCC版本-mfpu=neon也不会生成浮点NEON指令,除非您还指定-funsafe-math-optimizations.

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

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

  • 使用VFP的另一个原因是当您需要双精度时,因为NEON不支持双进动.即使VFP没有流水线化(例如在Cortex A-8中),它也会比使用NEON在软件中实现双倍更快(我甚至不认为[double-float](https://en.wikipedia.org/wiki/使用NEON的Quadruple-precision_floating-point_format#Double-double_arithmetic)将击败VFP). (2认同)