7

这是参考问题: Intrinsics 中 Neon 的校验和代码实现

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

无论如何来这个问题:

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

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

4

1 回答 1

13

答案取决于 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 的数据移动方面的成本要低得多。我不知道这是否会影响指令的并行调度,但这绝对是需要注意的事情。

于 2012-09-05T15:52:25.443 回答