ARM原子性能

Ist*_*ády 5 c++ multithreading arm atomic intel

我在Intel CPU和ARM CPU(Mac / iOS,编译器:Clang)上运行相同的代码。通过对应用程序进行性能分析,我注意到,在iOS / ARM上,原子操作是前三项,而在英特尔上,它们甚至不在前十位。是真的,在ARM原子操作上速度慢得多吗?(当然)

Not*_*hat 3

需要注意的一点是,由于实施细节的原因,您不一定能看到整个故事。

在 ARM 的加载链接/条件存储范例下,任何原子操作都至少有4条指令 - 加载独占、 <操作> 1、存储独占、必要时重试的条件分支。其他所有核心都完全忽视这一点并继续做自己的事情。

然而,在 x86 上,指令可以直接在内存上操作,原子通常是通过在单个指令上添加 LOCK 前缀来实现的。这意味着两件事:首先,你的原子“例程”内永远不会被打断,因为它是一条指令。其次,当总线锁定时,没有其他内核可以访问内存,因此它有效地暂停所有内容的执行,直到完成2。总之,这些意味着采样分析器很少(如果有的话)捕获“正在进行的”原子操作,无论它实际需要多长时间。

[1] 好的,这使得原子交换只有 3 条指令,但其他任何东西都在中间有一条或多条指令。

[2] 对于现代内核来说,情况稍差一些,现代内核只会锁定自己的缓存,而不是所有内容,以避免影响访问不相关区域的其他内核,但硬件缓存一致性仍然会防止其他人干扰。