可能看起来类似于: 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被调用,我们正在等待的结果(或者它是这样的)。
注意:
问题:
(图片来自TI Wiki Cortex A8 )
当处理NEON指令时,ARM(或整数流水线)不会处于空闲状态。 在Cortex A8中,NEON处于处理器流水线的“末端”,指令流经流水线,如果是ARM指令,则在流水线“开始”执行,最后执行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核心正在做的事情是谈论指令级别的并行性,而不是任务级别的并行性 。