首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >x86放松订购性能?

x86放松订购性能?
EN

Stack Overflow用户
提问于 2015-01-20 16:08:41
回答 2查看 426关注 0票数 4

由于英特尔提供了强大的硬件内存模型,在memory_order_relaxed程序中使用“C++11”有什么好处吗?还是把它放在默认的“顺序一致”中,因为它没有什么区别?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-01-20 16:19:01

就像计算机科学中的大多数答案一样,答案是“这取决于”。

首先,顺序一致的排序不会带来任何惩罚的想法是不正确的。取决于您的代码(可能还包括编译器),它可以而且将受到惩罚。

其次,要做出有关内存排序约束的智能决策,您需要考虑(并理解)如何使用所涉及的数据。

memory_order_relaxed对于像独立计数器这样的东西很有用,它需要是原子的,但与其他东西没有直接关系,所以它不需要与任何“其他东西”相一致。典型的示例是引用计数,例如在shared_ptr或一些较旧的std::string实现中。在这种情况下,我们只需要确保计数器以原子方式递增和递减,并且对它的修改对所有线程都是可见的。但是,特别是,没有任何相关的数据需要与之保持一致,所以我们不太关心它与其他任何事物的排序。

顺序一致的排序几乎是在相反的极端。它可能是最容易应用的--您编写的代码就像它是单线程的,并且实现确保它正确工作(这并不是说您根本不需要考虑线程,但是顺序一致的排序通常需要最少的考虑,但通常也是最慢的模型)。

获取/发布一致性通常在您有两个或多个相关信息时使用,并且您需要确保一个信息在另一个信息之前/之后才可见。举一个我最近讨论过的例子,让我们假设您正在构建类似于内存中的数据库。您有一些数据,也有一些元数据(而且每个元数据或多或少都是分开存储的)。

元数据(除其他外)用于搜索数据库。我们想要确保,如果有人发现了一些特定的数据,他们发现的数据将实际存在于数据库中。

为了确保这一点,我们要确保数据总是在元数据之前存在,并且至少在元数据存在的时间内仍然存在。如果有人可以使用元数据搜索数据库,并找到它想要使用的一些数据,而这些数据实际上并不存在,那么数据库将是不一致的。

因此,在这种情况下,当我们添加一个记录时,我们需要确保我们先添加数据,然后添加元数据--编译器不能重新排列这两个数据。同样,当我们删除记录时,我们需要删除元数据(因此没有人会找到数据),然后删除数据本身。在数据本身的情况下,很可能我们有一个引用计数来跟踪目前有多少客户端正在访问该数据,以确保在有人试图使用数据时我们不会删除它。

因此,在这种情况下,我们可以对元数据和数据使用获取/发布语义,并对引用计数使用轻松的排序。或者,如果我们想保持代码尽可能简单,我们可以在整个过程中使用顺序一致性--尽管它可能(而且可能会)至少会受到一些惩罚。

票数 2
EN

Stack Overflow用户

发布于 2015-01-20 16:22:15

始终使用使代码正确所需的最低保证。

不多也不少。

这样,您就可以避免对实现的任何不必要的依赖,从而减少任何移植成本,并且仍然可以获得最快的程序。

当然,如果您确信您从来不关心任何代码的移植,那么在您知道在平台上不重要的地方采取更有力的保证,可能会使您更容易地提出正确的代码。

更难误用、更容易推理或使用更短的原因也是使用性能较低的构造的完全可以接受的理由。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28049976

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档