c++中访问原子变量的速度有多快?

How fast is access to atomic variables in C++

本文关键字:速度 变量 访问 c++      更新时间:2023-10-16

我的问题是通过使用c++ 0x actomic<>类访问c++中的原子变量有多快?在缓存层发生了什么。比如说,如果一个线程只是读取它,它需要去RAM还是它可以从它正在执行的核心的缓存中读取?假设架构是x86。

我特别感兴趣的是知道一个线程是否只是从它读取,而当时没有其他线程正在写入,惩罚将与读取正常变量相同。如何访问原子变量。每个读隐含式是否也包括写操作,就像比较-交换操作一样?原子变量是通过使用比较与交换实现的吗?

如果你想要原始数据,Anger Fog的优化手册中的数据列表应该是有用的,此外,英特尔的手册中有几个部分详细说明了多核系统上内存读/写的延迟,其中应该包括由原子写所需的总线锁定引起的慢速的详细信息。

答案可能不像您想象的那么简单。这取决于确切的CPU模型,也取决于具体情况。最糟糕的情况是当您需要对变量执行读-修改-写操作并且存在冲突时(确切的冲突是什么仍然取决于CPU模型,但最常见的是当另一个CPU正在访问相同的缓存行时)。

参见。net或Windows同步原语性能规范

Atomics使用特殊的体系结构支持来获得原子性,而无需强制所有读/写都到主存。基本上,每个内核都可以探测其他内核的缓存,这样它们就可以通过这种方式了解其他线程操作的结果。

确切的性能取决于体系结构。在x86上,许多操作一开始就已经是原子操作了,所以它们是免费的。我看到的数字从10到100个周期不等,这取决于架构和操作。从角度来看,从主存读取需要3000-4000个周期,因此在几乎所有平台上,原子操作都比直接读取内存快得多。