ARM和NEON可以并行工作吗?

ngu*_*uns 5 arm simd inline-assembly neon cortex-a8

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

打开链接中列出的子问题作为单独的个别问题.因为多个问题不被要求作为单个线程的一部分.

无论如何回答这个问题:

可以ARMNEON(中的ARM Cortex-A8架构来说的),实际上是在并行工作?我怎样才能做到这一点?

有人可以指向我或分享一些使用ARM-NEON的互操作的示例实现(伪代码/算法/代码,而不是理论实现论文或会谈)吗?(使用intrinsics或inline-asm的实现都可以.)

fgp*_*fgp 9

答案取决于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>
...
Run Code Online (Sandbox Code Playgroud)

我手边没有代码示例,但如果您对ARM程序集有点熟悉,那么交错指令不应该是一个很大的挑战.完成后,请务必使用指令级分析器检查事物是否按预期工作.您应该看到几乎没有时间花在ARM指令上.

请记住,其他ARMv7实现可能会使NEON完全不同.例如,似乎Cortex A-9已经将NEON移近了ARM内核,并且从NEON/VFP返回到ARM的数据移动中具有更低的性能.这是否会影响我不知道的并行调度指令,但这绝对值得注意.