基于流水线的CPU的设计「建议收藏」

基于流水线的CPU的设计「建议收藏」1.我们知道,CPU是电脑的中央处理单元,CPU到底是怎么连续的执行指令的。我们以MIPS为例,探究一下。2.基础的知识我们需要知道,CPU执行一条指令时分为五个阶段的:(1)在内存取指令(2)根据指令读寄存器(3)利用寄存器中的数据ALU(4)访问内存(5)写寄存器。一般是这五个阶段,但是很多指令并不是说这五个阶段全部都在做事情。比如add,它只有四个阶段,其中不涉及到内存的访问。但是,又有…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

1.我们知道,CPU是电脑的中央处理单元,CPU到底是怎么连续的执行指令的。我们以MIPS为例,探究一下。

2.基础的知识我们需要知道,CPU执行一条指令时分为五个阶段的:(1)在内存取指令(2)根据指令读寄存器(3)利用寄存器中的数据ALU(4)访问内存(5)写寄存器。一般是这五个阶段,但是很多指令并不是说这五个阶段全部都在做事情。比如add,它只有四个阶段,其中不涉及到内存的访问。但是,又有指令五个阶段都要做事情,比如lw。既然是通用的CPU,我们尽可能的支持夺得指令,或者说是一种短板效应。

3.知道了这些,我们分析一下,CPU如果是一条一条的执行指令,那么就会出现这种情况,比如add,在执行它的时候,他被执行到第二阶段,第一个取指令的操作就空了下来,同理,越来越多的操作被空闲。这显示是不行的,对于追求效率的CPU是不能容忍的,于是在基于工厂流水线的启发:提出了基于流水线形式工作的CPU。大概就是这个样子。

                                   基于流水线的CPU的设计「建议收藏」

这是五条指令在一起工作,上一条使用完资源以后,下一条紧接着继续。十分的紧凑,没错,这样就让CPU连续不空闲的工作,看上去似乎很不错。

4.流水线的困境。虽然上边基于流水线的设计,使得CPU得到了很高的效率,但是也面临这一些困境,或者说冒险。这些词是根据英文 Hazards翻译而来。

5.结构困境:

                                                   基于流水线的CPU的设计「建议收藏」

我们观察这样一种执行的指令的顺序:我们注意到,第一条指令和第四条指令在同一个阶段都是在访问内存,其中第一条是在写内存,第二条是在读内存。这两种操作在某种意义下是相反的,你不可能又读又写吧,这显然是不合理的。为了解决这个问题,人们发明了缓存技术。使用两个一级缓存,一个读一个写。即保证了效率,又解决了冲突。

同样的问题也发生在了寄存器上:

                                                                基于流水线的CPU的设计「建议收藏」

我们发现,存在两条指令一条写寄存器,一条读寄存器。这也是不合理的。但是由于寄存器的读写速度很快,并且,肯定是要先写后读的,因为后边的指令可能要用到上面指令得到的数据,所以规定先写后读。这样,结构困境被完美解决。

6.控制困境:我们知道,程序时不可避免要出现分支的,就像这样:

                                 基于流水线的CPU的设计「建议收藏」

但是我们很快就可以发现问题,因为分支的结果是在ALU之后才能知道的,所以你当前分支后边的两条指令到底执行什么,这是不可预料的。有可能跳转,也有可能不跳转,所以把那些指令装载进来,这是一个很大的问题。针对这个问题,人们提出了三种解决方案:

(1)空指令等待:既然beq这种分支指令只能再ALU之后才能得到结果,那好吧,我在你出结果之前啥也不干,给你两条空指令,比如再a0寄存器加0什么的。那么其实结构就像是这样:

                                            基于流水线的CPU的设计「建议收藏」

这虽然解决了问题,但是引入了两条空指令,这对CPU这种追求效率的部件来说时不能忍的。然后,人们又提出了第二种解决方案。

(2)人们仔细分析发现,问题的根本原因是在ALU这个位置再整个执行程序流程的后边,如果把它提前,问题不久容易了一些嘛,所以人们提出再Reg中加一个分支比较器,然后空出一个单个的时间段,这样似乎又好了很多。

                                                 基于流水线的CPU的设计「建议收藏」

这样虽然好了很多,但是,还是又空闲,你说人们怎么就这么贪心呢?CPU一直工作,插个空闲让人家休息会不行吗,计算机科学家说:不行!它得一直给我干活!行吧,那就干呗。

(3)新的概念引入,人们发现,这样虽然不时一整个空指令进去了,但是还是不是很满意,于是就继续反思自己。然后发现可能是自己的思想有问题:为什么分支会产生这样的问题,因为分支只是做了干了一个活。我现在重新定义分支,我让你依次就是执行两条指令,什么意思呢?就是说,计算机科学家发现,如果我让分支一次执行两条指令,其中一条是分支,另一条是与它无关的指令。这样再执行完这两条指令之后,分支的结果也产生了,还顺便执行了一条其他的指令。但是这里面有很多问题:什么叫做与分支无关的指令,你怎么找到这样的指令,这样的指令一定存在吗?对于前两个问题,汇编器会帮我们做,至于最后一个问题,答案是这样的指令还就真的不一定存在。注意,时不一定,不是一定。但是这种设计使得CPU的效率再很多时候都能达到100%,即使找不到这样的指令,也是50%。这种设计的方式叫做分支延迟:Delay-Branch

                                           基于流水线的CPU的设计「建议收藏」

我来解释一下这个图,主要是解释Delay-Branch。看都右边,我们发现再beq之前,其实ori用到的数据和beq用到的没关系,所以就可以调整一下位置,把or拿到beq的后边,这样再beq完成的时候,or也完成,效率达到100%。

7.我们花了很大的力气解决了控制困境,但是问题总是解决不完的。毕竟是CPU,怎么能随随便便成功。我们来看一下这个程序执行的过程:

                                         基于流水线的CPU的设计「建议收藏」

 放在流水线上就是这样的结果:

                                                  基于流水线的CPU的设计「建议收藏」

我们可以看到:由于t0使用的很频繁,导致再还没有结果算出来被写回来的时候,就已经开始用了。数据的即时依赖产生了数据困境。当然了,这些小问题可是难度到我们的计算机科学家。针对这个问题,计算机科学家马上提出了前馈机制来解决。

 Forwarding:

                                                     基于流水线的CPU的设计「建议收藏」

其实我们知道,ALU之后数据的结果已经出来了,那么你先别写了,先拿来给我用用。先把数据的结果反馈出去,这就叫做前馈。嗯,似乎很不错,直到遇见了这张图:

                                                                            

                                                  基于流水线的CPU的设计「建议收藏」

这张图中,结果再内存访问之后才出来,实在是太慢了,前馈都没办法。这可咋办?没事,我们的计算机科学家总是有办法的,他们还是根据刚才的想法,插入一些空指令,使得前馈可以继续下去。大概就是这样:

                                   基于流水线的CPU的设计「建议收藏」

这样就成功的解决了问题。这样我们CPU的流水线控制也基本结束了,其实CPU也就是这样吧,哈哈。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/170390.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • python之路

    python之路

    2021年9月15日
    88
  • 移动端(手机及平板)禁止用户缩放/拖动网页

    移动端(手机及平板)禁止用户缩放/拖动网页

    2021年11月17日
    51
  • java线程池面试题有哪些?java线程池常见面试题「建议收藏」

    java线程池面试题有哪些?java线程池常见面试题「建议收藏」进行java面试的过程中,java线程池是必问的面试题目,因为这是java的重点知识,也是在java工作中经常会遇到的,那java线程池面试题有哪些?下面来我们就来给大家讲解一下java线程池常见面试题。1.了解过线程池的工作原理吗?当线程池中有任务需要执行时,线程池会判断如果线程数量没有超过核心数量就会新建线程池进行任务执行,如果线程池中的线程数量已经超过核心线程数,这时候任务就会被放入任务队列中排队等待执行;如果任务队列超过最大队列数,并且线程池没有达到最大线程数,就会新建线程来执行任务;如果超过了

    2022年5月26日
    39
  • java 设置随机数种子_java随机数种子怎么设置[通俗易懂]

    java 设置随机数种子_java随机数种子怎么设置[通俗易懂]java随机数种子怎么设置引导语:Java技术具有卓越的通用性、高效性、平台移植性和安全性,广泛应用于PC、数据中心、游戏控制台、科学超级计算机、移动电话和互联网,同时拥有全球最大的开发者专业社群。以下是小编整理的java随机数种子怎么设置,欢迎参考阅读!java设置随机数种子教程:一、在j2se里我们可以使用Math.random()方法来产生一个随机数,这个产生的随机数是0-1之间的一个dou…

    2022年7月14日
    24
  • 简介交换机常用的配置命令行_华为交换机命令行语言

    简介交换机常用的配置命令行_华为交换机命令行语言交换机的配置我们下面以Cisco公司的Catalyst2900交换机为例,介绍交换机的一般配置过程。一、交换机配置方式1.通过Console(控制台)端口连接终端或运行终端仿真软件的微机;第一次对交

    2022年8月2日
    19
  • poe交换机跟普通交换机的区别_以太网交换机和poe交换机的区别

    poe交换机跟普通交换机的区别_以太网交换机和poe交换机的区别众所周知电气设备只有通电后才能工作,而一些基于IP网络的各种设备也同样需要供电才能使用,自从有了poe供电技术后IP网络设备就又多了一种供电方式。那么具体poe工业以太网交换机可以当普通工业以太网交换机用吗,poe工业以太网交换机有哪些优势呢?poe工业以太网交换机可以当普通工业以太网交换机用吗poe工业以太网交换机的可以当作普通工业以太网交换机来用的,不过必要是正规厂商生成的支持802.3at/af协议的poe工业以太网交换机,因为这些poe工业以太网交换机在供电前会先提供1个低电压检测前..

    2022年10月5日
    2

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号