GCC 内存屏障 __sync_synchronize 与 asm 易失性("": : :"内存")

2023-12-22

asm volatile("": : :"memory")通常用作内存屏障(例如,如 Linux 内核中所示)barrier macro).

这听起来类似于 GCC 内置的__sync_synchronize http://gcc.gnu.org/onlinedocs/gcc-4.6.2/gcc/Atomic-Builtins.html does.

这两个相似吗?

如果不是,有什么区别,什么时候使用一个而不是另一个?


有一个显着的区别 - 第一个选项(内联 asm)实际上在运行时不执行任何操作,那里没有执行任何命令,并且 CPU 不知道它。它仅在编译时起作用,告诉编译器不要将加载或存储移动到此点之外(向任何方向),作为其优化的一部分。它被称为 SW 屏障。

第二个屏障(内置同步)将简单地转换为硬件屏障,如果您使用的是 x86 或其他架构中的等效项,则可能是栅栏(mfence/sfence)操作。 CPU 还可能在运行时进行各种优化,最重要的一个实际上是无序执行操作 - 该指令告诉它确保加载或存储不能通过这一点,并且必须在正确的一侧进行观察同步点。

Here's http://bruceblinn.com/linuxinfo/MemoryBarriers.html另一个很好的解释:

内存屏障的类型

如上所述,编译器和处理器都可以优化指令的执行,从而需要使用 记忆障碍。影响编译器和 处理器是一个硬件内存屏障,并且是一个内存屏障 唯一影响编译器的是软件内存屏障。

除了硬件和软件内存屏障之外,还有内存屏障 可以限制为内存读取、内存写入或两者。一段回忆 影响读取和写入的屏障是完整内存屏障。

还有一类特定于的内存屏障 多处理器环境。这些内存屏障的名称是 前缀为“smp”。在多处理器系统上,这些障碍是 硬件内存屏障和单处理器系统上,它们是 软件内存屏障。

Barrier() 宏是唯一的软件内存屏障,它是一个 完整的内存屏障。 Linux 内核中的所有其他内存屏障都是 硬件障碍。硬件内存屏障是隐含的软件 障碍。

SW 屏障何时有用的示例:考虑以下代码 -

for (i = 0; i < N; ++i) {
    a[i]++;
}

这个经过优化编译的简单循环很可能会展开并矢量化。 这是 gcc 4.8.0 -O3 生成的打包(向量)操作的汇编代码:

400420:       66 0f 6f 00             movdqa (%rax),%xmm0
400424:       48 83 c0 10             add    $0x10,%rax
400428:       66 0f fe c1             paddd  %xmm1,%xmm0
40042c:       66 0f 7f 40 f0          movdqa %xmm0,0xfffffffffffffff0(%rax)
400431:       48 39 d0                cmp    %rdx,%rax
400434:       75 ea                   jne    400420 <main+0x30>

但是,当在每次迭代中添加内联程序集时,gcc 不允许更改超过屏障的操作顺序,因此它无法对它们进行分组,并且程序集成为循环的标量版本:

400418:       83 00 01                addl   $0x1,(%rax)
40041b:       48 83 c0 04             add    $0x4,%rax
40041f:       48 39 d0                cmp    %rdx,%rax
400422:       75 f4                   jne    400418 <main+0x28>

但是,当 CPU 执行此代码时,只要不破坏内存排序模型,就允许“在幕后”对操作进行重新排序。这意味着执行操作可能会乱序(如果 CPU 支持的话,就像现在大多数 CPU 一样)。硬件围栏可以防止这种情况发生。

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

GCC 内存屏障 __sync_synchronize 与 asm 易失性("": : :"内存") 的相关文章

  • c和java语言中的换行符

    现在行分隔符取决于系统 但在 C 程序中我使用 n 作为行分隔符 无论我在 Windows 还是 Linux 中运行它都可以正常工作 为什么 在java中 我们必须使用 n 因为它与系统相关 那么为什么我们在c中使用 n 作为新行 而不管我
  • 如何在 C++ 中的文件末尾添加数据?

    我已按照网上的说明进行操作 此代码应该将输入添加到文件 数据库 的末尾 但当我检查时 数据会覆盖现有数据 请帮忙 这是我的代码 int main string name string address string handphone cou
  • 使用 Unity 在构造函数中使用属性依赖注入

    好的 我在基类中定义了一个依赖属性 我尝试在其派生类的构造函数内部使用它 但这不起作用 该属性显示为 null Unity 在使用 container Resolve 解析实例后解析依赖属性 我的另一种选择是将 IUnityContaine
  • XamlReader.Load 在后台线程中。是否可以?

    WPF 应用程序具有从单独的文件加载用户控件的操作 使用XamlReader Load method StreamReader mysr new StreamReader pathToFile DependencyObject rootOb
  • 存储来自其他程序的事件

    我想将其他应用程序的事件存储在我自己的应用程序中 事件示例 打开 最小化 Word 或打开文件时 这样的事可能吗 运行程序 http msdn microsoft com en us library ms813609 aspx and 打开
  • ASP.NET:获取自 1970 年 1 月 1 日以来的毫秒数

    我有一个 ASP NET VB NET 日期 我试图获取自 1970 年 1 月 1 日以来的毫秒数 我尝试在 MSDN 中寻找方法 但找不到任何东西 有谁知道如何做到这一点 从 NET 4 6 开始 该方法ToUnixTimeMillis
  • 关于在 Windows 上使用 WiFi Direct Api?

    我目前正在开发一个应用程序 我需要在其中创建链接 阅读 无线网络连接 在桌面应用程序 在 Windows 10 上 和平板电脑 Android 但无关紧要 之间 工作流程 按钮 gt 如果需要提升权限 gt 创建类似托管网络的 WiFi 网
  • 如何在 Linq 中获得左外连接?

    我的数据库中有两个表 如下所示 顾客 C ID city 1 Dhaka 2 New york 3 London 个人信息 P ID C ID Field value 1 1 First Name Nasir 2 1 Last Name U
  • 使用 JNI 从 Java 代码中检索 String 值的内存泄漏

    我使用 GetStringUTFChars 从使用 JNI 的 java 代码中检索字符串的值 并使用 ReleaseStringUTFChars 释放该字符串 当代码在 JRE 1 4 上运行时 不会出现内存泄漏 但如果相同的代码在 JR
  • Rx 中是否有与 Task.ContinueWith 运算符等效的操作?

    Rx 中是否有与 Task ContinueWith 运算符等效的操作 我正在将 Rx 与 Silverlight 一起使用 我正在使用 FromAsyncPattern 方法进行两个 Web 服务调用 并且我想这样做同步地 var o1
  • 如何使用 watin 中的 FileUploadDialogHandler 访问文件上传对话框

    我正在使用 IE8 和 watin 并尝试通过我的网页测试上传文件 我不能简单地使用 set 方法设置上传文件 例如 ie FileUpload Find ById someId Set C Desktop image jpg 因为上传文本
  • 如何在 Blackberry Cascades 中显示具有特定号码的电话板

    我正在使用带有 C QT 和 QML 的 Blackberry Cascades 10 Beta 3 SDK 以及 Blackberry 10 Dev Alpha Simulator 和 QNX Momentics IDE 并且我正在尝试实
  • 使用 Moq 使用内部构造函数模拟类型

    我正在尝试模拟 Microsoft Sync Framework 中的一个类 它只有一个内部构造函数 当我尝试以下操作时 var fullEnumerationContextMock new Mock
  • std::async 与重载函数

    可能的重复 std bind 重载解析 https stackoverflow com questions 4159487 stdbind overload resolution 考虑以下 C 示例 class A public int f
  • 有人可以提供一个使用 Amazon Web Services 的 itemsearch 的 C# 示例吗

    我正在尝试使用 Amazon Web Services 查询艺术家和标题信息并接收回专辑封面 使用 C 我找不到任何与此接近的示例 所有在线示例都已过时 并且不适用于 AWS 的较新版本 有一个开源项目CodePlex http www c
  • 为什么在setsid()之前fork()

    Why fork before setsid 守护进程 基本上 如果我想将一个进程与其控制终端分离并使其成为进程组领导者 我使用setsid 之前没有分叉就这样做是行不通的 Why 首先 setsid 将使您的进程成为进程组的领导者 但它也
  • 有没有办法强制显示工具提示?

    我有一个验证字段的方法 如果无法验证 该字段将被清除并标记为红色 我还希望在框上方弹出一个工具提示 并向用户显示该值无效的消息 有没有办法做到这一点 并且可以控制工具提示显示的时间 我怎样才能让它自己弹出而不是鼠标悬停时弹出 If the
  • 编译时“strlen()”有效吗?

    有时需要将字符串的长度与常量进行比较 例如 if line length gt 2 Do something 但我试图避免在代码中使用 魔法 常量 通常我使用这样的代码 if line length gt strlen Do somethi
  • memset 未填充数组

    u32 iterations 5 u32 ecx u32 malloc sizeof u32 iterations memset ecx 0xBAADF00D sizeof u32 iterations printf 8X n ecx 0
  • 使用 GhostScript.NET 打印 PDF DPI 打印问题

    我在用GhostScript NET http ghostscriptnet codeplex com打印 PDF 当我以 96DPI 打印时 PDF 打印效果很好 但有点模糊 如果我尝试以 600DPI 打印文档 打印的页面会被极大地放大

随机推荐

  • 如何从 JavaScript 中的范围中获取随机字符?

    查看片假名字符 http en wikipedia org wiki 片假名 Unicode http en wikipedia org wiki Katakana Unicode 如何从 Unicode 范围中获取随机字符 我很接近 St
  • 为什么导航属性必须是公共的才能创建代理?

    At http msdn microsoft com en us library dd468057 aspx http msdn microsoft com en us library dd468057 aspx我读到我想要更改跟踪代理的所
  • android 按钮可以指定边框吗?

    是否可以在 main xml 中指定 Android 按钮的边框 注 没有 包含笔划标记的单独 xml 文件 但在我定义按钮的原始文件中 没有 动态编程 解决方案 和 图像 解决方案
  • 通过 HTTPS 的 WCF 服务(自托管) - 获取协商的 SSL/TLS 协议版本

    出于安全原因 我们希望在操作系统级别的服务器中禁用 TLS 1 0 支持 在以下 SChannel 注册表中 HKEY LOCAL MACHINE SYSTEM CurrentControlSet Control SecurityProvi
  • NullPointerException: int android.widget.Editor$SelectionModifierCursorController.getMinTouchOffset()

    这是一个非常奇怪的小米设备的操作系统异常 即使我确实有来自 Fabric 的可用日志 堆栈跟踪也不会引用我的任何代码 下面是 crashalytics Fabric 中报告的崩溃详细信息 21K 崩溃 小米设备上的所有崩溃 Android
  • Javascript WebRTC 库的现状? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我想知道哪个框架或库最适合使用 WebRTC 这是一个小型且不完整的库 SDK 列表 任何我忘记的库 请随时告诉我 图书馆 简单RTC
  • xslt 的优雅示例?

    经过 XAML 的长时间学习循环后 我回到了 HTML 和 javascript 并意识到声明性代码的概念 就转换规则而言 是一个非常强大的概念 尽管语法过多 但 XML 的 XSLT 处理仍然是声明性转换编程的基石 然而 我总是发现很难理
  • iPhone 的网络时间协议

    我正在编写一个需要精确计时的应用程序 问完后这个问题 https stackoverflow com questions 2264197 how to accurately sync time between iphones 我决定使用 N
  • 如何在打字稿Angular 4中将字符串转换为布尔值

    我知道我不是第一个问这个问题的人 正如我在标题中提到的 我正在尝试将字符串值转换为布尔值 我之前已将一些值放入本地存储中 现在我想获取所有值并将所有值分配给一些布尔变量 应用程序组件 ts localStorage setItem Chec
  • 我可以使用 GenericServlet 在 Tomcat 上实现套接字服务器吗?

    我想实现一个将由多个客户端连接的套接字服务器 为了使实现尽可能简单 并且不必对线程和连接等进行代码管理 我想使用 Tomcat 我们已经使用 tomcat 作为我们解决方案的一部分 我确信 Tomcat 可以用于非 http servlet
  • 优化php中的大导入

    我有一个简单的导入器 它会遍历相当大的 csv 的每一行并将其导入到数据库中 我的问题是 我应该调用另一个方法来插入每个对象 生成 DO 并告诉它的映射器插入 还是应该在导入方法中对插入过程进行硬编码 复制代码 我知道最优雅的做法是调用第二
  • idea intellij maven项目无法make

    我有 Maven 项目 Maven 构建完成成功 但我无法完成这个项目 信息 取得成功 项目包含一个模块 Idea 看不到依赖关系 Error 3 38 java D Dropbox Programming java spring spri
  • Javascript垂直居中div(可变高度)

    我正在尝试使用 Javascript 将 div 垂直居中 因为文本会发生变化 所以我不能使用固定的高度 我想做这个without Jquery box2 width 100 height 100 position relative bac
  • UITableViewCells 初始加载视图/显示问题

    所以我有一个UITableView加载多列报价 进入后UITableView显示此数据时 单元格最初似乎未正确加载 文本看起来确实被压扁和 或被切断 大约 1 2 秒后 它正确加载 一切正常 每次加载表视图时都会发生这种情况 例如 这是一个
  • 使用 DateTime 列设置 LinqDataSourceWhere 子句

    在 C net 中 我有以下数据源设置 我试图在后面的代码中动态分配 WHERE 子句
  • MySQL:在已填充的表中创建新的唯一字段

    我需要在数据库表中创建一个已填充数据的字段 当然 仅仅将字段添加为空是不可能的 我只能想到创建一个新结构的新表 并将现有数据复制到新表中 但我想知道是否有更简单的方法 提示 它是一个复合键 由同一个表中的其他 3 个字段组成 编辑 该字段保
  • 提取 msi 时出现错误 2203

    我在使用以下命令提取 msi 时收到 2203 错误 msiexec a C Test Installer msi QB targetDIR C Test Eval LV C Test INST Logfile log 回答时请考虑以下几点
  • 使用相对路径时 VS10 附加库目录失败

    当我使用相对路径设置项目时 它失败了 不起作用 属性 链接器 常规 附加库目录 libraries 工作正常 C Users NAME Desktop project libraries 如何使相对路径发挥作用 尝试使其相对于您的项目目录或
  • 如何获取匹配 REGEX 后的文本

    我有字符串 我的家 和正则表达式 例如 reg hom 我正在努力找出如何在比赛后获取文本 直到单词结尾 在本例中我正在寻找 e 另一个例子 string soulful reg soul gt gt gt 我需要 完整 先感谢您 您可以使
  • GCC 内存屏障 __sync_synchronize 与 asm 易失性("": : :"内存")

    asm volatile memory 通常用作内存屏障 例如 如 Linux 内核中所示 barrier macro 这听起来类似于 GCC 内置的 sync synchronize http gcc gnu org onlinedocs