6

我正在为 Android 开发一个本机库,我在其中使用 ARM 程序集优化和多线程,以便在双核 ARM 芯片组 MSM8660 上获得最大性能。在进行一些测量时,我注意到以下几点:

  1. NEON优化的单线程库比ARMv6优化的单线程更快(如预期的那样)。
  2. 具有ARMv6优化的多线程库比具有ARMv6优化的单线程更快(如预期的那样)。
  3. 具有NEON优化的多线程库比具有NEON优化的单线程(绝对不是预期的!)。

我已经尝试在网上搜索以解释为什么会这样,但到目前为止还没有找到。似乎所有内核都共享相同的 NEON 管道或类似的东西,但所有示意图似乎都表明每个内核都应该有自己的 NEON 单元。有谁知道为什么会这样?

4

3 回答 3

1

首先,您使用的是什么库?

你是对的,每个内核都有自己的 NEON 单元,但是它是他们自己专有的“VeNum”单元,并没有提供太多关于它的信息,它是为 8x50 的基于 Cortex-A8 的 Scorpion 设计的,比 ARM 的要好得多自己的 NEON SIMD 实现,但是一个很好的解脱是他们(qcom)以与基本参考设计兼容的方式设计他们的硬件,因此大多数用于 cortex-A8 的代码都可以在 Scorpion 上正常工作,尽管由于性能受到了一些影响到可能的不同指令时序。

如果您使用“softfp”编译您的程序,您调用的每个使用浮点参数和/或使用 NEON 单元将寄存器数据从 ARM 内核传输到 Neon 单元和反之亦然,速度很慢,有时可能会使内核停顿许多周期,等待管道刷新。

同样对于使用浮点单元的线程程序,内核必须在上下文切换期间保存 FP 寄存器,以便对线程产生额外的惩罚,因为我们已经知道将寄存器从 neon 移动到 arm 很慢并且已知会停止流水线。

此外,许多其他因素也可能导致此问题,例如编译器优化不当、缓存未命中、未使用 scorpion 的双重问题功能、错误的指令调度以及重复从一个内核切换到另一个内核。

于 2012-08-05T13:22:22.140 回答
0

我的猜测是,这是因为冲洗 NEON 管道涉及额外的周期损失。NEON 管道位于核心的其余部分之后,因此您会看到错过分支的额外循环惩罚等。

如果线程必须经常同步,或者如果你有很多锁,我认为你会看到 NEON 的巨大损失。

您要利用 NEON 来获得多线程代码的整体性能提升的唯一方法是,如果代码具有令人尴尬的并行性,并且线程之间的通信非常少且不频繁。

于 2011-11-25T12:09:17.117 回答
0

这可能是因为缓存未命中。没有更多信息很难说。

于 2011-10-02T10:43:07.450 回答