我们先回顾一下第四讲,不知道你是否还记得这个公式:

                     程序的 CPU 执行时间 = 指令数 × CPI × Clock Cycle Time

这个公式里,有一个叫CPI的指标。我们知道,CPI的倒数,又叫做IPC(Instruction Per Clock),也就是一个时钟周期里面能够执行的指令数,代表了CPU的吞吐率。那么,这个指标,放在我们前面几节反复优化流水线架构的CPU里,能达到多少呢?

答案是,在最佳情况下,IPC也只能到1.因为无论做了那些流水线层面的优化,即使做到了指令执行层面的乱序执行,CPU仍然只能在一个时钟周期里面,取一条指令。

这说明,无论指令后续能优化得多号,一个时钟周期也只能执行完这样一条指令,CPI只能是1.但是,我们现在用的Intel CPU或者ARM的CPU,一般的CPI都能做到2以上,这是怎么做到的呢?

今天,我们就一起来看看,现代CPU都是用了什么“黑科技”。

多发射与超标量:同一实践执行的两条指令

之前讲CPU的硬件组成的时候,我们把所有算术和逻辑运算都抽象出来,变成了一个ALU这样的“黑盒子”。你应该还记得第十三讲到第十六讲,关于加法器、乘法器、乃至浮点数计算的部分,其实证书的计算和浮点数的计算过程差异还是不晓得。实际上,整数和浮点数计算的电路,在CPU层面也是分开的。

一直到80386,我们的CPU都是没有专门的浮点数计算的电路的。当时的浮点数计算,都是用软件进行模拟的。所以,在80386时代,Intel给386配了单独的387芯片,专门用来做浮点数运算。那个时候,你买386芯片的话,会有386sx和386dx这两种芯片可以选择。386dx就是带了387浮点数计算芯片的,而sx就是不带浮点数计算芯片的。

其实,我们现在用的intel CPU芯片也是一样的。虽然浮点数计算已经变成了CPU里的一部分,但并不是所有计算功能都在一个ALU里面,真实的情况是,我们会有多个ALU。这也就是为什么,在24讲讲乱序载执行的时候,你会看到,其实指令的执行阶段,是由很多个功能单元(FU)并行(Parallel)进行的。

不过,在指令乱序执行的过程钟,我们的取指令(IF)和指令译码(ID)部分并不是并行进行的。

既然指令的执行层面可以并行进行,为什么取指令和指令译码不行呢?如果想要实现并行,该怎么办呢?

其实只要我们把取指令和指令译码,也一样通过增加硬件的方式,并行进行就好了。我们可以一次性从内存里面取出多条指令,然后分发给多个并行的指令译码器,进行译码,然后对应交给不同的功能单元去处理。这样,我们在一个时钟周期里,能够完成的指令就不止一条了。IPC也就能做到大于1了。

这种CPU设计,我们叫做多发射(Mulitple lssue)和超标量(Superscalar)。

什么叫多发射呢?这个词听起来很抽象,其实它意思就是说,我们同一时间,可能会同时把多条指令发射(Lssue)到不同的译码器或者后续处理的流水线中去。

在超标量的CPU里面,有很多条并行的流水线,而不是只有一条流水线。“超标量”这个词是说,本来我们在一个时钟周期里面,只能执行一个标量(Scalar)的运算。在多发射的情况下,我们就能够超越这个限制,同时进行多次计算。

你可以看我画的这个超标量设计的流水线示意图。仔细看,你应该可以看到一个有意思的现象,每一个功能单元的流水线计的长度是不同的。事实上,不同的功能单元的流水线长度本来就是不一样的。我们平时所说的14级流水线,指的通常是进行整数计算指令的流水线长度。如果是浮点数运算,实际的流水线长度则会更长一些。

Intel的失败之作,安腾的超长指令字设计

无论是之前几讲里讲的乱序执行,还是现在更进一步的超标量技术,在实际的硬件层面,其实实施起来都挺麻烦的。这是因为,在乱序执行和超标量的体系里面,我们的CPU要解决依赖冲突的问题,这也就是前面几讲我们讲的冒险问题。

CPU需要在指令执行之前,去判断指令之间是否有依赖关系。如果有对应的依赖关系,指令就不能分发到执行阶段。因为这样,我们上面所说的超标量CPU的多发射功能,又称作动态多发射处理器。这些对于依赖关系的检测,都会使得我们的CPU电路变得更加复杂。

于是,计算机科学家和工程师们就又有了一个大胆的想法。我们能不能不把分析和解决依赖关系的事情,放在硬件里面,而是放在软件里面来干呢?

如果你还记得的话,我在第四讲讲过,想要优化CPU的执行时间,关键就是拆解这个公式:

                     程序的CPU执行时间 = 指令数 x CPI x Clock Cycle Time

当时我们说过,这个公式里面,我们可以通过改进编译器来优化指令数这个指标。那接下来,我们就来看看一个非常大胆的CPU设计思想,叫做超长指令字设计(Very Long Instruction Word,VLIW)。这个设计呢,不仅想让编译器来优化指令数,还想直接通过编译码,来优化CPI。

围绕着这个设计的,是Intel一个著名的史诗级失败,也就是著名的IA-64架构的安腾处理器,只不过,这一次,责任不全在Intel,还要拉上可以称之为硅谷起源的另一家公司,也就是惠普。

之所以称为史诗级失败,这个说法来源于惠普最早给这个架构取的名字,显式并发指令运算,这个名字的缩写EPIC,就是史诗的意思。

好巧不巧,安腾处理器和我之前给你介绍过的奔腾4一样,在市场上是一个失败的产品。在经历了12年之后的设计研发之后,安腾一代只卖出了几千套,而安腾二代,在从2002年开始反复挣扎了16年之后,最终在2018年被Intel宣告放弃,退出了市场。自此,世上再也没有这个史诗的服务器了。

那么,我们就来看看,这个超长指令字的安腾处理器是怎么回事。

在乱序执行和超标量的CPU架构里,指令的前后依赖关系,是由CPU内部的硬件电路来检测的。而到了超长指令字的架构里面,这个工作交给了编译器这个软件。

第五讲开始,就看了不少C代码到汇编代码和机器代码的对照。编译器在这个过程中,其实也能够知道前后数据的依赖。于是,我们可以让编译器把没有依赖关系的代码位置进行交换。然后,再把多条连续的指令打包成一个指令包。安腾的CPU就是把三条指令变成一个指令包。

CPU在运行的时候,不再是取一条指令,而是取出一个指令包。然后,译码解析整个指令包,解析出3条指令直接并行运算。可以看到,使用超长指令字架构的CPU,同样是采用流水线架构的。也就是说,一组(Group)指令,仍然要经历多个时钟周期。同样的,下一组指令并不是等上一组指令执行完成之后再进行。而是在上一组指令的指令译码阶段,就开始取指令了。

值得注意的一点是,流水线停顿这件事情在超长指令字里面,很多时候也是由编译器来做的。除了停下整个处理器流水线,超长指令字的CPU不能在某个时钟周期停顿一下,等待前面依赖的操作执行完成,编译器需要在适当的位置插入NOP操作,直接在编译出来的机器码里面,就把流水线停顿这个事情在软件层面就安排妥当。

虽然安腾的设想很美好,Intel也曾经希望能够让安腾架构称为替代x86的新一代架构,但是最终安腾还是在前前后后折腾了30年后失败了。2018年,Intel宣告安腾9500会在2021年停止供货。

安腾的失败的原因又很多,其中有一个重要的原因就是“向前兼容”。

一方面,安腾处理器的指令集和x86是不同的。这就意味着,原来x86上的所有程序是没有办法在安腾上运行的,而需要通过编译器重新编译才行。

另一方面,安腾处理器的VLIW架构决定了,如果安腾需要提升并行度,就需要增加一个指令包里包含的指令数量,比方说从3个变成6个,一旦这么做了,虽然同样是VLIW架构,同样指令集的安腾CPU,程序也需要重新编译。因为原来编译器的依赖关系是在3个指令以及由3个指令组成的指令包之间,现在要变成6个,编译器需要重新编译,交换指令顺序以及NOP操作,才能满足条件。甚至,我们需要重新来写编译器,才能让程序在新的CPU上跑起来。

于是,安腾的不容易向前兼容、向后兼容的CPU,失败也就不足为奇了。

可以看到,技术思想上的先进想法,在实际的业界应用上会遇到更多具体的实践考验。无论是指指令集向前兼容性,还是对应CPU未来的扩展,在设计的时候,都需要更多的考虑实践因素。

总结延伸

这一讲,我们让CPU的吞吐率,也就是IPC能够超过1.

我们介绍了超标量,也就是Superscalar这个方法。超标量可以让CPU不仅在指令执行阶段是并行的,在取指令和指令译码的时候,也是并行的。通过超标量技术,可以使得你所使用的CPU的IPC超过1.

在Intel的x86的CPU里,从奔腾时代,第一次开始引入超标量技术,整个CPU的性能上了一个台阶,对应的技术,一直沿用到了现在。超标量技术和你之前看到的其他流水线技术一样,依赖在硬件层面,能够检测到对应的指令的先后依赖关系,解决冒险问题。所以,它也使得CPU的电路更加复杂了。

因为这些复杂性,惠普和Intel又共同推出了著名的安腾处理器,通过在编译器层面,直接分析出指令的前后依赖关系。于是,硬件在代码编译之后,就可以直接拿到调换好先后顺序的指令。并且这些指令中,可以并行执行的部分,会打包在一起组成一个指令包。安腾处理器在取指令和指令译码的时候,拿到的不再是单个指令,而是这样一个指令包。并且在指令执行阶段,可以并行执行指令包里所有的指令。

虽然看起来,VLIW在技术层面更又颠覆性,不仅仅只是一个硬件层面的改造,而且利用的软件层面的编译器,来组合解决提升CPU指令吞吐率的问题,然而,最终VLIW却没有得到市场和业界的认可。

思考

在超长指令字架构的CPU里面,我们之前讲过的各种应对流水线冒险的解决方案还是有效的吗?操作数前推、乱序执行、分支预测能用在这样的体系架构下么?安腾CPU里面是否有用到这些相关策略呢?

深入计算机组成原理(二十六)Superscalar和VLIW:如何让CPU的吞吐率超过1?相关推荐

  1. 计算机系统组成怎么讲PPT,计算机组成原理第十二讲(存储子系统二)ppt课件.ppt

    <计算机组成原理第十二讲(存储子系统二)ppt课件.ppt>由会员分享,提供在线免费全文阅读可下载,此文档格式为ppt,更多相关<计算机组成原理第十二讲(存储子系统二)ppt课件.p ...

  2. 黑猫互联云计算机,黑猫评测 篇二十六:解决联想轻薄本痛点,3TB性价比NAS方案,联想个人云存储A1评测...

    黑猫评测 篇二十六:解决联想轻薄本痛点,3TB性价比NAS方案,联想个人云存储A1评测 2020-09-16 13:34:46 5点赞 10收藏 4评论 联想小新Pro 13的痛点,终于找到了完美的解 ...

  3. Shell脚本学习-阶段二十六-Web服务与端口

    文章目录-Shell阶段二十六-端口与服务对照表 前言 端口与Web服务对照表 简介 前言 端口与Web服务对照表 2端口:管理实用程序 3端口:压缩进程 5端口:远程作业登录 7端口:回显 9端口: ...

  4. C/C++基础讲解(二十六)之数值计算与趣味数学篇(打鱼还是晒网与怎样存钱以获取最大利息)

    C/C++基础讲解(二十六)之数值计算与趣味数学篇(打鱼还是晒网与怎样存钱以获取最大利息) 程序之美 前言 很多时候,特别是刚步入大学的学子们,对于刚刚开展的计算机课程基本上是一团迷雾,想要弄明白其中 ...

  5. (转)tensorflow入门教程(二十六)人脸识别(上)

    https://blog.csdn.net/rookie_wei/article/details/81676177 1.概述 查看全文 http://www.taodudu.cc/news/show- ...

  6. 电脑高手应用技巧荟萃(电脑知识二十六)

    电脑高手应用技巧荟萃(电脑知识二十六) 2010年12月07日 ★"锁定计算机"快捷方式 我想在桌面上创建一个"锁定计算机"的快捷方式,请问应该如何实现呢? 首 ...

  7. 2021年大数据Hadoop(二十六):YARN三大组件介绍

    全网最详细的Hadoop文章系列,强烈建议收藏加关注! 后面更新文章都会列出历史文章目录,帮助大家回顾知识重点. 目录 本系列历史文章 前言 Yarn三大组件介绍 ResourceManager No ...

  8. 模板方法模式 Template method 行为型 设计模式(二十六)

    模板方法模式 Template method 上图为网上百度的一份简历模板截图 相信大家都有求职的经历,那么必然需要简历,写简历的时候,很可能你会网上检索一份简历模板,使用此模板的格式,然后替换为你的 ...

  9. 窗口消息——Windows核心编程学习手札之二十六

    窗口消息 --Windows核心编程学习手札之二十六 Windows允许一个进程至多建立10000个不同类型的用户对象(user object):图符.光标.窗口类.菜单.加速键表等,当一个线程调用一 ...

  10. OpenCV学习笔记(二十六)——小试SVM算法ml OpenCV学习笔记(二十七)——基于级联分类器的目标检测objdect OpenCV学习笔记(二十八)——光流法对运动目标跟踪Video Ope

    OpenCV学习笔记(二十六)--小试SVM算法ml 总感觉自己停留在码农的初级阶段,要想更上一层,就得静下心来,好好研究一下算法的东西.OpenCV作为一个计算机视觉的开源库,肯定不会只停留在数字图 ...

最新文章

  1. Openresty最佳案例 | 第9篇:Openresty实现的网关权限控制
  2. 数据库选型绕不开“CAP定理”是什么
  3. 7万能驱动64位离线_Dism++离线安装.NET Framework 3.5教程
  4. 面向对象的一个实例 (银行管理系统)
  5. java 字节缓冲_Java字节缓冲流原理与用法详解
  6. 如何将 SAP UI5 应用托管到 Github 网站上并运行
  7. 计算机专业知识综合应用题,2015年计算机综合考研及解析之综合应用题(一)...
  8. AES加密算法介绍与实现
  9. 移动边缘计算中的资源管理
  10. Spring之Bean生命周期源码解析
  11. android webview支持webgl,Android WebView支持WebGL
  12. 人工智能研究现状及发展前景如何
  13. saltstack数据返回和模块定义
  14. 天冕数据开发平台通过信通院“大数据产品能力评测”
  15. 【Rust日报】2021-09-05 perseus:完全支持 SSR 和 SSG 的 Rust 高端前端开发框架
  16. DataBinding的使用二
  17. python结合ogr2ogr之地理数据格式转换-2
  18. IE和chrom兼容性分析(持续更新)
  19. 【linux】-find、rm、kill等常用命令
  20. 【图像配准】基于粒子群改进的sift图像配准matlab源码

热门文章

  1. 连接服务器失败请检查配置文件,连接服务器失败请检查网络
  2. c语言 特征码思路来破植物大战僵尸
  3. 南洋理工大学“网络安全高级研修班”寒假访学记
  4. 身份证号码 如何把格式设置成18个格子
  5. 韦伯-费纳希定律,前景理论及其在数据科学中的应用
  6. excel几个表合成一张_excel多表如何合并到一张表格
  7. qemu-kvm设备hot-plug原理分析
  8. SAE 搭建微信公众平台
  9. 计算机无法识别建行网盾,建行网银盾无法识别 如何解决这种问题?
  10. 非常全面的UI设计面试技巧,简单实用值得收藏