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

在ARM Cortex-A8处理器中,我了解NEON是什么,它是一个SIMD协处理器。 但VFP(矢量浮点)单元也是一个协处理器,可以作为SIMD处理器使用吗?如果是这样哪个更好用? 我读了几个链接,如 - 链接1 链接2。 但不是很清楚他们的意思。他们说VFP从未打算用于SIMD,但在Wiki上我读了以下内容 - “VFP架构还支持短向量指令的执行,但这些指令依次对每个向量元素进行操作,因此不提供真正的SIMD性能(单指令多数据并行。“ 它不是很清楚要相信什么,任何人都可以详细说明这个话题吗?     
已邀请:
两者之间存在很大差异。 Neon是一种SIMD(单指令多数据)加速器处理器,作为ARM内核的一部分。这意味着在执行一条指令期间,最多可并行处理16个数据集。由于Neon内部存在并行性,因此您可以获得比使用相同时钟速率运行的标准SISD处理器更多的MON或FLOPS。 Neon的最大好处是你想用矢量执行操作,即视频编码/解码。它还可以并行执行单精度浮点(浮点)运算。 VFP是一种经典的浮点硬件加速器。它不像霓虹灯这样的并行架构。基本上它对一组输入执行一个操作并返回一个输出。它的目的是加快浮点计算。它支持单精度和双精度浮点。 您有3种使用Neon的可能性: 使用内在函数#include“arm_neon.h” 内联汇编代码 让gcc通过提供
-mfpu=neon
作为参数为你做优化(gcc 4.5对此很好)     
在架构上,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指令执行得慢。 希望能搞清楚!     
对于armv7 ISA(和变体) NEON是用于整数和浮点数据的SIMD和并行数据处理单元,VFP是完全IEEE-754兼容的浮点单元。特别是在A8上,即使你没有高度并行的数据,NEON单元对于几乎所有东西都要快得多,因为VFP是非流水线的。 那你为什么要用VFP?! 最主要的区别是VFP提供双精度浮点。 其次,VFP提供了一些专门的指令,即NEON单元中没有等效的实现。想到SQRT,也许还有一些类型的转换。 但Cosmin的答案中没有提到的最重要的区别是NEON浮点流水线并不完全符合IEEE-754标准。差异的最佳描述在FPSCR寄存器描述中。 由于它不符合IEEE-754标准,因此编译器无法生成这些指令,除非您告诉编译器您对完全符合性不感兴趣。这可以通过几种方式完成。 使用内部函数强制使用NEON,例如,参见GCC Neon Intrinsic Function List。 非常好地询问编译器。即使较新的带有
-mfpu=neon
的GCC版本也不会产生浮点NEON指令,除非你还指定
-funsafe-math-optimizations
。 对于armv8 + ISA(和变体)[更新] NEON现在完全符合IEE-754标准,从程序员(和编译器)的角度来看,实际上并没有太大的区别。双精度已经过矢量化。从微架构的角度来看,我有点怀疑它们甚至是不同的硬件单元。 ARM确实单独记录了标量和向量指令,但它们都是“高级SIMD”的一部分。     
IIRC,VFP是一个浮点协处理器,它按顺序工作。 这意味着您可以使用浮点向量上的指令来实现类似SIMD的行为,但在内部,指令依次在向量的每个元素上执行。 由于单个加载指令,由此减少了指令所需的总时间,因此VFP仍需要时间来处理向量的所有元素。 真正的SIMD将获得更多的净浮点性能,但是使用带有向量的VFP仍然比使用纯粹的顺序更快。     

要回复问题请先登录注册