Intel 上的 gcc 中的 _mm_pause 用法

2024-06-19

我参考过这个网页:https://software.intel.com/en-us/articles/benefitting-power-and-performance-sleep-loops https://software.intel.com/en-us/articles/benefitting-power-and-performance-sleep-loops,以下我无法理解:

暂停指令向处理器提示调用线程处于“自旋等待”循环中。此外,暂停指令在不支持 Intel SSE2 的 x86 架构上使用时是无操作的,这意味着它仍然会执行,不会执行任何操作或引发错误。虽然这意味着不支持 Intel SSE2 的较旧 x86 架构将无法享受到暂停带来的好处,但这也意味着您可以保留一个可全面运行的简单代码路径。

我想知道,linux 中的 lscpu 会显示 cpu 信息,但我不知道我的 cpu 是否支持 SSE2,我如何自己检查?

Architecture:          x86_64
CPU op-mode(s):        32-bit, 64-bit
Byte Order:            Little Endian
CPU(s):                24
On-line CPU(s) list:   0-23
Thread(s) per core:    2
Core(s) per socket:    6
Socket(s):             2
NUMA node(s):          2
Vendor ID:             GenuineIntel
CPU family:            6
Model:                 63
Model name:            Intel(R) Xeon(R) CPU E5-2643 v3 @ 3.40GHz
Stepping:              2
CPU MHz:               3599.882
BogoMIPS:              6804.22
Virtualization:        VT-x
L1d cache:             32K
L1i cache:             32K
L2 cache:              256K
L3 cache:              20480K
NUMA node0 CPU(s):     0,2,4,6,8,10,12,14,16,18,20,22
NUMA node1 CPU(s):     1,3,5,7,9,11,13,15,17,19,21,23

另外,目前我使用 _mm_pause 或 __asm volatile ("pause" ::: "memory"); 该核心中的 cpu 空闲将耗尽为零,但是使用 nanosleep 的以下代码对我来说太慢了:

while(1){
    nanosleep();
    dosomething..... ; 
}

我观察到 nanosleep 在我的盒子里会延迟 60 微秒,有没有比 nanosleep 更快的解决方案,而且不会耗尽 cpu 核心,如 _mm_pause() 或 __asm 易失性(“暂停”:::“内存”)?!

Edit :

struct timespec req={0};
req.tv_sec=0;
req.tv_nsec=100 ;
nanosleep(&req,NULL) ;

在我拥有的CPU位于上面的盒子中,这个nanosleep花费了60微秒, 我不知道怎么会发生这样的事?!


检查您的平台是否支持 SSE2

gcc -march=native -dM -E - </dev/null | grep SSE

但您不需要检查支持:The pause操作说明 https://www.felixcloutier.com/x86/PAUSE.html在不将其识别为的 CPU 上安全地解码为 NOPpause.(编码基本上是rep nop)。不太可能的是nop管道中的 5 或 100 个周期暂停可能会成为代码的正确性问题。


_mm_pause不会为调度程序释放CPU,正如您提到的,它是为其他目的而设计的,例如微架构组件的提示。

nanosleep,如果使用正确,应该可以为您提供比 *60us 更好的控制(您可能需要将调度程序更改为 RT)。我建议您检查代码以查看参数是否正确设置等。

--Edit--

nanosleep 函数的准确性取决于内核。它的短暂睡眠行为只是 glibc 中的繁忙循环(请参阅参考资料)。也不可能在小于调度程序滴答声(由 CONFIG_HZ 确定,通常为 250、1000 等)的时间间隔(例如几纳秒)内屈服于调度程序,因为调度程序仅在计时器触发时进行上下文切换。

此外,仅仅让 CPU 闲置几纳秒实际上并不能节省电量。 CPU 功耗可通过 C 状态或 P 状态来节省。 P-State 使用频率缩放,而 C-State 则关闭 CPU 组件。虽然有暂停指令可以执行这种状态转换,但这样做需要时间(延迟在我们范围内),这使得它昂贵。

参考:

http://tldp.org/HOWTO/IO-Port-Programming-4.html http://tldp.org/HOWTO/IO-Port-Programming-4.html

http://ena-hpc.org/2014/pdf/paper_06.pdf http://ena-hpc.org/2014/pdf/paper_06.pdf

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

Intel 上的 gcc 中的 _mm_pause 用法 的相关文章

随机推荐

  • 从创建 UI 的同一线程更新 VCL。为什么?

    我知道我必须调用 Synchronize 来从未创建控件或向窗口发送消息的线程更新 vcl 我经常听到 线程不安全 这个词 但我找不到关于正在发生的事情的实际解释 我知道应用程序可能会因访问冲突而崩溃 但我又不知道为什么 请阐明这个主题 V
  • 如何在Redis中存储聚合目录树搜索结果

    我有一个很大的产品目录树 目前包含约 36000 个类别和约 100 万个产品 即叶子 它的结构如下 最大深度为 5 Cat1 Cat11 Cat111 Cat1111 Product1 Cat1112 Product1 Cat1113 P
  • 将 Kubernetes 抓取目标添加到不在 Kubernetes 中的 Prometheus 实例

    I run 普罗米修斯 https prometheus io 本地为 http localhost 9090 targets docker run name prometheus d p 127 0 0 1 9090 9090 prom
  • 从二叉堆中查找第 k 个最小元素的 O(klogk) 时间算法

    我们有一个 n 节点二叉堆 其中包含n不同的项目 根部的最小项目 为一个k lt n 发现O klogk 时间算法选择kth堆中的最小元素 O klogn 很明显 但无法找出O klogk 一 也许我们可以使用第二个堆 但不确定 好吧 你的
  • 如何从 initscript 应用 Gradle 版本插件?

    我正在尝试进行设置 以便我可以使用Gradle 版本插件 https github com ben manes gradle versions plugin无需将其添加到我的所有build gradle files 基于这个相关问题的答案
  • Scrapy 文件管道不下载文件

    我的任务是构建一个可以下载所有内容的网络爬虫 pdfs 在给定站点中 Spider 在本地计算机和抓取集线器上运行 由于某种原因 当我运行它时 它只下载一些但不是全部的 pdf 通过查看输出中的项目可以看出这一点JSON 我已经设定MEDI
  • 在 doInBackground AsyncTask Android 中传递更多值

    如何传递更多的值doInBackground My AsyncTask看起来像这样 private class DownloadFile extends AsyncTask
  • 正则表达式:匹配未包含在 [] 中的空格

    例如 对于这个字符串 div img wrapper img title Hello world 我想匹配第一个空格 但不匹配第二个空格 包含在 中 正则表达式是什么 以下表达式将通过使用前瞻断言来完成这项工作 gt 下划线代表空格 该表达
  • json 具有自动完成功能?

    我在用Jquery 自动完成 http docs jquery com Plugins Autocomplete autocomplete url or dataoptions 我也在使用 formatItem 我希望输出是
  • 哈希码是否用于加速集合中的对象查找?

    IIUC 相同类型的两个不同对象可以存储在 HashSet 中 即使两个对象在以下情况下返回相同的值 hashCode 叫做 例如根据本文 https eclipsesource com blogs 2012 09 04 the 3 thi
  • Mac OSX Lion Postgres 不接受 /tmp/.s.PGSQL.5432 上的连接

    我在 Homebrew 安装 Postgres 时遇到常见的 Mac OSX 错误 No such file or directory Is the server running locally and accepting connecti
  • JAVAFX制作动态文本区域大小

    我正在使用 JAVAFX 制作聊天应用程序 消息显示在textArea中 但textArea始终具有相同的大小 如何使 textArea 完全适合文本量 氨氮 下面的代码正是你想要的 public class Main extends Ap
  • 将整数系列转换为交替(双元)二进制系列

    我不知道如何最好地表达这个问题 因为在这里谷歌搜索和搜索总是让我找到更复杂的东西 我很确定这是基本的东西 但对于我的生活来说 我找不到一个好的方法来做到这一点下列 给定一个整数序列 比如说 for x in range 0 36 我想将这些
  • 将 kinit 与 keytab 文件一起使用时会发生什么

    希望对kinit和keytab文件的使用有更多的了解 例如 如果我已经为某个服务生成了一个密钥表文件 该服务通过以下方式注册到活动目录 ktpass mapuser to someuseraccount ktab k mykeytab a
  • 为什么“事件”在 Chrome 中全局可用,而在 Firefox 中则不然?

    在回答另一个问题时 出现了一个与event对象在匿名函数中可用 无需传入 在 Chrome 中 下面的代码工作正常 但 Firefox 会抛出错误 document ready function uspsSideboxTrackingClo
  • 在 Hibernate 中创建 UPDATE RETURNING 查询

    在 Oracle 中 我们可以创建一个更新查询 该查询将使用 RETURNING 子句返回更新的记录 Hibernate中有类似的功能吗 除了数据库生成的值之外 Hibernate 显然不需要返回更新的实例 因为对象传递给Session s
  • 动态字段取决于 WTForms 的先前字段

    我正在使用 WTForms 制作表格 目前 我有这个 class UploadForm flask wtf Form fichier wtforms fields FileField u Fichier description wtform
  • 相对于变换元素的绝对定位元素位置

    我重新创建了我在模板中遇到的问题 有一个nav具有position relative 在 的里面nav有一个div有两个嵌套列表 其中一个列表的位置绝对固定在列表的底部nav 当div对其应用了变换 当 的时候div在绝对和相对定位的元素之
  • 请求超级用户权限编辑文件

    我正在规划一个需要编辑系统文件的应用程序 我只能使用 root 权限编辑该文件 我有一个已 root 且安装了 Superuser apk 的开发手机 其他需要 root 的应用程序会在首次启动时请求 root 访问权限 我想做同样的事情
  • Intel 上的 gcc 中的 _mm_pause 用法

    我参考过这个网页 https software intel com en us articles benefitting power and performance sleep loops https software intel com