以下部分可以在Hans Boehm的this article上找到(BTW是一篇非常好的文章,据我所知):
纯顺序一致性的问题
不幸的是,顺序保证太昂贵了 在所有情况下都是一致的执行。例如,重新考虑 以上计划。大多数处理器实际上并不等待初始化 在执行每个中的第二个语句之前完成的赋值 线。初始分配只会导致值1保存 存储缓冲区,它等待复制到内存,但还没有 其他处理器可见。如果要执行两个线程 锁定步骤在不同的处理器上,很可能是r1和 r2将为零,因为x和y的读取都发生在 写入对另一个线程可见。
类似地,编译器通常以违反的方式转换代码 顺序一致性。例如,如果我们的初始示例发生了 作为更大程序的一部分,编译器可能决定移动一个或 r2 = x和r1 = y“加载”操作到开头 他们各自的线程,给他们更多的时间来完成之前 需要r1和r2中的值。导致负载早期发生 本质上相当于延迟商店的硬件;它可以 再次使两个负载读数为零。由于每个操作两次 线程触摸自变量,没有理由了 编译器认为它们不可互换。这种 编译器转换可以产生显着的性能 改进,我们不想禁止它。
从本质上讲,硬件和编译器的性能可能非常相似 优化,重新排序其他人所感知的内存引用 线程。
在降低成本方面进行了大量研究 顺序一致性,包括硬件和更完整的 编译器分析。但大多数专家认为硬件成本是 仍然太高,编译器优化需要太多 有关整个计划的信息通常是可行的。并作为 我们将在下面看到,一般坚持纯顺序一致性 并没有为我们提供任何真正的优势。
经过几次试验后,我能够理解这篇文章,但不包括最后一段。
答案 0 :(得分:4)
“纯顺序一致性”相当于将C ++程序中的每个变量声明为std::atomic
。编译器和处理器在重新排序方面完全被锁定:它们根本不会重新排序内存访问。多线程程序具有非常好的可预测语义,并且比糖蜜慢。第一句中提到的“成本”是纯顺序一致性要求所必需的性能损失。寻找降低成本的方法 - 无论是在硬件中还是通过使编译器更智能地找到更多不会违反纯顺序一致性的优化机会 - 都没有取得丰硕成果。
最后一句“并且,正如我们将在下面看到的那样,坚持纯顺序一致性通常不能为我们提供任何真正的优势。”表明从纯顺序一致性中放松内存排序约束可以大大提高性能,希望不会使内存语义难以理解。