这两者之间有很大的区别。Neon是ARM核心中的SIMD(单指令多数据)加速处理器。这意味着在执行一个指令时,同样的操作将在最多16个数据集并行进行。由于Neon内部存在并行性,因此与以相同时钟速率运行的标准SISD处理器相比,您可以获得更多的MIPS或FLOPS。
Neon的最大优点是,如果您想要执行向量操作,例如视频编码/解码,它能够胜任。同时,它还可以同时执行单精度浮点数(float)操作。
VFP是一种经典的浮点硬件加速器。它不像Neon那样是一种并行体系结构。基本上,它对一个输入集合执行一次操作并返回一个输出。它的目的是加速浮点计算。它支持单精度和双精度浮点数。
您有3种使用Neon的可能性:
-mfpu=neon
作为参数让gcc帮您进行优化(gcc 4.5在这方面表现良好)针对armv7 ISA(及其变体)
NEON是一种用于整数和浮点数据的SIMD和并行数据处理单元,而VFP是完全符合IEEE 754标准的浮点单位。特别是在A8上,即使没有高度并行的数据,NEON单元也比VFP快得多,因为VFP不是流水线。
那么为什么你会使用VFP?!
最主要的区别是VFP提供双精度浮点。
其次,VFP提供了一些专用指令,在NEON单元中没有等效实现。例如SQRT,可能是某些类型转换。
但是,在Cosmin答案中没有提到的最重要的差异是NEON浮点管道并非完全符合IEEE 754标准。有关这些差异的最佳描述在FPSCR寄存器说明中。
由于它不符合IEEE 754标准,除非您告诉编译器您不关心完全符合性,否则编译器无法生成这些指令。可以通过以下几种方式来完成此操作。
-mfpu=neon
的较新版本的GCC也不会生成浮点NEON指令,除非您还指定了-funsafe-math-optimizations
。针对armv8+ ISA(及其变体)[更新]
NEON现在完全符合IEE-754标准,从编程人员(和编译器)的角度来看,实际上没有太大的区别。双精度已经向量化。从微架构的角度来看,我有点怀疑它们甚至是不同的硬件单元。ARM确实将标量和向量指令分开记录,但两者都属于“高级SIMD”。
从结构上讲,VFP(它不是白叫向量浮点运算)确实有一个可以用单个指令对浮点向量进行操作的选项。我认为它从未真正同时执行多个操作(如真正的SIMD),但它可以节省一些代码大小。然而,如果您在鲨鱼帮助中阅读ARM体系结构参考手册(如我在NEON介绍中所述,问题中的链接1),则会在A2.6节中看到VFP的向量功能已在ARMv7中弃用(这是Cortex A8实现的内容),软件应使用高级SIMD进行浮点向量操作。
更糟糕的是,在Cortex A8实现中,VFP使用VFP Lite执行单元实现(将lite解释为占用较小的硅表面积,而不是具有较少特性),这意味着它实际上比例如ARM11上的VFP更慢!幸运的是,大多数单精度VFP指令由NEON单元执行,但我不确定向量VFP操作是否执行;即使执行,它们的执行速度肯定比NEON指令慢。
希望这能澄清事情!
据我所知,VFP是一个按顺序工作的浮点协处理器。
这意味着您可以对一组浮点数使用指令以获得类似于SIMD的行为,但在内部,该指令是按顺序在每个向量元素上执行的。
虽然由于单个加载指令而减少了指令所需的总时间,但VFP仍需要时间来处理向量的所有元素。
真正的SIMD将获得更多的净浮点性能,但是使用带有向量的VFP仍比纯顺序使用它要快。