PAUSE指令

Improves the performance of spin-wait loops. When executing a “spin-wait loop,” processors will suffer a severe performance penalty when exiting the loop because it detects a possible memory order violation. The PAUSE instruction provides a hint to the processor that the code sequence is a spin-wait loop. The processor uses this hint to avoid the memory order violation in most situations, which greatly improves processor performance. For this reason, it is recommended that a PAUSE instruction be placed in all spin-wait loops.

An additional function of the PAUSE instruction is to reduce the power consumed by a processor while executing a spin loop. A processor can execute a spin-wait loop extremely quickly, causing the processor to consume a lot of power while it waits for the resource it is spinning on to become available. Inserting a pause instruction in a spin-wait loop greatly reduces the processor’s power consumption.

翻译成人话的意思是,其功效主要是两个:

  • 提升抢锁性能
  • 节省功耗
    针对这两点,尝试使用一些testcase进行深入的测试分析,看看是否可以发现一些有意思的东西。

测试

之前在一个问题分析中有提到C库中Intel使用了rep nop(事实上就是PAUSE)来优化他的抢锁的性能,因此这里依然使用pthread_spin_lock的实现进行魔改来测试性能:

//根据参数选择不同的spin_lock
if(pause_type)mypthread_spin_lock = mypthread_pause_spin_lock;else    mypthread_spin_lock = mypthread_nopause_spin_lock;//测试主体 N个线程
void *doWork() {uint32_t loop = thread_cnt;uint32_t type = pause_type;uint64_t iloop = idle_loop;while(!readyFlag) ;while(loop--) {mypthread_spin_lock(&lockValue);loop_counter ++;mypthread_spin_unlock(&lockValue);iloop = idle_loop;while(iloop--);}
}

从实际测试结果上来看,性能似乎并没有太大变化,甚至于nopause的性能还要略优于pause的性能:

从测试功耗结果的角度看,确实节省了不少功耗,32个线程测试时,pause场景比nopaus场景,整机功耗能够下降将近25W左右,也就是说Intel手册上说明的功耗降低是有意义的,但是性能却没有体现出来。

分析

由此可以推断,在pthread_spin_lock的场景下,pause实际上是没有起到提升锁性能的作用,仅仅是起到了降低功耗的作用,那么pause在什么样的场景下 可以提升抢锁的性能?

在不同的架构下,pause 指令的延时其实是不同的,甚至于在icelake阶段,pause的延时已经达到了140个cycle了。至于为什么对抢锁性能没有较大的提升,这里可能有两个推论:

  • 是否pause对原子的性能提升在实现上,更关注了CAS的性能,而忽略了FAA/SWAP的操作
  • 是否pause的作用仅仅是提供了一个idle loop的作用,减少了冲突导致的性能提升?

修改pthread_spin_lock为cas实现方式,测试结果如下:

很有意思的是,发现性能也没有明显的变化,查看intel trm的文档,其中有一句话描述:

也就是说,这个并不是直接提升了原子指令的性能,而是一个hint给到处理器,告诉处理器当前处于spin_loop阶段,处理器的能力可以让度出去,避免了大多数场景里面了一些内存序冲突的问题,这里我的理解是减少了对其它共享内存操作的可能性,减少了核间竞争的的开销,提升了整体cache的有效性,从而业务性能有比较大的提升。

此外,在测试过程中,发现pause指令并不是单纯的执行nop指令,更多的像整个流水线都让渡出去了,从perf的执行统计上看,IPC非常低:

也就是说 这个时候,基本另外的线程可以独占整个处理器,在性能上又有很大的提升。

进一步测试

在同一个物理核的超线程上面做redis的测试,确认IPC,在同物理核的另外一个线程上,运行测试程序,确认不同情况下,对redis的线程的影响:
nopause时, redis rps只能达到15万左右, 带了pause指令后, redis的性能可以达到16万吞吐量,这个还是计算并不密集的情况,比如在计算圆周率的场景下,pause指令对另外一个线程的吞吐量影响更大(IPC : 0.8->1.8):

总结

  • PAUSE指令并不是直接提升抢锁指令的性能,而是通过让渡CPU资源给同核心的另一个线程,提升整体运算利用率
  • PAUSE指令在多线程的时候,还能减少对共享内存的访问,减少同cache的竞争,从而提升其它业务核的性能
  • PAUSE指令能够极大的降低功耗

intel PAUSE指令功效分析相关推荐

  1. Intel PAUSE指令变化影响到MySQL的性能,该如何解决?

    MySQL得益于其开源属性.成熟的商业运作.良好的社区运营以及功能的不断迭代与完善,已经成为互联网关系型数据库的标配.可以说,X86服务器.Linux作为基础设施,跟MySQL一起构建了互联网数据存储 ...

  2. intel bsf指令

    导读: bsfl汇编指令:       intel汇编指令:bsf   oprd1,oprd2;       顺向位扫描(bit   scan   forward)       从右向左(从位0--& ...

  3. 发那可g10_FANUC系统宏程序配合G10指令倒角分析

    FANUC系统宏程序配合G10指令倒角分析 湖南科技工业职业技术学院戴继东摘要: G10指令是可编程参数输入指令,在数控编程中经常会碰到倒角或加工曲面的宏程序,但一般编辑较复杂,如果我们可以根据零件结 ...

  4. 使用Intel VTune性能分析器分析.NET模块运行时间

    因为本人也是该工具的初学者,所以本文的内容可能会浅一些,甚至还包括一些本人的 主观臆测,如果大家有不同意见欢迎指正,呵呵. Intel VTune的下载地址,请点击这里. 本文所使用的DEMO示例与之 ...

  5. Intel视频处理与分析技术栈和架构纵览

    面向WebRTC的英特尔协同通信开发套件设计了一个端到端的全流程实时视频流分析系统,帮助开发者使用极简的代码快速实现符合自身需求的高效实时视频流分析应用.本文来自英特尔开源技术中心研发经理 翟磊在Li ...

  6. 操作数栈的字节码指令执行分析

    一:写个demo 二:点击Recompile编译 三:使用javap命令反编译class文件        javap -v 类名.class 四:查看结果 五:分析执行过程 首先bipush意思是把 ...

  7. 我的内核学习笔记7:Intel LPC驱动lpc_ich分析

    接触这么久的内核代码,还没有真正分析一个完整的驱动源码,都是零零散散写只言片字.本文就作一个尝试,写一写Linux内核源码分析层面的文章. 本文介绍基于Intel baytrail系列的e3800系列 ...

  8. AVX-512指令_mm512_shuffle_epi8分析

    从Intel网站https://software.intel.com/sites/landingpage/IntrinsicsGuide/#expand=5159,5640,5159&text ...

  9. intel e1000 网卡 napi分析

    内核如何从网卡接收数据,传统的过程: 1.数据到达网卡: 2.网卡产生一个中断给内核: 3.内核使用I/O指令,从网卡I/O区域中去读取数据: 我们在许多网卡驱动中(很老那些),都可以在网卡的中断函数 ...

最新文章

  1. 13名专家盘点2017最重要AI事件,预测AGI将取代AI
  2. VS2010/MFC编程入门之二十九(常用控件:列表视图控件List Control 下)
  3. 也来玩玩MongoDB
  4. 如何计算并测量ABAP及Java代码的环复杂度Cyclomatic complexity
  5. python名称空间与运用域_Python名称空间和作用域讲座,命名,Namespaces,Scopes
  6. Voleon Group:一家『纯』用机器学习策略的对冲基金
  7. 暴雨公式 matlab,对雨水暴雨强度公式中降雨历时分解.pdf
  8. 产品经理面试必问问题与答题模板
  9. win2003服务器-远程复制无法读取源文件或磁盘
  10. 文件管理之文件后缀名识别
  11. 超燃:2019 中国.NET 开发者峰会视频发布
  12. 矩阵奇异值分解(详解)
  13. 微信无法绑定手机号的解决方案
  14. 【Android驱动】高通msm8953背光流程
  15. 解决WindTerm屏幕锁定
  16. 【PTA】代码部分基础整理
  17. 浏览器打开windows桌面应用
  18. 网易游戏offer经历
  19. AutoJs学习-实现成语查询
  20. c语言二级考试试卷,二级 C语言考试试卷

热门文章

  1. C# ModbusTcp 概念
  2. CAD转换PDF技巧分享 手把手教你快速转换CAD文件
  3. 蓝桥杯scratch集训操作题:数的判断和计算
  4. 金山WPS--C++面经
  5. 【人工智能简史】第一章 引言 —— 人工智能的概念与定义、发展背景及相关领域、意义与价值
  6. 浅析安科瑞能耗监测云平台在公共建筑上的应用及未来发展趋势
  7. 失业的程序员(十三):平衡
  8. highcharts隐藏链接和导出按钮
  9. Esxi 集成第三方驱动
  10. 用小乌龟拉取代码_如何使用git拉取代码及提交代码(详细)