C++11 放松原子学与重排序缓冲区

C++11 放松原子学与重排序缓冲区,c++11,memory,cpu,cpu-cache,C++11,Memory,Cpu,Cpu Cache,现代处理器按照顺序执行指令,因此的目的是确保指令的结果通过其发出和提交指针按程序顺序写入。因此,如果我有指令X,Y,Z,实际的执行顺序可能是Y,Z,X,但是任何结果被写回(提交/失效)的顺序是X,Y,Z 现在,我不明白这是如何与C++11放松原子联系在一起的。首先告诉我(我的) 内存顺序描述用户访问计算机内存的顺序 中央处理器。该术语可以指由以下内容生成的内存顺序: 编译器在编译时,或生成的内存顺序 运行时由CPU执行。 …这是一种轻松的一致性: 加载后可以重新排序加载(为了更好地处理缓存一致性

现代处理器按照顺序执行指令,因此的目的是确保指令的结果通过其发出和提交指针按程序顺序写入。因此,如果我有指令X,Y,Z,实际的执行顺序可能是Y,Z,X,但是任何结果被写回(提交/失效)的顺序是X,Y,Z

现在,我不明白这是如何与C++11放松原子联系在一起的。首先告诉我(我的)

内存顺序描述用户访问计算机内存的顺序 中央处理器。该术语可以指由以下内容生成的内存顺序: 编译器在编译时,或生成的内存顺序 运行时由CPU执行。

…这是一种轻松的一致性:

加载后可以重新排序加载(为了更好地处理缓存一致性,更好地扩展)

可以在存储后重新排序加载

存储可以在加载后重新排序存储可以在加载后重新排序

所以我不明白松弛原子学实际上给了我什么,因为任何指令都可以无序执行,但总是必须按照重新排序缓冲区的顺序“提交/失效”

假设:毫无疑问,宽松的一致性不可能允许重新排序缓冲区按照程序集指定的顺序提交/收回指令(从那时起,为什么要使用重新排序缓冲区?),因此我唯一能想到的是——我已经读了很多遍(并且合理地理解了)-它会影响其他内核“查看”写入内存位置的顺序。因此,作为一个简单的例子,在Core1上轻松写入变量X可能不会立即在Core2中可见;然而,对于获取/发布或顺序一致写入,它将是


1)有人能澄清一下我的假设是否正确吗

2)当“存储字”指令被重新排序缓冲区失效时,在硬件级别上,当该存储“松弛”时与“顺序一致”时会发生什么不同?肯定是因为藏匿处吧?有点像“当你想的时候,把这个值推到其他缓存中”,而不是“现在把它推到所有其他缓存中”(或者这是错误的?)



在发布我的问题(仅供参考)之前,我已经广泛搜索了这方面的信息。

就内存排序而言,放松原子学对非原子变量没有任何帮助。你只能得到“原子”方面。C++ >代码> STD::原子< /代码>语义不真正映射1:1到重新排序缓冲存储-它们是不同的抽象级别(当考虑到<代码> STD::原子< /代码>甚至可能在必要时使用锁)时,这变得很清楚。Wikipedia对内存顺序的定义不必映射到
std::atomic
的工作方式上。换句话说,如果
std::atomic
对CPU上的无序执行不做任何处理,那么任何地方都不会有矛盾。仅仅提到“内存排序”和相关术语并不意味着两者以任何方式相互作用。@j6t从语言语义学的角度来看,你得到的不仅仅是原子性:你得到的事实是竞争条件就是这样,而不是被禁止的“数据竞争”。就内存排序而言,放松原子学对非原子变量没有任何帮助。你只能得到“原子”方面。C++ >代码> STD::原子< /代码>语义不真正映射1:1到重新排序缓冲存储-它们是不同的抽象级别(当考虑到<代码> STD::原子< /代码>甚至可能在必要时使用锁)时,这变得很清楚。Wikipedia对内存顺序的定义不必映射到
std::atomic
的工作方式上。换句话说,如果
std::atomic
对CPU上的无序执行不做任何处理,那么任何地方都不会有矛盾。仅仅提到“内存顺序”和相关术语并不意味着两者以任何方式交互。@j6t从语言语义的角度来看,你得到的不仅仅是原子性:你得到的事实是竞争条件就是这样,而不是被禁止的“数据竞争”。