ARM在NEON执行操作时是否处于闲置状态?

可能看起来类似于: ARM和NEON可以并行工作吗? ,但不是,我有其他的问题(可能是我的理解有问题):

在协议栈中,我们计算校验和,这是在GPP上完成的,现在我将这个任务交给NEON作为函数的一部分:

下面是我作为NEON的一部分写的校验和function,发布在Stack Overflow: Intrinsics中的Neon的Checksum代码实现

现在,假设从linux这个函数被调用,

ip_csum(){ … … csum = do_csum(); //function call from arm … … } do_csum(){ … … //NEON optimised code … … returns the final checksum to ip_csum/linux/ARM } 

在这种情况下,当NEON执行计算时ARM会发生什么情况? ARM是否闲置? 还是继续与其他操作?

正如你所看到的do_csum被调用,我们正在等待的结果(或者它是这样的)。

注意:

  1. 用cortex-a8来说话
  2. 你可以从链接看到的do_csum是使用intrinsics编码的
  3. 编译使用GNU工具链
  4. 如果您也采取multithreading或任何其他概念,或者在这些相互操作发生时进入画面,那么这样做会很好。

问题:

  1. ARM在NEON执行操作时是否处于闲置状态? (在这个特定的情况下)
  2. 还是搁置这个当前ip_csum相关的代码,并占用另一个进程/线程,直到NEON完成? (我几乎愚蠢到这里发生的事情)
  3. 如果它闲置,我们如何才能使ARM工作到其他的东西,直到NEON完成?

在这里输入图像描述

(图片来自TI Wiki Cortex A8 )

当处理NEON指令时,ARM(或整数流水线)不会处于空闲状态。 在Cortex A8中,NEON处于处理器流水线的“末端”,指令流经流水线,如果是ARM指令,则在流水线“开始”执行,最后执行NEON指令。 每个时钟都沿着流水线向下推指令。

以下是关于如何阅读上图的一些提示:

  • 每个周期,如果可能的话,处理器获取一个指令对(两条指令)。
  • 抓取是流水线操作,因此指令传播到解码单元需要3个周期。
  • 需要5个周期(D0-D4)来解码指令。 再次,这是所有的管道,所以它影响的延迟,但不是吞吐量。 在可能的情况下,更多的指令不断流过管道。
  • 现在我们到达执行/加载存储部分。 NEON指令流经这个阶段(但他们这样做,而其他指令可能正在执行)。
  • 我们到达NEON部分,如果在13个周期前获取的指令是一个NEON指令,则它现在在NEON流水线中被解码和执行。
  • 当发生这种情况时,遵循该指令的整数指令可以在整数流水线中同时执行。
  • 流水线是一个相当复杂的野兽,一些指令是多周期的,有些依赖关系,如果这些依赖关系不符合,将会停顿。 其他事件如分支机构将冲洗管道。

如果你正在执行一个100%NEON指令的序列(这是非常罕见的,因为通常涉及到一些ARM寄存器,控制流等),那么在整数流水线没有任何用处的时候会有一段时间。 大多数代码至少在某些时候会同时执行这两个代码,而巧妙设计的代码可以通过正确的指令组合来最大化性能。

这个Cortex A8的在线工具循环计数器非常适合分析汇编代码的性能,并提供有关以什么单位执行什么以及什么是停滞的信息。

ARM在执行NEON操作时不是“空闲”,而是控制它们。
要充分利用这两个单位的力量,可以仔细规划一个交错的操作顺序:

 loop: SUBS r0,r0,r1 ; // ARM operation addpq.16 q0,q0,q1 ; NEON operation LDR r0, [r1, r2 LSL #2]; // ARM operation vld1.32 d0, [r1]! ; // NEON operation using ARM register bne loop; // ARM operation controlling the flow of both units... 

ARM Cortex-A8可以在每个时钟周期执行多达2条指令。 如果两者都是独立的NEON操作,则在两者之间放置ARM指令是没有用的。 OTOH如果知道VLD(负载)的延迟很大,那么可以将许多ARM指令置于负载和首先使用的负载值之间。 但在每种情况下,组合使用必须提前进行计划和交错。

Application Level Programmers' Model ,你不能真正区分ARM和NEON单元。

虽然NEON是一个单独的硬件单元(可作为Cortex-A系列处理器的一个选件),但它是以紧密的方式驱动它的ARM内核。 它不是一个独立的DSP,您可以以异步方式进行通信。

你可以通过在两个单元上充分利用管道来编写更好的代码,但这与具有单独的核心不一样。

NEON单元在那里,因为它可以做一些操作(SIMD)比ARM单元低得多的速度。

这就像有一个朋友谁擅长数学,只要你有一个很难的问题,你可以问他。 在等待答案时,你可以做一些小的事情,如果答案是这样的,我应该这样做,或者如果不是这样做,但如果你依靠这个答案继续下去,你需要等待他进一步回答。 你可以自己计算答案,但即使包括两个人之间的沟通时间,你自己也可以计算出答案。 我想你甚至可以把这个比喻扩展为“你也需要给朋友买点午餐(能源消费),但是在很多情况下它是值得的”。

任何说ARM核心的人都可以做其他事情,而NEON核心正在做的事情是谈论指令级别的并行性,而不是任务级别的并行性 。