在C ++中访问原子变量的速度有多快

时间:2011-08-29 13:25:32

标签: c++ atomic c++11

我的问题是通过使用C ++ 0x actomic<>来快速访问C ++中的原子变量。类?什么在缓存级别下降。假设一个线程只是在读它,它是否需要转到RAM或它只能从它正在执行的核心的缓存中读取?假设架构是x86。

我特别感兴趣的是知道一个线程是否只是从它读取,而当时没有其他线程正在写入,惩罚将与读取正常变量相同。如何访问原子变量。每个读取隐含都涉及写入,比如在比较和交换中吗?原子变量是使用compare-and-swap实现的吗?

3 个答案:

答案 0 :(得分:3)

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

另见.NET or Windows Synchronization Primitives Performance Specifications

答案 1 :(得分:3)

如果你想要原始数字,他的优化手册中的Anger Fog data listings应该是有用的,intels manuals还有一些部分详细说明了多核系统上内存读/写的延迟,这应该是包括由原子写入所需的总线锁定引起的减速的详细信息。

答案 2 :(得分:0)

Atomics使用特殊的体系结构支持来获取原子性,而不必强制所有读/写一直到主内存。基本上,允许每个核心探测其他核心的缓存,因此他们可以通过这种方式找到其他线程操作的结果。

确切的性能取决于架构。在x86上,许多操作已经开始是原子的,因此它们是免费的。我已经看到了从10到100个周期的数字,具体取决于架构和操作。从透视角度来看,从主存储器中读取的任何数据都是3000-4000个周期,所以原子数比在几乎所有平台上直接存储都要快得多。