在Arm Cortex-A8处理器中,我了解霓虹灯是什么,它是SIMD的协作处理器。

但是,VFP(矢量浮点)单位是否也是协同处理器,可作为SIMD处理器?如果是这样,哪个最好使用?

我读了一些链接,例如 -

  1. 链接1

  2. link2.

但并不是很清楚它们的含义。他们说,VFP从未打算用于SIMD,但 维基 我读了以下内容 - ”VFP体系结构还支持执行简短的向量指令,但它们顺序对每个向量元素进行操作,因此不提供True SIMD(单个指令多个数据)并行性的性能。"

这么清楚地相信什么,任何人都可以详细介绍这个话题吗?

有帮助吗?

解决方案

两者之间有很大的区别。霓虹灯是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,所以编译器无法生成这些说明,除非您告诉编译器您对完全合规性不感兴趣。这可以通过多种方式完成。

  1. 使用固有函数强制霓虹灯的使用,例如,请参阅 GCC霓虹灯固有功能列表.
  2. 很好地问编译器。甚至还有新的海湾合作委员会版本 -mfpu=neon 除非您还指定,否则不会生成浮点霓虹灯说明 -funsafe-math-optimizations.

对于ARMV8+ ISA(和变体) 更新

霓虹灯现在完全符合IEE-754,并且从程序员(和编译器)的角度来看,实际上没有太多差异。双重精度已被矢量化。从微观结构的角度来看,我有点怀疑它们甚至是不同的硬件单元。 ARM会分别进行文档标量和矢量说明,但两者都是“高级SIMD”的一部分。

IIRC,VFP是一个浮点协处理器,可以顺序工作。

这意味着您可以在浮子的向量上使用指令进行类似SIMD的行为,但是在内部,该指令是在向量的每个元素上执行的 按顺序.

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

True Simd将获得更多的净浮点性能,但是使用VFP与向量使用纯粹的纯度速度更快。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top