c++中访问原子变量的速度有多快?
How fast is access to atomic variables in C++
我的问题是通过使用c++ 0x actomic<>类访问c++中的原子变量有多快?在缓存层发生了什么。比如说,如果一个线程只是读取它,它需要去RAM还是它可以从它正在执行的核心的缓存中读取?假设架构是x86。
我特别感兴趣的是知道一个线程是否只是从它读取,而当时没有其他线程正在写入,惩罚将与读取正常变量相同。如何访问原子变量。每个读隐含式是否也包括写操作,就像比较-交换操作一样?原子变量是通过使用比较与交换实现的吗?
如果你想要原始数据,Anger Fog的优化手册中的数据列表应该是有用的,此外,英特尔的手册中有几个部分详细说明了多核系统上内存读/写的延迟,其中应该包括由原子写所需的总线锁定引起的慢速的详细信息。
答案可能不像您想象的那么简单。这取决于确切的CPU模型,也取决于具体情况。最糟糕的情况是当您需要对变量执行读-修改-写操作并且存在冲突时(确切的冲突是什么仍然取决于CPU模型,但最常见的是当另一个CPU正在访问相同的缓存行时)。
参见。net或Windows同步原语性能规范
Atomics使用特殊的体系结构支持来获得原子性,而无需强制所有读/写都到主存。基本上,每个内核都可以探测其他内核的缓存,这样它们就可以通过这种方式了解其他线程操作的结果。
确切的性能取决于体系结构。在x86上,许多操作一开始就已经是原子操作了,所以它们是免费的。我看到的数字从10到100个周期不等,这取决于架构和操作。从角度来看,从主存读取需要3000-4000个周期,因此在几乎所有平台上,原子操作都比直接读取内存快得多。
相关文章:
- 如何创建一个CMake变量,除非显式重写,否则使用默认值
- 将成员变量添加到共享库中的类中,不会破坏二进制兼容性吗
- 将数组的地址分配给变量并删除
- 全局变量在 C++ 中是否显着提高了编译速度?
- 使用额外的变量使计算更容易理解 - (多少)我减慢了代码的速度?
- 在条件变量中不使用谓词会导致速度变慢
- 将变量从Python转移到C ,并全速运行C (不是Python速度)
- 访问对象的变量会减慢程序速度 (C++)
- 当局部变量被复制到全局变量时,C++GCC优化速度会减慢
- 访问堆栈变量的速度比取消引用指针慢
- C++-全局变量与局部变量的读/写速度
- 当用文字替换变量用法时,程序速度减慢了很多,为什么
- c/c++中访问const变量的速度
- 如果使用临时变量进行索引,则速度较慢
- 将声明一个全局变量时,做递归内存效率和速度更快
- 在不同优化级别访问gcc/g++中的局部变量与全局变量的速度
- c++中访问原子变量的速度有多快?
- 分配函数值和不分配变量之间的速度差异
- 返回私有类成员的速度是否比使用结构并直接访问该变量慢
- 当使用成员超过函数变量时,在优化/速度方面有任何差异吗?