我在Intel CPU和ARM CPU(Mac / iOS,编译器:Clang)上运行相同的代码。通过分析应用程序,我注意到,在iOS / ARM上,原子操作是前3项,而在英特尔,它们甚至不在前10名。是真的,在ARM原子操作上是那么多慢点? (当然相对)
答案 0 :(得分:4)
需要注意的一点是,由于实施细节,你不一定能看到整个故事。
在ARM的加载链接/存储条件范例下,任何原子操作都在至少 4条指令 - load-exclusive,< operation> 1 ,store - 必要时,有条件的分支重试。其他核心完全没有注意到这一点,并继续做自己的事情。
然而,在x86上,指令可以直接在内存上运行,通常通过在单个指令上粘贴LOCK前缀来实现原子。这意味着两件事:第一,你永远不会被里面原子'例程'打断,因为它只是一条指令。其次,当总线被锁定时,没有其他内核可以访问内存,因此它有效地暂停所有内容的执行,直到它完成 2 。总之,这些意味着采样分析器很少(如果有的话)捕获“正在进行中”的原子操作,无论实际需要多长时间。
[1]好的,这样只需要3个原子交换指令,但其他任何东西在这里都有一个或多个指令。
[2]现代核心的情况略微不那么真实,它们只会锁定自己的缓存,而不是所有,以避免影响访问不相关区域的其他核心,但硬件缓存 - 一致性仍会阻止其他人干预。