Intel Skylake (Client) 架构/微架构/流水线 (5) - PAUSE指令时延
PAUSE Latency in Skylake Microarchitecture
PAUSE指令通常用于软件线程中,这些线程运行在一个处理器核的两个逻辑处理器中,等待某个锁被释放。这种短小的等待循环可能持续数十个或者几百个周期,所以处于性能考虑,最好在等待期间占据CPU,而不是放弃CPU,将其送还回操作系统。如果可以预知等待时间有数千个周期或更长,则最好通过调用操作系统的同步API函数将CPU还给操作系统,例如Windows操作系统的WaitForSingleObject或者Linux的futex。
PAUSE指令的目标是:
- 临时为兄弟逻辑处理器(已经获得锁,退出自旋等待,准备执行后续代码,即临界区)提供通过竞争共享的硬件资源。换句话说,执行PAUSE指令的逻辑处理器可以让出硬件资源共获得锁的逻辑处理器使用。在Skylake微架构中两个逻辑处理器共享的硬件资源包括:
- 流水线前端 译码后微指令缓存DSD,循环流侦测器LSD和微指令队列IDQ中的资源
- 预约站RS(即调度器scheduler)中的资源
- 节省处理器核的电能消耗(与执行等效的自旋循环的指令序列相比)
- 某个逻辑处理器处于不活跃状态(例如,进入某级C-State)
- 同核中的两个逻辑处理器都执行PAUSE指令
- 禁用超线程(例如,使用BIOS选项)
在前几代微架构实现中,PAUSE指令的执行延迟大约是10个周期,但是在Skylake Client/Server微架构中,这个延迟被加长到了大约140个周期。
对于超多线程的应用程序,这个加长的延迟(允许执行业务的逻辑处理器更加有效地利用竞争共享的微架构资源)可以获得微弱的性能提升,大约在1%~2%之间(注:这种量级的性能提升实在可以忽略)。对于线程不太多的应用程序,如果执行流不是通过固定次数的PAUSE循环阻塞执行流,则可以忽略PAUSE指令带来的执行延迟。换句话说,在Skylake微架构上,如果程序有超多线程,则PAUSE指令能带来些微的性能提升;如果程序不太使用线程,则偶尔使用PAUSE指令,对性能影响也不大;但是如果在程序中使用固定次数的PAUSE循环来实现一段时间的延迟以此阻塞程序执行,则可能会引发延长的非预期的延迟,例如以前10个PAUSE指令大约延迟100个周期,现在可达1400个周期。可参看下面的示例程序。
对于2核或4核系统,PAUSE指令也会有些节电效果。
由于PAUSE指令的执行延迟被大大的加长了,对于PAUSE延迟敏感的程序可能会遭受性能下降。
下面的示例程序使用了动态迭代次数的PAUSE循环。
注意:在Skylake微架构上,RDTSC指令按照机器保证的P1频率,而不是处理器的当前时钟频率,来计算周期数。因此,若处理器开启了Turbo Boost模式,程序中的延迟也是固定常量,但是可以执行的指令数是变化的。
在锁实现代码的自旋等待循环中,使用pollDelay()函数可以等待固定长度的时间(在函数参数中指定,按照保证的P1频率的周期数计算)。
示例:动态PAUSE循环
#include <x86intrin.h> #include <stdint.h> /* A useful predicate for dealing with timestamps that may wrap. static inline bool before(unit64_t a, unit64_t b) { return ((int64_t)b – (int64_t)a) > 0; } void pollDelay(unit32_t clocks) { unit64_t endTime = _rdtsc() + clocks; for (; before(_rdtsc(), endTime) _mm_pause(); } |
对于下面这个基准示例中的竞争自旋锁的形式,如果发现锁繁忙,我们推荐指数级的退让策略(exponential back off,参看改进的示例),用来避免由线程冲突导致的重大性能下降。当增加机器中线程数量以及改变架构可能加重冲突条件时,此点(指退让策略)尤其重要。在多处理器系统中,Intel的服务器处理器有共享的存储器,随着竞争同一个锁的线程数量的增多,线程间的冲突需要更长的时间来解决。指数级退让策略被设计为避免线程间的冲突,从而避免潜在的性能下降。注意在下面的示例中,PAUSE指令的迭代次数按照每次两倍的速度增加,直到最大值MAX_BACKOFF(这个值并非定数,可能需要调优)。
示例:所竞争中的增量退让示例程序
/* baseline version */ // atomic if lock == free, then change lock state to busy while ( cmpxchg(lock, free, busy) == fail) { while(lock == busy) { __asm__(“pause”); } } |
/* improved version */ int mask = 1; int const max = 64; // MAX_BACKOFF while (cmdxchg(lock, free, busy) = fail) { while (lock == busy) { for(int i = mask; i; --i) { __asm__(“pause”); } mask = mask < max? mask<<1: max; } |
Intel Skylake (Client) 架构/微架构/流水线 (5) - PAUSE指令时延相关推荐
- Intel(R) 处理器产品架构/微架构对照表
Intel(R) 处理器与微架构对照表 2020/12/23:更新至IceLake/TigerLake微架构 2019/07/09:更新至 2nd Generation Intel® Xeon® Sc ...
- Pentium M处理器架构/微架构/流水线(1) - 流水线概述
Intel® Pentium® M Processor 与Intel NetBurst微架构类似,Intel Pentium M处理器微架构 的流水线也包括3个主要部分: 有序发射前端 乱序超标量执行 ...
- Intel Skylake (Client) 架构/微架构/流水线 (2) - 前端
The Front End 相比起前代,Skylake Client微架构的前端做了如下增强: 传统的译码流水线可以每周期译码出5条微指令,前代是4条微指令. 译码后微指令缓存(DSB,即Decod ...
- Intel Skylake (Client) 架构/微架构/流水线 (3) - 乱序执行引擎
The Out-of-Order Execution Engine 注:下面这个对比实际上来自与Skylake Server微架构,不知道是否适用于Skylake Client微架构,放在这里供参考. ...
- Intel Skylake (Client) 架构/微架构/流水线 (4) - 高速缓存存储器子系统
Cache and Memory Subsystem Skylake Client微架构的缓存层级结构具有如下的增强: 较前代具有更高的带宽 更大的缓冲区,可以同时处理更大的读存与写存操作 处理器可以 ...
- Intel Skylake (Server) 架构/微架构/流水线 (2) - 体系结构新特性
Intel Skylake Server微架构引入了如下的新特性(某些特性可能不是全系处理器标配),允许程序员为应用程序优化性能和能耗. 处理器核基于Intel Skylake Server微架构,这 ...
- Intel Skylake (Server) 架构/微架构/流水线 (5) - 非时效存储
Non-Temporal Store on Skylake Server Microarchitecture 考虑到在Skylake Server微架构中,LLC的每个存储体(bank)容量所发生的变 ...
- Intel Sandy Bridge/Ivy Bridge架构/微架构/流水线 (20) - IvyBridge微架构
Intel® Ivy Bridge Microarchitecture 第三代Intel Core处理器是基于Ivy Bridge微架构的.上述的Sandy Bridge微架构的特性也都适用于Ivy ...
- Intel Sandy Bridge/Ivy Bridge架构/微架构/流水线 (9) - 流水线前端/微指令队列循环流侦测器LSD
Micro-op Queue and the Loop Stream Detector (LSD) 微指令队列将流水线前端与乱序引擎解耦合(即隔离开).它位于微指令生成单元与重命名单元之间(参看上图) ...
最新文章
- 在cell中取得UITableView所在的ViewController对象
- azure存储压力测试
- Python中使用ncmbot玩转网易云音乐
- java实验7线程2020.5.28
- Rusty String
- Linux如何避免每次开启 CentOS 时,都要手动开启 sshd 服务,防止连接不上Xshell
- DIV CSS在不同IE版本和FF以及Chrome中的兼容性差异解决方法(推荐)
- QML 可以多选ComboBox的实现
- bzoj 3611: [Heoi2014]大工程(虚树+树形DP)
- dorado 刷新_dorado BDF常见问题
- 20. nginx 服务器的邮件服务
- 数学建模(NO.7相关系数—假设检验)
- pl/sql Developer 1303注册码
- http状态码为499的解决办法
- vue做移动端适配最佳解决方案,亲测有效
- EPICS记录参考5 -- 数组模拟输入记录Array Analog Input (aai)
- 如何使公式和编号上下对齐?
- linux命令总结1129
- Leetcode动态规划部分典型题目分类及总结
- 计算机协会宣传部长的英语,升达浪潮计算机协会
热门文章
- 路径-真机和虚拟机共享
- 实用的powershell小技巧,持续更新……
- 从零开始学keras之过拟合与欠拟合
- 创建选修专业表oracle,数据库及数据表的创建与删除 (Oracle实验)
- 【java基础知识】连接mysql的工具类编写
- 肺功能曲线图怎么看_QQ或将推出已读功能?!你怎么看?| 微博报
- JAVA设置按钮无效_JAVA设置的按钮监听没有反应
- java中的provide,vue3 provide ref
- 搜狗浏览器收藏夹在哪_安卓Edge浏览器最新版42.0.2轻体验,整体优良但无特别惊喜...
- Anaconda3+PyTorch安装教程