这是参考问题: Checksum code implementation for Neon in Intrinsics
打开链接中列出的子问题作为单独的个别问题。因为多个问题不被要求作为单个线程的一部分。
无论如何都要回答这个问题:
ARM 和 NEON (就arm cortex-a8架构而言)实际上可以并行工作吗?我怎样才能做到这一点?
有人可以指向我或分享一些使用ARM-NEON的互操作的示例实现(伪代码/算法/代码,而不是理论实施文件或会谈)吗? (使用intrinsics或inline-asm的实现都可以。)
答案 0 :(得分: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>
...
我手边没有代码示例,但如果您对ARM程序集有点熟悉,那么交错指令应该不是一个挑战。完成后,请务必使用指令级分析器检查事物是否按预期工作。您应该看到几乎没有时间花在ARM指令上。
请记住,其他ARMv7实现可能会使NEON完全不同。例如,似乎Cortex A-9已经将NEON移近了ARM内核,并且从NEON / VFP返回到ARM的数据移动中具有更低的性能。这是否会影响我不知道的并行调度指令,但这绝对值得注意。