cpu_relax( )-----对自选循环等待(spin-wait loops)操作的优化【转】

简介:

cpu_relax()-----对自选循环等待(spin-wait loops)操作的优化

转自:http://www.doc100.net/bugs/t/173547/index.html

   在lock_timer_base()函数中看到在for循环操作中调用了cpu_relax(),本来以为是要让出CPU,调度其他进程运行,但是看代码之后发现完全不是这么回事。cpu_relax()中只有一条调用语句,调用的是rep_nop函数。rep_nop()函数如下:

 

static inline void rep_nop(void)
{
	asm volatile("rep; nop" ::: "memory");
}

只有一条简单的汇编语句,原来在论坛里看到过这条汇编语句,不是重复执行nop指令,"rep; nop"指令会被翻译成pause指令,到底是不是这样呢?反汇编一下看看,c代码如下:

 

#include <stdio.h>

static inline void rep_nop(void)
{
    asm volatile("rep; nop" ::: "memory");
}

int main(void)
{
    rep_nop();
    return 0;
}

文件名保存在nop.c,使用gcc编译成目标文件nop.o,命令如下:

 

 

gcc -c nop.c

使用objdump来反汇编,命令如下:

 

 

objdump -s -d nop.o

 

反汇编的结果如下图所示:


从图中可以看出"rep; nop"指令被翻译成pause指令,因此实际上rep_nop()函数执行了一次pause指令。关于这条指令,intel的指令手册《Instruction Set Reference, M-Z》中讲的比较详细,这里总结一下。

  pause指令的作用是:

    1)提升spin-wait loops(自旋循环等待)的性能。在执行一个 spin-wait loops时,Pentium4处理会遇到严重的性能损失,因为在循环退出时,处理器会检测到一个可能的内存顺序冲突。pause指令会向处理器提供一种提示,告诉处理器当前所执行的代码序列是一个spin-wait loop操作。大多数情况下,处理器会根据这个提示避开内存序列冲突,从而提高处理器的性能。正是基于此,建议在spin-wait loop中使用pause指令。

    2)pause指令的另外一个功能是让Pentium4处理器在执行spin-wait loop时可以减少电源的消耗。在等待资源而执行自旋等待时,Pentium4处理器以极快的速度执行自旋等待操作时,将会消耗很多电能,但使用pause指令则可以极大地减少处理器的电源消耗。

  PAUSE 指令在 Pentium4 处理器中引入,但它也是向前兼容的。在早先的 IA-32 处理器里,PAUSE 指令实际上就相当于 NOP 指令。Pentium4 处理器以一种 预延迟(pre-defined delay)的技术来实现 PAUSE 指令。这种延迟也是有限度的,并且在一些处理器上是零延迟。该指令不会改变处理器的处理器的状态。

  上面还提到一个概念就是内存顺序冲突(Memory order violation)。内存顺序冲突一般是由假共享引起,假共享是指多个CPU同时修改同一个缓存行的不同部分而引起的一个CPU的操作无效,当出现这个内存顺序冲突时,CPU必须清空流水线。

参考资料:

聊聊并发(五)——原子操作的实现原理

http://www.groad.net/bbs/read.php?tid-3373.html











本文转自张昺华-sky博客园博客,原文链接:http://www.cnblogs.com/sky-heaven/p/5433830.html,如需转载请自行联系原作者


相关文章
|
3月前
|
编译器 Linux C语言
C++新特性“CPU优化对齐”
C++新特性“CPU优化对齐”
|
Android开发
【Android 安装包优化】动态库打包配置 ( “armeabi-v7a“, “arm64-v8a“, “x86“, “x86_64“ APK 打包 CPU 指令集配置 | NDK 完整配置参考 )
【Android 安装包优化】动态库打包配置 ( “armeabi-v7a“, “arm64-v8a“, “x86“, “x86_64“ APK 打包 CPU 指令集配置 | NDK 完整配置参考 )
1016 0
【Android 安装包优化】动态库打包配置 ( “armeabi-v7a“, “arm64-v8a“, “x86“, “x86_64“ APK 打包 CPU 指令集配置 | NDK 完整配置参考 )
|
3月前
|
存储 机器学习/深度学习 测试技术
mnn-llm: 大语言模型端侧CPU推理优化
mnn-llm: 大语言模型端侧CPU推理优化
408 1
|
3月前
|
存储 缓存 算法
如何优化 CPU 通道的使用
如何优化 CPU 通道的使用
47 0
|
5月前
|
存储 人工智能 缓存
探索AIGC未来:CPU源码优化、多GPU编程与中国算力瓶颈与发展
近年来,AIGC的技术取得了长足的进步,其中最为重要的技术之一是基于源代码的CPU调优,可以有效地提高人工智能模型的训练速度和效率,从而加快了人工智能的应用进程。同时,多GPU编程技术也在不断发展,大大提高人工智能模型的计算能力,更好地满足实际应用的需求。 本文将分析AIGC的最新进展,深入探讨以上话题,以及中国算力产业的瓶颈和趋势。
|
6月前
|
存储 缓存 Linux
高效利用CPU缓存一致性:优化技巧与策略分析
高效利用CPU缓存一致性:优化技巧与策略分析
|
9月前
|
SQL 存储 关系型数据库
记一次MySQL CPU被打满的SQL优化案例分析
记一次MySQL CPU被打满的SQL优化案例分析
173 0
|
11月前
|
NoSQL 安全 Linux
Redis 从入门到精通之内存和CPU配置优化
Redis 是一种基于内存的数据存储系统,因此内存的规划是非常重要的。在配置 Redis 内存时,应该避免物理内存使用过量导致大量使用 Swap,同时需要考虑内存碎片的问题。根据多年的经验整理了一些建议
561 1
|
SQL 缓存 负载均衡
线上cpu报警的一次接口优化
春天到了大地都复苏了,沉寂了很久的cpu也开始慢慢复苏了,所谓前人埋坑后人填坑,伴随着阿里云监控报警,线上CPU使用率暴增,于是就开始了排查之路。
|
存储 弹性计算 运维
CPU 利用率从 10% 提升至 60%:中型企业云原生成本优化实战指南
在互联网早期迅速发展时,相关领域企业更多注重于扩展业务,为了迅速占领市场,往往会投入较高的成本。然而,随着互联网人口红利逐渐消退,以及近几年的疫情影响,越来越多企业开始重视成本管理,从“粗放式经营”转变为“精细化运营”模式,成本优化成为企业重点关注事项。
456 0
CPU 利用率从 10% 提升至 60%:中型企业云原生成本优化实战指南