x86暂停指令的跨平台实现

2023-11-24

编写 x86 暂停指令的跨平台实现的最佳实践是什么? 我计划在 C++ 11 项目的繁忙旋转循环中使用它。

如果我只使用 gcc 工具链,那么我可以使用 _mm_pause 内在函数。即使本机处理器不支持 x86 暂停指令,此内在函数是否会执行正确的操作?我还希望我的代码也能在 clang/llvm 工具链上工作。

我想回退可以使用“std::this_thread::sleep_for”,因为我使用的是 C++ 11。但我不确定如何检测处理器功能(支持暂停与不支持)并回退到睡眠状态。

我正在使用 cmake 来构建我的项目,并且始终会在同一台计算机上构建和部署。所以我很乐意在编译期间检测处理器设置。

一个示例实现(伪代码)是:

void pause() {
// Not sure how to detect if pause is available on the platform.
#if defined(USE_mm_pause)
  __asm__ ( "pause;" );
#else
  std::this_thread::sleep_for(std::chrono::seconds(0));
#endif
}

即使本机处理器,这个内在函数也能做正确的事情吗? 不支持x86暂停指令?

是的,暂停指令被编码为 F3 90。不知道该指令的 Pentium 4 之前的处理器会将其解码为:

  REP NOP

那只是一个普通的NOP带有无用的前缀字节。处理器将等待一两个周期,然后继续而不以任何方式改变处理器状态。您将无法从使用中获得性能和功耗优势PAUSE但该程序仍将按预期运行。

有趣的事实:REP NOP甚至在大约 35 年前发布的 8086 上也是合法的。这就是我所说的向后兼容性。

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

x86暂停指令的跨平台实现 的相关文章

随机推荐

  • Android 软键盘在全屏时隐藏来自 CordovaWebView 的输入

    我有一个 CordovaWebView 它呈现一些 html 表单 当我关注输入字段时 Android 的软键盘会弹出 对于某些字段 根据它们的位置 它会位于其顶部 基本上 它不会调整 CordovaWebView 的布局大小 无论我做什么
  • @OrderBy 导致 java.lang.ClassCastException:antlr.CommonToken 无法转换为 antlr.Token [重复]

    这个问题在这里已经有答案了 我正在尝试使用 OrderBy运行在 Spring MVC 项目上的注释JBoss EAP 6 1 server 我有 2 个项目 第一个项目名为model gen wifipnsd并且它只包含模型类由第二个项目
  • webdriver:获取元素的xpath?

    是否可以返回 WebElement 的 xpath 不是直接来自 WebDriver 但如果您确实需要 您可以伪造它 public String getElementXPath WebDriver driver WebElement ele
  • 在数组上使用 OR 逻辑作为 Sumproduct 中的参数

    我有一个相当大的数据集 我需要将多个条目组合成一个值 我的数据集包含两个数据集组合的数据 每个数据集都使用自己的 ID 和密钥 我想用一个Sumproduct 像这样的函数 SUMPRODUCT Raw data C C Landgebru
  • Spring Boot 应用程序不提供静态内容

    我正在使用 Spring Boot 并试图在部署时使我的静态资源 CSS JS 字体 可用 源代码可供您查看或克隆https github com joecracko StaticResourceError 现在 我部署的网站看不到我的 C
  • 在命令行上运行 XQuery

    听起来我需要某种类型的 XML 处理器 看起来有一个名为 Saxon 的程序 我可以用它来运行 XQuery 当我尝试时这个网站我得到的例子 Error Could not find or load main class net sf sa
  • 使用的变量定义是否经过优化?

    考虑以下方法 private static long maskAndNegate long l int numberOfLeadingZeros Long numberOfLeadingZeros l long mask CustomBit
  • Flutter:无法在onBackgroundMessage中使用任何插件

    我正在使用 Firebase 推送通知 并且想在触发 onBackgroundMessage 时执行一些代码 它实际上被触发是因为我在控制台中打印 但我尝试使用几个插件但没有成功 每次都会出现类似的错误 未处理的异常 MissingPlug
  • ITextSharp - 将两个 pdf 合并到一个页面中

    我将简单地阐述这个问题 我有这个pdf abcd 和这个 1234 4567 我想将它们合并以获得 abcd 1234 4567 可以使用 iTextSharp 或任何其他免费工具吗 提前致谢 这是一个老问题 但是如果有人再次进入这里我的解
  • 将可空类型序列化为可选的不可空元素

    我有一个带有可选元素的 xsd 架构 minOccurs 0 maxOccurs 1 类型int 该元素未定义为可为空 在数据模型中 我想将其映射到 net 类型的字段Nullable
  • System.out.printLn() 如何接受整数?

    于是前几天开始学习java 遇到一个问题 对于下一个表达式 String foo 123 不允许 然而 在System out printIn 我们可以使用类似的东西 int x 5 System out println x 既然不允许将整
  • 如何在Android中限制Spinner下拉视图的高度

    请建议我用来创建它的任何方法 Query 我正在创建 2 Spinner 视图 我必须在其中添加国家 城市列表 所以就像如果我选择印度 那么我会在下拉视图中看到 50 个项目 问题是它占用了整个页面高度 我想要的是 我想创建一个下拉视图 用
  • 如何在支持暂停/恢复的情况下上传到 S3?

    我想知道如何通过 暂停和恢复 支持将文件上传到 Amazon S3 通过网络浏览器 有可用的示例 Web 应用程序吗 任何编程语言 框架都可以 提前致谢 SOLUTION 我实现了以下应用程序 GitHub 链接 它基于示例应用程序和 ge
  • 如何截断外键约束表?

    为什么没有TRUNCATE on mygroup工作 尽管我有ON DELETE CASCADE SET I get 错误 1701 42000 无法截断外键约束中引用的表 mytest instance 约束instance ibfk 1
  • jquery:如果语句在ajax成功函数中不起作用

    我的 AJAX 中有一个成功函数 它从 python 脚本返回响应文本 可以是 SUCCESS 或 EMPTY 现在我想在 success 函数中放置一个 if 循环 但 if 循环不起作用 我从 python 脚本中获取了正确的数据 因为
  • 如何在企业代理后面配置 Nginx

    是否有与 Apache 相当的工具ProxyRemoteNginX 的指令 所以场景是我在一个公司代理后面 我想使用 NginX 为各种服务做代理通行证 我会在 Apache 中执行以下操作 ProxyPass localStackOver
  • CSS:创建凸起框效果的好方法是什么?

    也就是说 元素的左边框和下边框需要提供弹出的 3D 效果 有没有一种好的 纯 CSS 的方法来实现这种效果 foo border 8px outset 999 webkit box shadow 5px 5px 15px rgba 0 0
  • 在 Rails 中子类化 User 模型真的很糟糕吗?

    我受到 Rails 的强烈反对 因为我已将 User 子类分为许多不同的子类 在我的应用程序中 并非所有用户都是平等的 实际上有很多模型对象 并不是每个用户类型都可以访问它们 我还需要一种方法来进行多态行为 例如 许多方法的行为会根据类型而
  • 如何在不增加背景图像大小的情况下增加(自定义类型)UIButton 的可点击(点击)区域

    是否可以在不改变按钮背景图像大小的情况下增加按钮的可点击区域 I tried shareButton setContentEdgeInsets UIEdgeInsetsMake top left bottom right shareButt
  • x86暂停指令的跨平台实现

    编写 x86 暂停指令的跨平台实现的最佳实践是什么 我计划在 C 11 项目的繁忙旋转循环中使用它 如果我只使用 gcc 工具链 那么我可以使用 mm pause 内在函数 即使本机处理器不支持 x86 暂停指令 此内在函数是否会执行正确的