Aarch64 上 C++11 原子的部分重新排序

2024-02-06

我正在看gcc 的 rmw 原子的编译器输出 https://goo.gl/ZWLeCJ并注意到一些奇怪的事情 - 在 Aarch64 上,诸如 fetch_add 之类的 rmw 操作可以通过宽松的负载进行部分重新排序。

在 Aarch64 上,可能会生成以下代码value.fetch_add(1, seq_cst)

.L1:
    ldaxr x1, [x0]
    add x1, x1, 1
    stlxr w2, x1, [x0]
    cbnz L1

但是,在 ldaxr 之前发生的加载和存储可能会被重新排序,超过 stlxr 之后发生的加载和加载/存储(请参阅here http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.den0024a/CJAIAJFI.html)。 GCC 不会添加围栏来防止这种情况 - 下面是一小段代码演示了这一点:

void partial_reorder(std::atomic<uint64_t> loader, std::atomic<uint64_t> adder) {
    loader.load(std::memory_order_relaxed); // can be reordered past the ldaxr
    adder.fetch_add(1, std::memory_order_seq_cst);
    loader.load(std::memory_order_relaxed); // can be reordered past the stlxr
}

生成

partial_reorder(std::atomic<int>, std::atomic<int>):
    ldr     w2, [x0] @ reordered down
.L2:
    ldaxr   w2, [x1]
    add     w2, w2, 1
    stlxr   w3, w2, [x1]
    cbnz    w3, .L2
    ldr     w0, [x0] @ reordered up
    ret

实际上,负载可以通过 RMW 操作进行部分重新排序 - 它们发生在 RMW 操作的中间。

那么,有什么大不了的呢?我在问什么?

  1. 原子操作本身是可分的,这似乎很奇怪。我在标准中找不到任何阻止这种情况的内容,但我相信存在隐含操作不可分割的规则组合。

  2. 这似乎不尊重获取顺序。如果我在此操作之后直接执行加载,我可以看到 fetch_add 和后面的操作之间的存储-加载或存储-存储重新排序,这意味着后面的内存访问在获取操作之后至少部分地重新排序。同样,我在标准中找不到任何明确说明不允许这样做的内容,并且获取是加载排序,但我的理解是获取操作适用于整个操作,而不仅仅是其中的一部分。类似的场景也适用于通过 ldaxr 重新排序某些内容的版本。

  3. 这可能会进一步扩展排序定义,但 seq_cst 操作之前和之后的两个操作可以相互重新排序似乎是无效的。如果边界操作各自重新排序到操作的中间,然后相互超越,则可能会发生这种情况。


看起来你是对的。至少,非常相似海湾合作委员会的错误 https://gcc.gnu.org/bugzilla/show_bug.cgi?id=65697已被接受并修复。

他们提供了这个代码:

.L2:
    ldaxr   w1, [x0]       ; load-acquire (__sync_fetch_and_add)
    add w1, w1, 1
    stlxr   w2, w1, [x0]   ; store-release  (__sync_fetch_and_add)
    cbnz    w2, .L2

所以以前的操作可以重新排序ldaxr进一步的操作可以重新排序stlxr,这打破了 C++11 确认。文档 http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.den0024a/CHDCJBGA.html对于 aarch64 上的障碍,清楚地解释了这种重新排序是可能的。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Aarch64 上 C++11 原子的部分重新排序 的相关文章

  • 我如何理解这个 C 类型声明?

    double bar int double double double double 在查看讲座幻灯片时 我发现了留给学生的练习 用简单的英语来说 什么是类型bar在这个 C 声明中 Please帮助我解决这个问题 我什至不知道从哪里开始
  • 为什么在创建矩阵类时使用向量不好?

    对于我的矩阵类 我做了 template
  • 更改 Qt OpenGL 窗口示例以使用 OpenGL 3.3

    我正在尝试更改 Qt OpenGL 示例以使用更现代的 opengl 版本 330 似乎合适 所以我做了 在 main cpp 上设置版本和配置文件 设置着色器版本 更改着色器以使用统一 它现在构建没有任何错误 但我只看到一个空白窗口 我错
  • 如何在 C# / .NET 中创建内存泄漏[重复]

    这个问题在这里已经有答案了 可能的重复 托管代码中是否可能存在内存泄漏 特别是 C 3 0 https stackoverflow com questions 6436620 is it possible to have a memory
  • 读取 C# 中的默认应用程序设置

    我的自定义网格控件有许多应用程序设置 在用户范围内 其中大部分是颜色设置 我有一个表单 用户可以在其中自定义这些颜色 并且我想添加一个用于恢复默认颜色设置的按钮 如何读取默认设置 例如 我有一个名为的用户设置CellBackgroundCo
  • 防止 boost::asio::io_context 在空轮询调用时停止

    此代码调用发布的句柄 boost asio io context ioc boost asio post ioc std cout lt lt lol lt lt std endl ioc poll 而这并没有 boost asio io
  • 根据 N 个值中最小的一个返回不同的结果

    不确定如何使标题更具描述性 所以我只是从一个例子开始 我使用下面的代码位 它从枚举中选择一个方向 具体取决于四个轴中哪一个与给定方向相比形成最小角度 static Direction VectorToDirection Vector2 di
  • 与 Qt 项目的静态链接

    我有一个在 Visual Studio 2010 Professional 中构建的 Qt 项目 但是 当我运行它 在调试或发布模式下 时 它会要求一些 Qt dll 如果我提供 dll 并将它们放入 System32 中 它就可以工作 但
  • 时间:2019-03-17 标签:c#ThreadSafeDeepCopy

    我一直在阅读很多其他问题以及大量谷歌搜索 但我一直无法找到明确的解决方案 根据我读过的一些最佳实践 类的静态方法应该创建线程安全的 并且实例成员应该将线程安全留给消费者 我想为该类实现深度复制方法 该类本身还有其他引用类型成员 有没有什么方
  • fprintf() 线程安全吗?

    我正在为野人就餐问题的某些变量编写一个 C 解决方案 现在 我创建线程 每个线程都将 FILE 获取到同一个调试文件 在线程内我正在使用 fprintf 进行一些打印 打印的语句不受任何类型的互斥锁等保护 我没有在调试文件中观察到任何交错行
  • 类的成员复制

    在学习 复制成员 概念时 书中给出了如下说法 此外 如果非静态成员是引用 const 或没有复制赋值的用户定义类型 则无法生成默认赋值 我不太明白这个声明到底想传达什么 或者说这个说法指的是哪一种场景 谢谢 该语句与编译器自动为您编写的类
  • 如何获取 QTableView 的标题列表?

    我有一个QTableView我的对话框中的对象 我需要访问该表的水平标题并将它们放入QStringList object 尽管进行了大量搜索 但我在 Qt 文档中找不到如何获取此标头列表 编辑 我发现的最接近的地方是this https w
  • 从 WebBrowser 控件 C# 获取滚动值

    我试图在 WebBrowser 控件中获取网页的 Y 滚动索引 但无法访问内置滚动条的值 有任何想法吗 对于标准模式下的 IE 使用文档类型 正如你所说 scrollTop是的财产元素 而不是 HtmlDocument htmlDoc th
  • 如何在服务器端按钮点击时关闭当前标签页?

    我尝试在确认后关闭当前选项卡 因此我将以下代码放在确认按钮的末尾 但选项卡没有关闭 string jScript ClientScript RegisterClientScriptBlock this GetType keyClientBl
  • 给出 5 个参数,但在终端中只得到 3 个参数

    我想将一个文件传递给一个c 程序 如果我在 IDE 中执行此操作 test string string lt test txt return argc 5 但在终端上我刚刚得到argc 3 看来 这是因为 什么是 lt 意思是 我正在使用
  • C# 中的 strstr() 等效项

    我有两个byte 我想找到第二个的第一次出现byte 在第一个byte 或其中的一个范围 我不想使用字符串来提高效率 翻译第一个byte to a string会效率低下 基本上我相信就是这样strstr 在 C 中做 最好的方法是什么 这
  • 我可以让 ungetc 取消阻止阻塞的 fgetc 调用吗?

    我想在收到 SIGUSR1 后使用 ungetc 将 A 字符重新填充到标准输入中 想象一下我有充分的理由这样做 调用 foo 时 stdin 中的阻塞读取不会被收到信号时的 ungetc 调用中断 虽然我没想到它会按原样工作 但我想知道是
  • IEnumerable.Except 不起作用,那么我该怎么办?

    我有一个 linq to sql 数据库 非常简单 我们有 3 个表 项目和用户 有一个名为 User Projects 的连接表将它们连接在一起 我已经有了一个获得的工作方法IEnumberable
  • Log4j2 ThreadContext 映射不适用于parallelStream()

    我有以下示例代码 public class Test static System setProperty isThreadContextMapInheritable true private static final Logger LOGG
  • QFileDialog::getSaveFileName 和默认的 selectedFilter

    我有 getSaveFileName 和一些过滤器 我希望当用户打开 保存 对话框时选择其中之一 Qt 文档说明如下 可以通过将 selectedFilter 设置为所需的值来选择默认过滤器 我尝试以下变体 QString selFilte

随机推荐

  • Hashtable 与 HashMap 中的哈希函数?

    我知道Hashtable和HashMap之间的区别 然而 这两个类似乎都在使用哈希函数完成工作 Hashtable中使用的哈希函数和HashMap中使用的哈希函数有区别吗 特别是 他们使用的哈希算法有区别吗 这两个类中用于散列的公式是什么
  • Rails 3 命名空间和自定义类的问题(未初始化常量)

    我的 Rails 3 2 11 项目中有一个名为app queries visible discussions rb如下所示 class VisibleDiscussions end 我想为查询命名空间 以便我可以使用类似的方法来调用它Qu
  • 当我在存储库中丢失一些修订时,如何转储所有 svn 数据?

    我想转储旧的 svn 源并将其加载到我的新计算机上 我的旧 svn 存储库大约有 100GB 大 当我使用svnadmin dump xx Repositoryfile gt mydump为了转储 svn 文件 我得到了一个 512Mb 大
  • 如何使用Rcpp来加速for循环?

    我创建了一个 for 循环 我想使用 Rcpp 库来加速它 我对C 不太熟悉 你能帮我让我的功能更快吗 感谢您的帮助 我已经包含了我的算法 代码 输入和输出以及 sessionInfo Here is 我的算法 如果当前价格高于先前价格 则
  • Android Studio:恢复“清除只读状态”对话框

    如果源文件是只读的 Android Studio 将显示一个对话框 询问我是否要清除文件的只读状态 以便可以进行编辑 我曾经错误地选中了 不再显示此对话框 的框 然后单击 确定 从那时起 Android Studio 只是清除文件的只读状态
  • WPF DataGrid 过滤 - CollectionViewSource 刷新

    我想知道如何在单击按钮时刷新 CollectionViewSource 到目前为止我已经
  • ExtJS中有map()函数吗?

    ExtJS有Ext each 函数 但是map 是否也隐藏在某处 我已经很努力了 但还没有找到任何可以填补这个角色的东西 这似乎是一些简单而琐碎的事情 像 Ext 这样大的 JS 库显然必须具备 或者当 Ext 确实不包含它时 将其添加到
  • 是否可以在 django 中指定外部 URL 名称

    我刚刚开始在 Django 中命名我的 URL 模式 因此如果我想更改 URL 模式 我只需在一处更改它即可 例如 url r HomeListView as view name home 并在我的模板中引用它 如下所示 url home
  • 如何跳出父函数?

    如果我想打破一个函数 我可以调用return 如果我在子函数中并且想跳出调用子函数的父函数怎么办 有没有办法做到这一点 一个最小的例子 def parent print Parent does some work print Parent
  • Python午夜时间对比

    我必须节省时间AM PM format 但我在决定如何输入午夜时间时遇到困难 假设时间是晚上 9 点到第二天早上 6 点 我必须把它分成日常的基础 像这样 t1 datetime datetime strptime 09 00PM I M
  • 检查两个集合中是否存在任何元素

    我想知道 Linq 是否有一种方法来检查两个集合是否至少有一个共同元素 我期待这样的事情 var listA new List
  • 将包含“id,attribute,value”列的表转换为“id,attribute1,attribute2,...”

    我在数据库中有一个表 如下所示 CustomerId Attribute Value 30 Name John 30 Surname Smith 30 Phone 555123456 为了充分利用这些数据 我需要让它看起来像某样东西 像这样
  • Spritebatch.Begin() 变换矩阵

    我一直想知道 spriteBatch 中的变换矩阵是如何实现的 我创建了一个2D相机 变换矩阵如下 if needUpdate transformMatrix Matrix CreateTranslation Position X Posi
  • 能否强制 AVFoundation 播放本地 .ts 文件?

    显然 AVFoundation 和 Quicktime X 可以解复用并正确播放编码 ts容器 因为 tsHTTPS 实时流媒体底层的容器 缺乏建立本地网络服务来服务 m3u8以及相关的 ts文件 我真的希望能够 说服AVURLAsset
  • 如何使用 CoreNLP 的 RegexNER 检测具有超过 1 个单词的命名实体?

    我在 CoreNLP 中使用 RegexNER 注释器 我的一些命名实体由多个单词组成 摘自我的映射文件 RAF 抑制剂 DRUG CLASS 吉尔伯特综合症 疾病 第一个被检测到 但每个单词都获得注释 DRUG CLASS 并且似乎没有办
  • 有什么办法可以将表格中的某些列居中吗?

    我广泛使用 css 格式并为表定义类 其中包含 thead tbody tfoot 的子类以及 tr th td 的另一级子类 在某些情况下 我想让表的整列具有特定样式的类 但不知道该怎么做 有没有什么方法 使用 HTML5 CSS3 其他
  • Linq .Contains 包含大集合会导致 TDS 错误

    我有点过于简单化了 因为我正在寻找通用的答案 假设我有一个这样的表设置 Parent recno int unique pk date datetime stuff varchar 50 Child parentrecno int fk P
  • Android Studio 调试错误“连接被拒绝”

    我知道以前有人问过这个问题 但我尝试了所有建议的解决方案 但还没有解决我的问题 我无法使用 Mac Yosemite 调试任何 Android studio 1 5 预览版 2 应用程序 我得到的错误是 Unable to open deb
  • 建议像 google 一样使用 postgresql trigrams 和全文搜索

    我想做一个文本搜索 我在用着PostgreSQL http www postgresql org 因为神奇的Postgis http postgis refractions net 我正在考虑使用FTS http www postgresq
  • Aarch64 上 C++11 原子的部分重新排序

    我正在看gcc 的 rmw 原子的编译器输出 https goo gl ZWLeCJ并注意到一些奇怪的事情 在 Aarch64 上 诸如 fetch add 之类的 rmw 操作可以通过宽松的负载进行部分重新排序 在 Aarch64 上 可