在ARM Cortex-A8处理器中,我了解NEON是什么,它是一个SIMD协处理器。
但VFP(矢量浮点)单元也是一个协处理器,可以作为SIMD处理器使用吗?如果是这样哪个更好用?
我阅读了一些链接,例如 -
答案 0 :(得分:40)
两者之间存在很大差异。 Neon是一种SIMD(单指令多数据)加速器处理器,作为ARM内核的一部分。这意味着在执行一条指令期间,最多可并行处理16个数据集。由于Neon内部存在并行性,因此您可以获得比使用相同时钟速率运行的标准SISD处理器更多的MON或FLOPS。
Neon的最大好处是你想用矢量执行操作,即视频编码/解码。它还可以并行执行单精度浮点(浮点)运算。
VFP是一种经典的浮点硬件加速器。它不像霓虹灯这样的并行架构。基本上它对一组输入执行一个操作并返回一个输出。它的目的是加快浮点计算。它支持单精度和双精度浮点。
您有3种使用Neon的可能性:
-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标准,因此编译器无法生成这些指令,除非您告诉编译器您对完全符合性不感兴趣。这可以通过多种方式完成。
-mfpu=neon
的GCC版本,也不会生成浮点NEON指令,除非您还指定-funsafe-math-optimizations
。对于armv8 + ISA(和变体) [更新]
NEON现在完全符合IEE-754标准,从程序员(和编译器)的角度来看,实际上并没有太大的区别。双精度已经过矢量化。从微架构的角度来看,我有点怀疑它们甚至是不同的硬件单元。 ARM确实单独记录了标量和向量指令,但它们都是“高级SIMD”的一部分。
答案 3 :(得分:2)
这意味着你可以使用浮点向量上的指令来实现类似SIMD的行为,但在内部,指令是按顺序顺序执行的的每个元素。
由于单个加载指令,指令所需的总时间因此而减少,因此VFP仍需要时间来处理向量的所有元素。
True SIMD将获得更多的净浮点性能,但使用VFP和矢量仍然比使用纯粹的顺序更快。