Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >在获得一致性与松弛一致性的原子负载上旋转

在获得一致性与松弛一致性的原子负载上旋转
EN

Stack Overflow用户
提问于 2020-12-31 05:40:35
回答 1查看 191关注 0票数 4

考虑下面的代码:

代码语言:javascript
运行
AI代码解释
复制
// Class member initialization:
std::atomic<bool> ready_ = false;

...

// Core A:
while (!ready_.load(std::memory_order_acquire)) {
  // On x86, you would probably put a `pause` instruction here.
}
// Core A now accesses memory written by Core B.

...

// Core B:
// Core B writes memory.
ready_.store(true, std::memory_order_release);

假设核心A和核心B是两个不同的物理核心(即,它们不是位于同一物理核心上的两个超线程)。Core A上面的代码的性能是比下面的代码差,还是性能相当?请注意,Core A只是执行加载;这不是典型的包含写入的比较交换示例。我对几种架构的答案很感兴趣。

代码语言:javascript
运行
AI代码解释
复制
// Core A:
while (!ready_.load(std::memory_order_relaxed)) {
  // On x86, you would probably put a `pause` instruction here.
}
std::atomic_thread_fence(std::memory_order_acquire);
// Core A now accesses memory written by Core B.

reference page上的邮箱代码暗示底层代码具有更好的性能,因为底层代码避免了“不必要的同步”。然而,邮箱代码在许多原子上迭代,因此获取一致性的同步开销是一个问题,因为您可以使用宽松的一致性来避免对不属于您的邮箱的排序约束。我不清楚在单个获取负载上旋转会对性能产生什么影响。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-12-31 21:39:17

有两种方式,第一个代码可能比第二个代码效率低,至少在一些假设的架构上是这样。在x86上,我猜测它们会编译成相同的代码。

第一个问题是原子负载可能会影响其他处理器的性能。在alpha上,这通常是研究内存一致性的一个很好的“异常值”情况,您可能会一遍又一遍地发出内存屏障指令,这可能会锁定内存总线(在非NUMA机器上),或者做一些其他事情来强制其他两个CPU写入存储的原子性。

第二个问题是屏障会影响所有以前的负载,而不仅仅是ready_的负载。因此,可能在NUMA机器上,ready_实际上命中缓存,因为没有争用,并且您的CPU已经在以独占模式缓存它,但是之前的一些加载正在等待内存系统。现在,您必须停止CPU以等待上一次加载,而不是潜在地继续执行与停止的加载不冲突的指令。下面是一个例子:

代码语言:javascript
运行
AI代码解释
复制
int a = x.load(memory_order_relaxed);
while (!ready_.load(std::memory_order_relaxed))
  ;
std::atomic_thread_fence(std::memory_order_acquire);
int b = y;

在这种情况下,y的加载可能会停止等待x,而如果ready_的加载是通过获取语义完成的,那么x的加载可能会并行继续,直到需要该值。

出于第二个原因,您可能实际上希望以不同的方式构造您的自旋锁。下面是Erik Rigtorp如何在x86上实现自旋锁的建议,你可以很容易地适应你的用例:

代码语言:javascript
运行
AI代码解释
复制
  void lock() {
    for (;;) {
      if (!lock_.exchange(true, std::memory_order_acquire)) {
        break;
      }
      while (lock_.load(std::memory_order_relaxed)) {
        __builtin_ia32_pause();
      }
    }
  }
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65517073

复制
相关文章
Django 2.1.7 模型类 - 字段类型
上一篇Django 2.1.7 模型 - 使用mysql数据库连接访问讲述了如何使用mysql作为数据库,执行模型查询数据,并返回渲染页面。
Devops海洋的渔夫
2019/06/15
1.7K0
gorm字段类型设置成map
想把一个字段设置成 map[string]string 类型,发现在做 db.Create() 的时候报错了。
runzhliu
2022/04/13
2.4K0
gorm字段类型设置成map
【分享】在集简云上架应用如何设置动作字段?
字段是用户要在前端填写的内容,可以在应用授权,设置触发/执行动作时都需要设置,字段在开发后台配置后,用户在使用时可在前端看到对应的字段。
集简云
2022/08/26
1K0
【分享】在集简云上架应用如何设置动作字段?
【分享】在集简云上架应用如何设置动作字段参数?
在开发者平台应用授权和触发/执行字段时都会涉及到字段参数,我们介绍一下各个字段参数的配置。
集简云
2022/08/30
1.1K0
在 Linux 上使用 systemd 设置定时器
定时器增加了另一种启动服务的方式,基于……时间。尽管与定时任务很相似,但 systemd 定时器稍微地灵活一些。让我们看看它是怎么工作的。
用户8989785
2021/09/10
1.7K0
在mysql中如何修改字段类型_MySQL怎么修改字段类型?「建议收藏」
在MySQL中,可以通过alter table语句来修改表中一个字段的数据类型。下面本篇文章就来带大家了解一下alter table语句,介绍如何修改字段类型,希望对大家有所帮助。
全栈程序员站长
2022/09/05
28.4K0
在MacOSX机器上设置JenkinsCI服务器
Jenkins Wiki提供了用于Jenkins安装的选项列表,但没有提及Mac OSX。尽管它提到了Docker,但我只听说过有关Docker的好消息。在本文中,我将坚持使用自制软件。在继续操作之前您需要在Mac上安装和配置JDK。
DevOps云学堂
2020/07/24
2.5K0
mysql的mediumtext类型字段在java如何获取
PO:重点是autoResultMap = true和@TableField(typeHandler = FastjsonTypeHandler.class)
全栈程序员站长
2022/08/30
4K0
mysql的mediumtext类型字段在java如何获取
13. Django 2.1.7 模型类 - 字段类型
上一篇Django 2.1.7 模型 - 使用mysql数据库连接访问讲述了如何使用mysql作为数据库,执行模型查询数据,并返回渲染页面。
Devops海洋的渔夫
2022/01/17
1.3K0
13. Django 2.1.7 模型类 - 字段类型
MySQL的字段类型_mysql数据库字段类型
要了解一个数据库,我们必须了解其支持的数据类型。MySQL 支持大量的字段类型,其中常用的也有很多。前面文章我们也讲过 int 及 varchar 类型的用法,但一直没有全面讲过字段类型,本篇文章我们将把字段类型一网打尽,讲一讲常用字段类型的用法。
全栈程序员站长
2022/10/04
19.9K0
MySQL的字段类型_mysql数据库字段类型
【Python】类型注解 ② ( 基础变量设置类型注解 | 类对象设置类型注解 | 容器变量设置简易类型注解 | 容器变量设置详细类型注解 )
元组 数据容器类型 的 详细 类型注解 , 需要为每个元素都进行类型标记 , 有几个元素就要标记几个类型 ;
韩曙亮
2023/10/11
2610
【Python】类型注解 ② ( 基础变量设置类型注解 | 类对象设置类型注解 | 容器变量设置简易类型注解 | 容器变量设置详细类型注解 )
mysql密码字段类型_MySQL 字段类型
MySQL 的数值数据类型可以大致划分为两个类别,一个是整数,另一个是浮点数或小数。
全栈程序员站长
2022/11/17
14.9K0
mysql密码字段类型_MySQL 字段类型
在 Laravel Eloquent 模型类zhon设置访问器和修改器
前面两篇教程我们陆续为大家介绍了模型类的基本增删改查操作,以及如何通过模型类进行批量赋值和软删除,今天我们继续为大家介绍模型类的高级特性 —— 访问器和修改器。
学院君
2021/01/22
1.5K0
反射类的字段
@Test public void test6() throws Exception { Person person = new Person(); Class c1 = Class.forName("com.lan.reflect.Person"); Field f = c1.getField("name"); //获取字段的值 Object value = f.get(person);
MonroeCode
2018/01/11
6490
mybatis-plus字段类型处理器
文档表明,首先要加@TableName(autoResultMap = true)注解,然后再指定typeHandler
阿超
2022/08/17
1.3K0
mybatis-plus字段类型处理器
MySQL字段类型
字符串类型指CHAR、VARCHAR、BINARY、VARBINARY、BLOB、TEXT、ENUM和SET。该节描述了这些类型如何工作以及如何在查询中使用这些类型。
全栈程序员站长
2022/08/04
9.7K0
blob类型字段[通俗易懂]
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
全栈程序员站长
2022/11/16
3K0
JSPRIT在带时间窗的车辆路径规划问题(VRPTW)上的表现总结
在之前的推文车辆路径优化问题求解工具Jsprit的简单介绍与入门中,相信大家已经对Jsprit这款开源的车辆路径规划问题求解器有了基础的了解,那么Jsprit在具体的车辆路径规划问题上表现到底如何呢?
短短的路走走停停
2019/09/24
1.6K0
JSPRIT在带时间窗的车辆路径规划问题(VRPTW)上的表现总结
iOS 的系统类信息在栈上?
前言 今天有位群友抛出了一个很有意思的问题:为什么系统类的 class 地址比栈区变量更高? image-20210519235852843 iOS 进程内存布局 通常情况下,我们对进程内存的布局
酷酷的哀殿
2021/06/22
8360
iOS 的系统类信息在栈上?
点击加载更多

相似问题

重新发布:在类上找不到mblogBegginer的设置器/字段

111

火基,类文件:在“myclass”上找不到“UserTwo”的设置器/字段

10

在多参数类型类上找不到类型类实例

20

在类问题上找不到类型的setter/字段

112

在类com.example.mayank.messaging.productDetail上找不到详细信息的设置器/字段

120
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档