ARM Cortex-A8:VFP和NEON有什么区别?

48
在ARM Cortex-A8处理器中,我知道NEON是什么,它是一个SIMD协处理器。但是VFP(向量浮点)单元,也是一个协处理器,它是否作为SIMD处理器工作?如果是,哪个更好用?我阅读了一些链接,例如- 1. Link1 2. Link2。但并不是很清楚它们的意思。它们说VFP从来没有被设计成用于SIMD,但是在Wiki上,我读到以下内容:“VFP架构还支持执行短向量指令,但这些指令按顺序对每个向量元素进行操作,因此不提供真正的SIMD(单指令多数据)并行性能。”因此不太清楚要相信什么,有人能详细说明一下这个话题吗?
4个回答

47

这两者之间有很大的区别。Neon是ARM核心中的SIMD(单指令多数据)加速处理器。这意味着在执行一个指令时,同样的操作将在最多16个数据集并行进行。由于Neon内部存在并行性,因此与以相同时钟速率运行的标准SISD处理器相比,您可以获得更多的MIPS或FLOPS。

Neon的最大优点是,如果您想要执行向量操作,例如视频编码/解码,它能够胜任。同时,它还可以同时执行单精度浮点数(float)操作。

VFP是一种经典的浮点硬件加速器。它不像Neon那样是一种并行体系结构。基本上,它对一个输入集合执行一次操作并返回一个输出。它的目的是加速浮点计算。它支持单精度和双精度浮点数。

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

  • 使用内置函数#include"arm_neon.h"
  • 内联汇编代码
  • 通过提供-mfpu=neon作为参数让gcc帮您进行优化(gcc 4.5在这方面表现良好)

18

针对armv7 ISA(及其变体)

NEON是一种用于整数和浮点数据的SIMD和并行数据处理单元,而VFP是完全符合IEEE 754标准的浮点单位。特别是在A8上,即使没有高度并行的数据,NEON单元也比VFP快得多,因为VFP不是流水线。

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

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

其次,VFP提供了一些专用指令,在NEON单元中没有等效实现。例如SQRT,可能是某些类型转换。

但是,在Cosmin答案中没有提到的最重要的差异是NEON浮点管道并非完全符合IEEE 754标准。有关这些差异的最佳描述在FPSCR寄存器说明中。

由于它不符合IEEE 754标准,除非您告诉编译器您不关心完全符合性,否则编译器无法生成这些指令。可以通过以下几种方式来完成此操作。

  1. 使用内在函数强制使用NEON,例如请参见GCC Neon内在函数列表
  2. 请求编译器,非常友好。即使是使用-mfpu=neon的较新版本的GCC也不会生成浮点NEON指令,除非您还指定了-funsafe-math-optimizations

针对armv8+ ISA(及其变体)[更新]

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


3
使用VFP的另一个原因是当您需要双精度时,因为NEON不支持双精度。即使在VFP没有进行流水线处理时(例如在Cortex A-8中),使用VFP也比使用NEON在软件中实现双精度更快(我甚至认为即使使用NEON进行双倍精度,也无法超过VFP)。 - Z boson
1
我简直不敢相信我在回答中忘记了那个。谢谢! - Peter M
我刚刚了解到ARM64 NEON确实支持double。我猜这基本上就像x86的SSE2一样。 - Z boson

17

从结构上讲,VFP(它不是白叫向量浮点运算)确实有一个可以用单个指令对浮点向量进行操作的选项。我认为它从未真正同时执行多个操作(如真正的SIMD),但它可以节省一些代码大小。然而,如果您在鲨鱼帮助中阅读ARM体系结构参考手册(如我在NEON介绍中所述,问题中的链接1),则会在A2.6节中看到VFP的向量功能已在ARMv7中弃用(这是Cortex A8实现的内容),软件应使用高级SIMD进行浮点向量操作。

更糟糕的是,在Cortex A8实现中,VFP使用VFP Lite执行单元实现(将lite解释为占用较小的硅表面积,而不是具有较少特性),这意味着它实际上比例如ARM11上的VFP更慢!幸运的是,大多数单精度VFP指令由NEON单元执行,但我不确定向量VFP操作是否执行;即使执行,它们的执行速度肯定比NEON指令慢。

希望这能澄清事情!


嘿,皮埃尔,真是大开眼界!但是,我不明白你所说的“Shark help”是什么意思,能否请你发一下链接? - HaggarTheHorrible
1
由于某些晦涩的原因,ARM架构文档没有直接的链接。相反,我会指向iOS开发者已经有的本地副本,位于 /Library/Application\ Support/Shark/Helpers/ARM\ Help.app/Contents/Resources/ARMISA.pdf(更好的是,该文档省略了对iOS开发无关或过时的系统级信息)。如果您不是iOS开发人员,则可以前往http://infocenter.arm.com/help/topic/com.arm.doc.ddi0406b/index.html,注册账户,接受条件并下载文档。 - Pierre Lebeaupin

4

据我所知,VFP是一个按顺序工作的浮点协处理器。

这意味着您可以对一组浮点数使用指令以获得类似于SIMD的行为,但在内部,该指令是按顺序在每个向量元素上执行的。

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

真正的SIMD将获得更多的净浮点性能,但是使用带有向量的VFP仍比纯顺序使用它要快。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接