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 原子的部分重新排序 的相关文章

随机推荐

  • 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 上 可