9.8 寄存器分配和重命名

所有的整数,浮点,MMX,XMM,YMM,标志寄存器,并且可能段寄存器也可以被重命名。浮点数控制字也可以被重命名。

寄存器重命名被RAT(寄存器重命名表)和重排序缓冲区控制,如图6.1所示。来自译码器和stack engine的uops通过queue进入RAT,而后进入ROB-read 和保留站。RAT可以每周期处理4条uop。RAT可以每周期重命名4个寄存器,并且它甚至可以一个周期内重命名同一个寄存器4次。

非依赖的case

通常将一个寄存器设置为0的方式是与其自身异或,或者让它与自身相减,比如XOR EAX,EAX。如果处理器识别发现指令的两个操作数是同一个寄存器,那么它就不依赖于该寄存器之前的值。

这个可以应用到所有的以下的指令:XOR,SUB,PXOR,XORPS,XORPD,VXORPS,VXORPD 和 所有的变种:PSUBxxx和PCMPGTxx,但是不能应用到CMP,SBB,PANDN等等。

这些指令可以在重命名阶段将寄存器设置为0,这类的置0指令的吞吐率是每个周期4条指令,但是并没有使用到执行单元。

PCMPEQxx指令会将所有的bit设置为1,如果操作数的两个寄存器相同。这样的指令可以被识别成不依赖于寄存器之前的值,但是它确实需要一个执行单元。使用64bit mmx寄存器的置0指令也会需要使用执行单元,因为和x87的浮点栈指针寄存器的overlap。

不需要执行单元的指令

上述提到的特殊情况是,XOR EAX,EAX这类的置零指令会在寄存器重命名,分配阶段被处理好,而不需要使用任何的执行单元。这使得利用置零指令变的十分的高效。每周期可以实现4条置零指令的吞吐率。进位表示可以以相同的方式使用CLC清零。

之前的处理器只能在寄存器重命名阶段处理FXCH指令。Sandy Bridge可以在寄存器重命名和分配阶段处理这些特殊的case:比如置零指令和NOP指令。

NOP指令,包括多byte的NOPs因此是非常高效的,每周期4条指令的吞吐率。为了提高效率,最好使用多byte的NOPs,而不是使用伪NOP,比如MOV EAX,EAX 或者是 LEA RAX,[RAX+0].

减少MOV指令

Ivy Bridge( 不是 Sandy Bridge) 可以在寄存器分配阶段减少寄存器的移动。接下来的例子解释了这个现象:

; Example 9.3. Move elimintaion
add eax,4
mov ebx,eax ; this move can be eliminated
sub ebx,ecx

在这个例子中,mov ebx,eax指令很可能被寄存器重命名所省去。代表ebx的物理寄存器师弟三条指令的输入,同样也是第一条指令的输出。寄存器重命名在Page11中有介绍。

Move Elimination 并不是总会成功。如果必须的操作数没有准备好时,它会失败。但是通常在超过80%的case中,move elimination都会成功。move 链也可以被移除。

move 移除在所有的32bit和64bit通用寄存器和所有的128bite,256bit向量寄存器都可以使用。

扩展0的从8bit移动到32bit或64bit寄存器操作也可以被移除,比如movz eax,bl。16bit 扩展0的移动不能够被移除。移动到8bit,16bit或者mxx寄存器的不能被移除。符号扩展的移动也不能被移除。

将一个寄存器移动到自身永远不能被移除,比如mov eax,eax是不能被移除的。

一个被移除的move的latency为0,不能使用任何的执行单元,但是消耗了译码器的带宽。

9.9 寄存器读阻塞

在之前的处理器中,寄存器读取阻塞已经成为了一个严重的,通常被忽略的瓶颈,直到intel Pentium Pro。 所有的intel基于P6微架构的处理器和他的衍生处理器,如Pentium M,Core 和 Nehamlem 微架构都限制每个周期从永久寄存器文件中读取2个到3个寄存器。

在Sandy Bridge 和 Ivy Bridge 中,这个瓶颈已经被移除。在我的实验中,我没有发现对寄存器读取个数的限制。

9.10 执行单元

Sandy Bridge 和 Ivy Bridge 有六个执行单元。Port0,1和5用于算数与逻辑计算(ALU)。有2个存储器读端口2和3,而之前的处理器只有1个。写端口Port4 没有地址计算单元。所有的写操作都需要使用端口2或者3来进行地址计算。吞吐量的最大值为每周期每个端口1条未融合的uop。

Port0,1和5支持全256 bit的向量操作。Port2,3和4使用两个周期来进行256bit的读或者写操作。 在表格9.3和9.4中列出了不同的单元。

为通用寄存器和向量寄存器的乘法有专门的端口。通用寄存器使用端口1的乘法器,延迟为3。整数和浮点寄存器陈发使用端口0,对不同的精度都为延迟5。这两个乘法器可以同时执行,并且都可以完全的流水线化,每周期1条向量操作。

整数除法使用端口0的浮点除法单元,这是唯一一个没有pipeline的单元。

端口5的跳转单元处理所有的跳转和分支操作,包括macro-fused的计算-分支指令。

处理器对整数和浮点向量操作有不同的执行单元。比如,浮点向量移动(MOVAPS和MOVAPD)只在port5端口执行,然而整数向量移动(MOVDQA)可以在port0,1和5端口上执行。

执行单元在端口0,1,和5被安排的很好。这使得每个周期执行3条向量指令变得可能,比如浮点向量乘法在port0,浮点向量加法在port1,浮点shuffle在端口5。

整数向量操作的延迟和通用寄存器的操作的延迟相同。这使得在没有足够的通用寄存器时,使用MMX寄存器和XMM寄存器进行整数操作变得非常便利。但是向量操作只被很少的几个单元支持。

读和写带宽

处理器有两个内存读端口(port2和port3),然而之前的intel 处理器只有一个读端口。Port2和port3也都可以用来进行地址计算。Port4是一个写端口,没有地址计算单元。所有的写操作都需要使用port2/3进行地址计算。所有的内存写操作需要两个uops,一个是使用port2、3进行地址计算,一个是使用port4进行写。

128bit或者更少bit的内存操作有每周期2个读或者 1个读并1次写的吞吐率。一个周期实现两个读和一个写应该不可能,因为只有两个地址计算单元(port2和3)。

在新的YMM寄存器中的256bit的操作数的情形不同。每个读端口需要2个周期读取256bit的数据(但是只需要一条uop),写端口也需要两个周期实现256bit的写。很明显,读端口不能在第二个周期执行另一个256bit宽度的读操作。但是它可以在第二个周期执行地址计算操作(可以被写操作使用)。因此可以实现每2个周期2个256bit读和一个265bit写的吞吐率。

在按照内存最大带宽进行读写时,cache bank的冲突的风险很高。

Data bypass delays

执行单元以Nehalem中相同的方式被分成不同的域,如113页所描述的。为整数寄存器和浮点寄存器设计了不同的寄存器文件。然而,在不同的域或者不同类型的寄存器之间传输数据的延迟,Sandy Bridge 和 Ivy Bridge 要比 Nehalem要小,经常是0。

像类似MOVD的指令将数据在通用寄存器和向量寄存器之间移动,延迟通常为1个周期,没有额外的bypass delay。然而,在向量寄存器和整数标志寄存器之间移动数据比如COMISS和PTEST则没有额外的延迟。

在从浮点指令到整数shuffle指令之间移动数据经常是1个周期的延迟,如果再将数据传回浮点指令,则又需要1个周期的延迟,比如PSHUFD指令经常用在两个ADDPS指令之间。如果在整形数据上使用浮点blend指令,也会遇到相同的情况。比如在PADD后面跟着BLENDPS指令。在一些情况下,在使用错误的shuffle和Boolean指令时,不存在bypass 延迟。比如,我没有发现混用PADDD和SHUFPS会产生延迟。在使用错误类型的move指令时,通常几乎只有一个周期的延迟,比如使用了MOVAPS而不是MOVDQA。

如果load和store指令使用了错误的数据类型,是没有额外的延迟的。比如,在读取或者写入XMM的上半部分时,使用MOVHPS指令是合适的。

在YMM寄存器的高128bit和低128bit数据之间移动数据,通常会有额外的一个周期的延迟。比如,VINSERTF128指令由两个周期的延迟,然而其他不会超过128bit的边界的shuffle和blend指令只有一个周期的延迟。VINSERTF128指令的延迟与是数据究竟是插入到YMM寄存器的上半部分还是下半部分无关。

将不同的latency的uop混合使用

之前的处理器在向相同的执行单元发送不同latency的uop时,有写回冲突,如115页所示。这个问题在Sandy Bridge很大程度上被解决掉了。执行延迟被标准化,所有的latency为3的uop被发送到port1,延迟为5的被发送到port0。延迟为1的可以被发送到port0,1,或者5。禁止出现其他的延迟,除了除法和开方。

延迟的标准化可以避免写回冲突。缺点是有的uops没有必要有那么大的延迟。

256bit向量

在port0,1,5端口的执行单元有256bit的吞吐率。看上去是有两个128bit 的数据总线,一个为128低bit,一个为128bit高bit。在高低128bit之间移动数据有一个周期的延迟。256bit寄存器的两半没有被当做是独立的,除了在不被期望的“saved state”,如9章12节所描述。很明显这两半在“modified state 修改状态”时总是被同时传输。

下溢与异常

异常数会在浮点数接近于下溢值是出现。处理下溢值在某些情况下花费很大,因为下溢值是被负责处理异常的micro code执行的。

一些处理下溢值和异常值的代价已经被硬件的方式解决掉,而不是通过microcode exception处理。

当在正常值上进行计算得到异常值是会有近似140~150个时钟周期的损失。这个损失与正常值和异常值的乘法的损失相似,不论结果是正常数值还是异常值。将正常值和异常值相加是没有代价的,无论什么结果。overflow,underflow,无限值和非数值结果是没有代价的。

如果“flush-to-zero” 和 “denormals-are-zero”在MXCSR寄存器中都被设置上,那么异常值的代价可以避免。


翻译自【Microarchitecture of Intel and AMD CPU  An optimization guide for assembly programmers and compiler makers】

欢迎关注我的公众号《处理器与AI芯片》

【Microarchitecture of Intel and AMD CPU】 9 Sandy Bridge and Ivy Bridge pipeline 【9.8-9.10】相关推荐

  1. 用Intel跟AMD CPU烤肉,哪个更香,你们猜猜结果?

    视频来源YouTube:たれみみChannel 微信公众号:芯片之家(ID:chiphome-dy) 之前发了个AMD CPU烤肉的视频,大家说是黑AMD的,今天作者带来了Intel CPU烤肉的视频 ...

  2. intel和AMD CPU性能对比(2016年CPU天梯图)组装电脑必读!

    http://www.365pcbuy.com/article-411.html 特别提示:此文已经于2016年10月12日更新!内容变动较大,请细细品鉴! 如何为客户推荐高性价比机型是我站的重要工作 ...

  3. Intel与AMD CPU型号对照

  4. Intel、AMD和Arm 告警:注意新的推断执行CPU漏洞!

     聚焦源代码安全,网罗国内外最新资讯! 编译:代码卫士 安全研究员发现了绕过Intel.AMD和Arm公司现代计算机处理器中基于硬件的推断执行防御措施. 今天,这三家CPU厂商发布安全公告并发布缓解更 ...

  5. 【已解决】 ESXI6.7 中虚拟机 从AMD cpu 与 Intel CPU主机互迁

    问题 公司虚拟化环境中主机(安装的是ESXI 6.7)有 AMD 和INTEL 两类CPU主机:现在需要将 INTEL 主机中的虚拟机迁移到 AMD中,主机均开启了vmotion vSphere Cl ...

  6. 【问题】VS2019在windows10下编译cef报错,导致系统;疑是AMD CPU 超频设置导致

    [问题]VS2019在windows10下编译cef报错,导致系统崩溃:疑是AMD CPU 超频设置导致 编译环境 问题描述 解决? 编译环境 CPU:AMD R5 3600 主板:微星B450 操作 ...

  7. 30年前竟是一家?Intel/AMD CPU的那些事

    原文链接: http://diy.pconline.com.cn/cpu/study_cpu/1207/2862888_all.html#content_page_8 1"史前年代" ...

  8. intel和amd的cpu核心详细介绍

    核心(Die)又称为内核,是CPU最重要的组成部分.CPU中心那块隆起的芯片就是核心,是由单晶硅以一 定的生产工艺制造出来的,CPU所有的计算.接受/存储命令.处理数据都由核心执行.各种CPU核心都具 ...

  9. 电脑cpu排名_可能是最详细的小白【笔记本电脑】选购攻略(附热门机型推荐)...

    现在电脑跟手机一样,逐渐成为每一个人的标配,不管是大学生.职场人士.还是家居都离不开电脑.但是大部分人并不是计算机专业,也没有接触过这一行,对于电脑一无所知,面对众多电脑时,不知道如何选购~ 我一直在 ...

  10. 【实验报告】微处理器原理与应用 CPUHomework1.2 上篇【掌握DEBUG基本命令及其功能 查看CPU和内存 用机器指令和汇编指令编程】

    实验报告 课程名称:微处理器原理与应用 实验名称:CPUHomework1.2 掌握 DEBUG 基本命令及其功能 文章目录 实验报告 [实验目的] [实验要求] 上篇[查看CPU和内存,用机器指令和 ...

最新文章

  1. 微服务化之前需要先无状态化和容器化
  2. 【Netty】入门Netty官方例子解析(一)写个 Discard Server
  3. 给Eclipse提速的7个技巧(转)
  4. 反激qr工作原理_锂电池均衡电路的工作原理
  5. 寒武纪抢答2020:一季度同比亏损扩大377%,86%营收大约在下半年
  6. BZOJ 2956 模积和(分块)
  7. 计算Be原子基态能级
  8. 将状态机模式实现为流处理器
  9. Python学习笔记——输入与输出用法
  10. go html template 数据怎么加减乘除_Go 视图模板篇(五):模板布局和继承
  11. 完成蓝蜂浏览器的框架重构
  12. 如何通过CRM系统进行线索管理?
  13. 分位数回归(Stata)
  14. drupal7 分页
  15. 云服务器入门篇:搭建云服务器Java web环境(Ubuntu Server 16.04.1 LTS 64位)
  16. 华为MH5000模块知识应用简介
  17. 文件管理之文件和文件系统
  18. get请求图片出现403 防盗链解决方式 no-referrer
  19. rethinkdb_如何在Node.js应用程序中使用RethinkDB
  20. SpringBoot 拦截器 过滤器

热门文章

  1. 一周疫情对行业影响观察 | 中国资产或成避险资产;亚太旅游零售业呼吁政府财政支持...
  2. 今天刚到货的小米平板2,就出现dnx fastboot mode一直卡死黑屏
  3. 香港服务器要个人信息么,香港个人信息应当遵循服务器23.225合法
  4. 基于单片机的模拟电磁曲炮设计
  5. linux下安装drcom方法
  6. vue项目为什么选择svg图标
  7. RFID固定资产盘点的解决方案
  8. 频域法分析系统详解及个人笔记
  9. mysql表字段一定要写英文吗_关于数据库列名是否必须是英文的?
  10. matlab:已知传递函数,求单位阶跃响应