我正在为Android开发一个本机库,我在其中使用ARM程序集优化和多线程,以便在双核ARM芯片组MSM8660上获得最大性能。在做一些测量时,我注意到以下几点:
我试过在网上搜索解释为什么会这样,但到目前为止还没找到。几乎所有内核都共享相同的NEON管道或类似内容,但所有原理图似乎都表明每个内核都应该有自己的NEON单元。有谁知道为什么会这样?
答案 0 :(得分:1)
首先,您使用的是哪个库?
你是对的,每个核心都有它自己的NEON单元,然而它是自己专有的'VeNum'单元并没有提供太多关于它的信息,它是专为8x50的基于Cortex-A8的Scorpion而设计的比ARM自己实现的NEON SIMD更好,但是他们(qcom)以与基础参考设计兼容的方式设计他们的硬件是一个很好的解决方案,所以大多数的cortex-A8代码都可以与Scorpion一起工作,尽管有些由于可能的指令时序不同而导致性能下降。
如果您正在使用“softfp”来编译程序,那么对于您调用的每个使用浮点参数的函数,您将有大约20个周期的开销,或者使用NEON单元将寄存器数据从ARM内核传输到霓虹灯单元反之亦然,有时可以使核心停滞多次,等待管道冲洗。
对于使用浮点单元的线程程序,内核必须在上下文切换期间保存FP寄存器,这样会对线程造成额外的损失,因为我们已经知道从氖到臂的移动寄存器很慢并且已知会阻止管道
此外还有许多其他因素会导致这种情况,例如编译器的错误优化,缓存未命中,不使用scorpion的双重问题,错误的指令调度以及重复地将线程从一个核心切换到另一个核心。
答案 1 :(得分:0)
这可能是因为缓存未命中。没有更多信息就很难说清楚。
答案 2 :(得分:0)
我的猜测是因为刷新NEON管道涉及额外的周期惩罚。 NEON管道落后于核心的其余部分,因此您会看到错过分支的额外周期惩罚等等。
如果线程必须经常同步,或者你有很多锁,我认为你会看到与NEON的重大惩罚。
如果代码令人尴尬地并行并且线程之间的通信很少且很少,那么利用NEON来获得多线程代码的整体性能提升的唯一方法就是如此。