ARMv8.1中为何恢复对SWP的支持?
本文是原「蜗窝讨论区」的历史存档(2017-01-20),来自版块「Linux kernel技术问答」,共 2 帖。讨论区已停止服务,此处仅供查阅。
在ARMv8-A中,SWP指令被认为是obsolete的,感觉这条指令要慢慢被淘汰的样子,不过,这几天,在阅读ARMv8.1文档的时候,赫然发现在ARMv8.1引入的若干原子操作指令中有SWP指令。看起来很神奇,呵呵~~~表面上看起来一条指令的事,不过深究起来,应该是ARMv8和ARMv8.1在原子操作指令上面的思路是不一样的: 1、ARMv8倾向于使用Exclusive access instructions来解决read-modify-write的原子操作性。 2、ARMv8.1提供了专门的atomic instructions来解决read-modify-write的原子操作性。 为何做这样的改变呢?我的想法是: 1、 对于Exclusive access instructions来说,ARMv8文档描述的很清楚了,其实就是放了global monitor和local monitor来监视总线,如果有其他的bus master插入,那么重新来过。这种机制在cpu core比较少的情况下,运作应该是基本OK的,不过,随着cpu core数量的增多,重来的机会(或者说其他CPU插入的机会)也随之上升,从而导致性能急剧下降。 2、 ARMv8.1的atomic instructions应该锁总线的吧(我猜的),在CPU core少的时候,各个CPU之间的冲突没有那么剧烈,武断的锁住总线实际上应该是阻碍了其他CPU core上指令的执行。当core多到一定程度,冲突加剧,试错重来的机制应该不如统一步伐(只让一个cpu core发起总线访问)机制。
有没有对ARM处理器比较了解的同学,出来讲讲。
和其他工程师讨论之后,可以认定我的想法2是错误的。 在ARMv8.1中原子指令不是采用锁总线的方式,因为本身锁总线的方式效率异常的差。因为一个CPU core因为执行了原子操作(访问memory X)而锁住总线,实际上禁止了其他所有核上的总线访问操作,而实际上应该禁止的是其他核上针对该memory X的访问而不是一棍子打死,锁住总线,禁止cpu core对所有memory的访问。但是,毫无疑问,当cpu core不断增多,Exclusive access instructions指令性能急剧下降,肯定要进行优化,否则,ARMv8.1中也不会提供原子指令操作了。 具体ARMv8.1中如何实现原子指令操作呢?目前的细节还是没有讨论清楚,但是这个功能模块应该是位于系统中所有cpu core访问memory的汇聚点处(例如L3 cache)。而实际的read-modify-write的原子操作性在系统中应该是被分解成两个bus transaction,例如对地址X的原子操作应该包括Read X和write X,而在L3 cache中的功能模块的功能包括: 1、识别原子操作指令中的Read X 2、pending所有对X地址的操作 3、对其他地址的操作正常 4、检测到write X操作之后,一切恢复正常
一句话总结,lock bus是把处理原子操作那个功能模块放置到靠近cpu core附近的位置,限制了cpu core的发挥,放到远端的memory hierachy的某个节点上应该可以加快cpu性能。
BTW,一切都是猜测......
