【问题标题】:ARM and NEON can work in parallel?ARM和NEON可以并行工作吗?
【发布时间】:2012-08-29 22:32:56
【问题描述】:

这是参考问题: Checksum code implementation for Neon in Intrinsics

打开链接中列出的子问题作为单独的单独问题。由于多个问题不能作为单线程的一部分提出。

不管怎样,问题来了:

ARMNEON(就 arm cortex-a8 架构而言)实际上可以并行工作吗?我怎样才能做到这一点?

有人可以指点我或分享一些示例实现(伪代码/算法/代码,而不是理论实现论文或演讲),它们一起使用了 ARM-NEON 的互操作? (使用内在函数或 inline-asm 实现都可以。)

【问题讨论】:

  • 简短回答:可以,只要它们不共享相同的内存。同步内存访问非常慢,将字节从 NEON 寄存器移动到 ARM 寄存器也非常慢。相当快的是将 ARM regs 转移到 NEON regs
  • 请注意,这只是指令级并行
  • 还要注意,NEON 单元有相当长的流水线,并且控制或寄存器在向量和单元之间的传输以及整数单元会带来相当大的损失。

标签: arm inline-assembly simd neon cortex-a8


【解决方案1】:

答案取决于 ARM CPU。例如,Cortex-A8 使用协处理器来执行 NEON 和 VFP 指令,这些指令通过 FIFO 连接到 ARM 内核。当指令解码器检测到 NEON 或 VFP 指令时,它只需将其放入 fifo。 NEON 协处理器从 FIFO 中获取指令并执行它们。因此,NEON/VFP 协处理器稍微落后了一点 - 在 Cortext-A8 上最多 20 个周期左右。

通常,该延迟并不关心该延迟,除非您尝试将数据从 NEON/VFP 协处理器传回主 ARM 内核。 (无论您是通过从 NEON/VPF 移动到 ARM 寄存器,还是通过使用最近由 NEON 指令写入的 ARM 指令读取内存来做到这一点并不重要)。在这种情况下,主 ARM 内核会停止,直到 NEON 内核清空 FIFO,即最多 20 个周期左右。

ARM 内核通常可以比 NEON/VPF 协处理器执行它们的速度更快地将 NEON/VPF 指令排入队列。您可以通过适当的交错指令来利用它使两个内核并行工作。例如,在每两个或三个 NEON 指令块之后插入一条 ARM 指令。或者,如果您还想利用 ARM 的双发功能,也可以使用两条 ARM 指令。您将不得不使用内联汇编来做到这一点 - 如果您使用内在函数,指令的确切调度取决于编译器,并且它是否具有适当地交错它们的智能是任何人的猜测。 您的代码将类似于

<neon instruction>
<neon instruction>
<neon instruction>
<arm instruction>
<arm instruction>
<neon instruction>
...

我手头没有代码示例,但如果您对 ARM 汇编有点熟悉,那么交错指令应该不是什么挑战。完成后,请务必使用指令级分析器来检查事情是否按预期工作。您应该看到几乎没有时间花在 ARM 指令上。

请记住,其他 ARMv7 实现可能会完全不同地实现 NEON。例如,Cortex A-9 似乎将 NEON 移到了更靠近 ARM 内核的位置,并且在从 NEON/VFP 回到 ARM 的数据移动方面的成本要低得多。这是否会影响指令的并行调度我不知道,但这绝对是需要注意的事情。

【讨论】:

  • 感谢@fgp,这确实是一个很好的解释。回答了我很多其他的问题。如果有人能指出一些使用内联汇编利用 arm-neon 功能的实现,我将不胜感激。我找不到太多谷歌搜索。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-10
  • 1970-01-01
  • 2012-04-07
  • 1970-01-01
  • 2023-03-14
  • 2016-08-18
相关资源
最近更新 更多