ARM Cortex-A8:VFP和霓虹灯的区别是什么
解决方案
两者之间有很大的区别。霓虹灯是SIMD(单个指令多个数据)加速器处理器作为ARM核心的一部分。这意味着在执行一项指令期间,同一操作将在多达16个数据集并行进行。由于霓虹灯内部存在并行性,因此您可以从霓虹灯中获得更多的MIP或FLOP,而不是以相同的时钟速率运行的标准SISD处理器。
霓虹灯的最大好处是,如果您想用向量执行操作,即视频编码/解码。此外,它可以并行执行单个精度浮点(浮点)操作。
VFP是经典的浮点硬件加速器。这不是像霓虹灯这样的平行体系结构。基本上,它在一组输入上执行一个操作,并返回一个输出。目的是加快浮点计算。它支持单精度和双精度浮点。
您有3种使用霓虹灯的可能性:
- 使用内在功能#include“ arm_neon.h”
- 内联装配代码
- 让GCC通过提供为您进行优化
-mfpu=neon
作为参数(GCC 4.5对此很好)
其他提示
在架构上,VFP(并非将其称为矢量浮点无用)确实有一项在单个指令中在浮点矢量上操作的规定。我认为它实际上从来没有同时执行倍数操作(例如True Simd),但是可以节省一些代码大小。但是,如果您在鲨鱼帮助中阅读了ARM体系结构参考手册(正如我在霓虹灯介绍中所描述的,问题1中的链接1),您会在A2.6节中看到VFP的向量功能在ARMV7中已弃用(这是Cortex A8的实施),并且软件应使用高级SIMD进行浮点矢量操作。
更糟糕的是,在Cortex A8实施中,VFP是通过VFP Lite执行单元实现的(将Lite作为占用较小的硅表面而不是具有较小功能的lite),这意味着它实际上比在ARM11上慢了!幸运的是,大多数单一精确的VFP指令都由霓虹灯单元执行,但我不确定向量VFP操作会执行;即使他们这样做,他们的执行肯定比霓虹灯说明要慢。
希望这能清除!
对于ARMV7 ISA(和变体)
霓虹灯是用于整数和浮点数据的SIMD和并行数据处理单元,VFP是完全兼容的浮点单元的完全IEEE-754。尤其是在A8上,即使您没有高度并行数据,霓虹灯单元的几乎所有内容都更快,因为VFP是非涉及的。
那么,为什么要使用VFP?
最大的区别是VFP提供双精度浮点。
其次,有一些专门说明,VFP提供的霓虹灯单位没有任何等效实现。 SQRT想到,也许是某种类型的转换。
但是,Cosmin答案中未提及的最重要的区别是,霓虹灯浮点管道并不完全符合IEEE-754。对差异的最佳描述是 FPSCR注册说明.
因为它不是IEEE-754符合IEEE-754,所以编译器无法生成这些说明,除非您告诉编译器您对完全合规性不感兴趣。这可以通过多种方式完成。
- 使用固有函数强制霓虹灯的使用,例如,请参阅 GCC霓虹灯固有功能列表.
- 很好地问编译器。甚至还有新的海湾合作委员会版本
-mfpu=neon
除非您还指定,否则不会生成浮点霓虹灯说明-funsafe-math-optimizations
.
对于ARMV8+ ISA(和变体) 更新
霓虹灯现在完全符合IEE-754,并且从程序员(和编译器)的角度来看,实际上没有太多差异。双重精度已被矢量化。从微观结构的角度来看,我有点怀疑它们甚至是不同的硬件单元。 ARM会分别进行文档标量和矢量说明,但两者都是“高级SIMD”的一部分。
IIRC,VFP是一个浮点协处理器,可以顺序工作。
这意味着您可以在浮子的向量上使用指令进行类似SIMD的行为,但是在内部,该指令是在向量的每个元素上执行的 按顺序.
尽管由于单个负载指令而减少了指令所需的总时间,但VFP仍然需要时间来处理向量的所有元素。
True Simd将获得更多的净浮点性能,但是使用VFP与向量使用纯粹的纯度速度更快。