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.
Is a before b? Since the timestamps may wrap, this is asking whether it's
shorter to go clockwise from a to b around the clock-face, or anti-clockwise.
Times where going clockwise is less distance than going anti-clockwise
are in the future, others are in the past. e.g. a = MAX-1, b = MAX+1 (=0),
then a > b (true) does not mean a reached b; whereas signed(a) = -2,
signed(b) = 0 captures the actual difference */

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指令时延相关推荐

  1. Intel(R) 处理器产品架构/微架构对照表

    Intel(R) 处理器与微架构对照表 2020/12/23:更新至IceLake/TigerLake微架构 2019/07/09:更新至 2nd Generation Intel® Xeon® Sc ...

  2. Pentium M处理器架构/微架构/流水线(1) - 流水线概述

    Intel® Pentium® M Processor 与Intel NetBurst微架构类似,Intel Pentium M处理器微架构 的流水线也包括3个主要部分: 有序发射前端 乱序超标量执行 ...

  3. Intel Skylake (Client) 架构/微架构/流水线 (2) - 前端

    The Front End 相比起前代,Skylake  Client微架构的前端做了如下增强: 传统的译码流水线可以每周期译码出5条微指令,前代是4条微指令. 译码后微指令缓存(DSB,即Decod ...

  4. Intel Skylake (Client) 架构/微架构/流水线 (3) - 乱序执行引擎

    The Out-of-Order Execution Engine 注:下面这个对比实际上来自与Skylake Server微架构,不知道是否适用于Skylake Client微架构,放在这里供参考. ...

  5. Intel Skylake (Client) 架构/微架构/流水线 (4) - 高速缓存存储器子系统

    Cache and Memory Subsystem Skylake Client微架构的缓存层级结构具有如下的增强: 较前代具有更高的带宽 更大的缓冲区,可以同时处理更大的读存与写存操作 处理器可以 ...

  6. Intel Skylake (Server) 架构/微架构/流水线 (2) - 体系结构新特性

    Intel Skylake Server微架构引入了如下的新特性(某些特性可能不是全系处理器标配),允许程序员为应用程序优化性能和能耗. 处理器核基于Intel Skylake Server微架构,这 ...

  7. Intel Skylake (Server) 架构/微架构/流水线 (5) - 非时效存储

    Non-Temporal Store on Skylake Server Microarchitecture 考虑到在Skylake Server微架构中,LLC的每个存储体(bank)容量所发生的变 ...

  8. Intel Sandy Bridge/Ivy Bridge架构/微架构/流水线 (20) - IvyBridge微架构

    Intel® Ivy Bridge Microarchitecture 第三代Intel Core处理器是基于Ivy Bridge微架构的.上述的Sandy Bridge微架构的特性也都适用于Ivy ...

  9. Intel Sandy Bridge/Ivy Bridge架构/微架构/流水线 (9) - 流水线前端/微指令队列循环流侦测器LSD

    Micro-op Queue and the Loop Stream Detector (LSD) 微指令队列将流水线前端与乱序引擎解耦合(即隔离开).它位于微指令生成单元与重命名单元之间(参看上图) ...

最新文章

  1. 在cell中取得UITableView所在的ViewController对象
  2. azure存储压力测试
  3. Python中使用ncmbot玩转网易云音乐
  4. java实验7线程2020.5.28
  5. Rusty String
  6. Linux如何避免每次开启 CentOS 时,都要手动开启 sshd 服务,防止连接不上Xshell
  7. DIV CSS在不同IE版本和FF以及Chrome中的兼容性差异解决方法(推荐)
  8. QML 可以多选ComboBox的实现
  9. bzoj 3611: [Heoi2014]大工程(虚树+树形DP)
  10. dorado 刷新_dorado BDF常见问题
  11. 20. nginx 服务器的邮件服务
  12. 数学建模(NO.7相关系数—假设检验)
  13. pl/sql Developer 1303注册码
  14. http状态码为499的解决办法
  15. vue做移动端适配最佳解决方案,亲测有效
  16. EPICS记录参考5 -- 数组模拟输入记录Array Analog Input (aai)
  17. 如何使公式和编号上下对齐?
  18. linux命令总结1129
  19. Leetcode动态规划部分典型题目分类及总结
  20. 计算机协会宣传部长的英语,升达浪潮计算机协会

热门文章

  1. 路径-真机和虚拟机共享
  2. 实用的powershell小技巧,持续更新……
  3. 从零开始学keras之过拟合与欠拟合
  4. 创建选修专业表oracle,数据库及数据表的创建与删除 (Oracle实验)
  5. 【java基础知识】连接mysql的工具类编写
  6. 肺功能曲线图怎么看_QQ或将推出已读功能?!你怎么看?| 微博报
  7. JAVA设置按钮无效_JAVA设置的按钮监听没有反应
  8. java中的provide,vue3 provide ref
  9. 搜狗浏览器收藏夹在哪_安卓Edge浏览器最新版42.0.2轻体验,整体优良但无特别惊喜...
  10. Anaconda3+PyTorch安装教程