C++ 我无法理解下文最后一段的意思

C++ 我无法理解下文最后一段的意思,c++,multithreading,optimization,c++11,C++,Multithreading,Optimization,C++11,以下部分可以在Hans Boehm的网站上找到(顺便说一句,据我所知,这是一篇非常好的文章): 纯顺序一致性问题 不幸的是,它的成本太高,无法按顺序保证 在所有案件中执行一致的死刑。例如,重新考虑 上面的程序。大多数处理器实际上并不等待初始值 在执行每个语句中的第二个语句之前要完成的赋值 线初始指定只会导致值1保存在中 一种存储缓冲区,它等待复制到内存中,但尚未复制到内存中 对另一个处理器可见。如果这两个线程要在 在不同的处理器上锁定步骤,r1和 r2将为零,因为x和y的读取都发生在 写入对另一

以下部分可以在Hans Boehm的网站上找到(顺便说一句,据我所知,这是一篇非常好的文章):

纯顺序一致性问题

不幸的是,它的成本太高,无法按顺序保证 在所有案件中执行一致的死刑。例如,重新考虑 上面的程序。大多数处理器实际上并不等待初始值 在执行每个语句中的第二个语句之前要完成的赋值 线初始指定只会导致值1保存在中 一种存储缓冲区,它等待复制到内存中,但尚未复制到内存中 对另一个处理器可见。如果这两个线程要在 在不同的处理器上锁定步骤,r1和 r2将为零,因为x和y的读取都发生在 写入对另一个线程可见

类似地,编译器通常以违反规则的方式转换代码 顺序一致性。例如,如果我们最初的例子发生了 作为大型程序的一部分,编译器可能决定移动一个或多个 r2=x和r1=y两个操作都“加载”到 他们各自的线程,给他们更多的时间来完成之前 需要r1和r2中的值。导致负载提前发生 本质上相当于硬件延迟存储;它可以 再次使两个负载的读数均为零。因为这两个操作各有一个 线程接触自变量,没有理由 编译器认为它们是不可互换的。这种 编译器转换可以产生显著的性能 改进,我们不想否定它

实际上,硬件和编译器的性能可能非常相似 按照其他人的感觉重新排列内存引用的优化 线程

在降低成本方面已经进行了大量的研究 在硬件上和通过更完整的 编译器分析。但大多数专家认为硬件成本很高 仍然太高,并且编译器优化需要太多 关于整个计划的信息通常是可行的。以及 我们将在下面看到,通常坚持纯粹的顺序一致性 不会给我们带来任何真正的优势

经过几次试验,我对文章的理解,直到最后一段都没有,但

> P>“纯序贯一致性”等同于在C++程序中声明每个变量为<代码> STD::原子< /代码>。编译器和处理器在重新排序方面完全被锁定:它们根本不可能重新排序内存访问。多线程程序将具有非常好的可预测语义,并且比糖蜜程序慢。第一句中提到的“成本”是由于纯粹顺序一致性的要求而导致的性能损失。寻找降低成本的方法的研究——无论是在硬件方面,还是通过使编译器更智能以找到更多不违反纯顺序一致性的优化机会——都没有取得成果

最后一句话“而且,正如我们将在下面看到的,坚持纯粹的顺序一致性通常不会给我们带来任何真正的优势。”表明从纯粹的顺序一致性中放松内存顺序约束可以极大地提高性能,希望不会使内存语义变得不可理解。

“纯序列一致性“等效于声明C++程序中的每个变量为代码> STD::原子< /代码>。编译器和处理器在重新排序方面完全被锁定:它们根本不可能重新排序内存访问。多线程程序将具有非常好的可预测语义,并且比糖蜜程序慢。第一句中提到的“成本”是由于纯粹顺序一致性的要求而导致的性能损失。寻找降低成本的方法的研究——无论是在硬件方面,还是通过使编译器更智能以找到更多不违反纯顺序一致性的优化机会——都没有取得成果


最后一句话“而且,正如我们将在下面看到的,坚持纯粹的顺序一致性通常不会给我们带来任何真正的优势。”表明从纯粹的顺序一致性中放松内存顺序约束可以极大地提高性能,希望不会使内存语义变得难以理解。

是的,我们正试图这样做,但它的成本很高,并没有真正给我们带来任何东西。你能详细说明你对最后一段不清楚的地方吗?我认为它说“设计成顺序一致的硬件太慢或太贵,需要始终生成顺序一致代码的编译器需要太复杂的分析”。@dyp例如:
需要始终生成顺序一致代码的编译器需要太复杂的分析。这对我来说没有意义。允许安全优化,即在“仿佛”规则下不破坏顺序一致执行的优化,将需要太多的分析。是的,我们正在尝试这样做,但成本很高,并不能真正让我们得到任何东西。你能详细说明你对最后一段不清楚的地方吗?我认为它说“设计成顺序一致的硬件太慢或太贵,需要始终生成顺序一致代码的编译器需要太复杂的分析”。@dyp例如:
需要始终生成顺序一致代码的编译器需要太复杂的分析。这对我来说没有意义。允许安全优化,即在“仿佛”规则下不破坏顺序一致执行的优化,需要进行太多的分析。