Arm 手臂和霓虹灯可以并行工作吗?

Arm 手臂和霓虹灯可以并行工作吗?,arm,inline-assembly,simd,neon,cortex-a8,Arm,Inline Assembly,Simd,Neon,Cortex A8,这是关于问题: 将链接中列出的子问题作为单独的问题打开。因为多个问题不能作为单个线程的一部分来提问 不管怎样,我要问的是: 手臂和霓虹灯(就手臂皮质-a8架构而言)真的可以并行工作吗?我怎样才能做到这一点 有人能告诉我或分享一些使用ARM-NEON交互操作的示例实现(伪代码/算法/代码,而不是理论实现论文或讲座)吗?(可以使用intrinsic或内联asm实现。)答案取决于ARM CPU。例如,Cortex-A8使用协处理器来实现NEON和VFP指令,这些指令通过FIFO连接到ARM内核。当指

这是关于问题:

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

不管怎样,我要问的是:

手臂霓虹灯(就手臂皮质-a8架构而言)真的可以并行工作吗?我怎样才能做到这一点


有人能告诉我或分享一些使用ARM-NEON交互操作的示例实现(伪代码/算法/代码,而不是理论实现论文或讲座)吗?(可以使用intrinsic或内联asm实现。)

答案取决于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指令读取内存,这都没有多大关系)。在这种情况下,主臂磁芯暂停,直到霓虹灯磁芯清空FIFO,即最多20个周期左右

ARM内核通常能以比NEON/VPF协处理器更快的速度将NEON/VPF指令排入队列。您可以利用这一点,通过适当的指令交错,使两个内核并行工作。例如,在每两条或三条指令块后插入一条ARM指令。或者,如果您还想利用ARM的双重问题功能,可以使用两个ARM指令。要做到这一点,您必须使用内联汇编——如果您使用intrinsic,则指令的精确调度取决于编译器,而编译器是否有足够的智能来适当地交错它们是任何人的猜测。 您的代码看起来像

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

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


记住,其他ARMv7实现可能实现完全不同的NEON。例如,皮质A-9似乎将NEON移动到了更靠近手臂核心的位置,并且在NEON/VFP返回手臂的数据移动上,NEON/VFP的移动速度要低得多。我不知道这是否会影响指令的并行调度,但这绝对值得注意。

简短回答:是的,只要它们不共享相同的内存。同步内存访问非常慢,将字节从NEON寄存器移动到ARM寄存器也非常慢。比较快的是将ARM regs移动到NEON regs note,这是唯一的指令级并行。另外,请注意NEON单元有相当长的管道,向量和单元之间的控制或寄存器传输以及整数单元之间的传输会带来相当大的损失。感谢@fgp,这确实是一个很好的解释。回答了我很多其他的问题。如果有人能给我介绍一些利用arm neon的特性使用内联汇编的实现,我将不胜感激。我在谷歌上找不到多少东西。