【问题标题】:ARM Cortex-A8: Whats the difference between VFP and NEONARM Cortex-A8:VFP 和 NEON 有什么区别
【发布时间】:2011-05-05 01:34:41
【问题描述】:

在 ARM Cortex-A8 处理器中,我了解 NEON 是什么,它是一个 SIMD 协处理器。

但是VFP(Vector Floating Point)单元也是协处理器,是否可以作为SIMD处理器工作?如果是的话,哪个更好用?

我阅读了一些链接,例如 -

  1. Link1

  2. Link2.

但不是很清楚他们的意思。他们说 VFP 从未打算用于 SIMD,但在 Wiki 我读到以下内容 - “VFP 架构还支持执行短向量指令,但这些指令按顺序对每个向量元素进行操作,因此不提供真正的 SIMD(单指令多数据)并行性能。"

不清楚该相信什么,有人可以详细说明这个话题吗?

【问题讨论】:

    标签: arm simd neon cortex-a8


    【解决方案1】:

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

    这意味着您可以在浮点向量上使用指令来实现类似 SIMD 的行为,但在内部,指令是在向量的每个元素上执行顺序

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

    真正的 SIMD 将获得更多的净浮点性能,但使用带有向量的 VFP 仍然比使用纯顺序更快。

    【讨论】:

      【解决方案2】:

      两者之间有很大的不同。 Neon 是作为 ARM 内核一部分的 SIMD(单指令多数据)加速器处理器。这意味着在执行一条指令期间,将在多达 16 个并行数据集上发生相同的操作。由于 Neon 内部具有并行性,因此您可以从 Neon 中获得比以相同时钟速率运行的标准 SISD 处理器更多的 MIPS 或 FLOPS。

      Neon 的最大好处是如果你想用向量执行操作,即视频编码/解码。它还可以并行执行单精度浮点(浮点)运算。

      VFP 是经典的浮点硬件加速器。它不是像 Neon 这样的并行架构。基本上它对一组输入执行一个操作并返回一个输出。它的目的是加快浮点计算。它支持单精度和双精度浮点。

      您有 3 种使用 Neon 的可能性:

      • 使用内部函数#include "arm_neon.h"
      • 内联汇编代码
      • 通过提供-mfpu=neon 作为参数让 gcc 为您进行优化(gcc 4.5 在这方面做得很好)

      【讨论】:

        【解决方案3】:

        在架构上,VFP(它并不是无缘无故被称为向量浮点)确实提供了在单个指令中对浮点向量进行操作的规定。我认为它实际上不会同时执行多个操作(如真正的 SIMD),但它可以节省一些代码大小。但是,如果您阅读了 Shark 帮助中的 ARM 架构参考手册(正如我在对 NEON 的介绍中描述的,问题中的链接 1),您将在 A2.6 部分看到 VFP 的矢量功能在 ARMv7 中已弃用(这是 Cortex A8 实现的),并且软件应该使用 Advanced SIMD 进行浮点向量运算。

        更糟糕的是,在 Cortex A8 实现中,VFP 是使用 VFP Lite 执行单元实现的(读取 lite 是因为占用更小的硅表面,而不是具有更少的功能),这意味着它实际上比 ARM11 慢,因为实例!幸运的是,大多数单精度 VFP 指令都由 NEON 单元执行,但我不确定向量 VFP 操作是否可以执行;即使这样做,它们的执行速度肯定比使用 NEON 指令要慢。

        希望一切顺利!

        【讨论】:

        • 嘿皮埃尔,大开眼界!但是,我无法理解您所说的 Shark 帮助的意思,您能否发布链接?
        • 出于迟钝的原因,没有直接链接到 ARM 架构文档。相反,我将 iOS 开发人员指向他们已经拥有的本地副本,位于 /Library/Application\ Support/Shark/Helpers/ARM\ Help.app/Contents/Resources/ARMISA.pdf (更好的是,该文档省略了过时或与iOS开发无关,如系统级信息)。如果你不是 iOS 开发者,那就去infocenter.arm.com/help/topic/com.arm.doc.ddi0406b/index.html,注册一个账号,接受条件,然后下载文档。
        【解决方案4】:

        对于 armv7 ISA(和变体)

        NEON 是用于整数和浮点数据的 SIMD 和并行数据处理单元,而 VFP 是完全兼容 IEEE-754 的浮点单元。特别是在 A8 上,NEON 单元在几乎所有方面都快得多,即使您没有高度并行的数据,因为 VFP 是非流水线的。

        那么你为什么要使用 VFP?!

        最大的不同是VFP提供了双精度浮点。

        其次,VFP 提供了一些在 NEON 单元中没有等效实现的专用指令。想到了 SQRT,也许是一些类型转换。

        但是 Cosmin 的回答中没有提到的最重要的区别是 NEON 浮点流水线并不完全符合 IEEE-754。 FPSCR Register Description 中对差异的最佳描述。

        因为它不符合 IEEE-754,编译器无法生成这些指令,除非您告诉编译器您对完全合规不感兴趣。这可以通过多种方式完成。

        1. 使用内部函数强制使用 NEON,例如请参阅GCC Neon Intrinsic Function List
        2. 问编译器,非常好。即使是带有 -mfpu=neon 的较新 GCC 版本也不会生成浮点 NEON 指令,除非您还指定了 -funsafe-math-optimizations

        对于 armv8+ ISA(和变体) [更新]

        NEON 现在完全符合 IEE-754,从程序员(和编译器)的角度来看,实际上并没有太大的区别。双精度已被矢量化。从微架构的角度来看,我有点怀疑它们甚至是不同的硬件单元。 ARM 确实分别记录了标量和向量指令,但两者都是“高级 SIMD”的一部分。

        【讨论】:

        • 使用 VFP 的另一个原因是当您需要双精度时,因为 NEON 不支持双进动。即使 VFP 没有流水线化(例如在 Cortex A-8 中),它也会比使用 NEON 在软件中实现双精度更快(我什至认为使用 NEON 的double-float 不会击败 VFP)。
        • 我不敢相信我在回答中忘记了这一点。谢谢!
        • 我刚刚了解到 ARM64 NEON 确实支持双精度。我想它基本上就像 x86 的 SSE2。
        • 嗨 NEON 现在是双精度的吗?
        猜你喜欢
        • 2011-05-11
        • 2015-04-23
        • 1970-01-01
        • 2011-11-08
        • 2014-03-03
        • 1970-01-01
        • 2017-12-06
        • 2013-01-12
        • 1970-01-01
        相关资源
        最近更新 更多