天天看点

为什么处理器指令要搞成流水线?

作者:硬十

指令流水线是一种用于计算机和其他数字电子设备设计以提高其指令吞吐量的技术,其基本思想是将计算机指令的处理分解为一系列独立的步骤,每个步骤的末尾都有存储。这允许计算机的控制电路以最慢步骤的处理速度发出指令,这比一次执行所有步骤所需的时间快得多。

为什么处理器指令要搞成流水线?

流水线的含义:

与工厂生产线类似,将一件工作分成若干个固定的工序进行。

为什么处理器指令要搞成流水线?

cpu流水线技术是一种将指令分解为多步,并让不同指令的各步操作重叠,从而实现几条指令并行处理,以加速程序运行过程的技术。指令的每步有各自独立的电路来处理,每完成一步,就进到下一步,而前一步则处理后续指令。(原理和生产流水线一样)

为什么处理器指令要搞成流水线?

CPU指令流水线

根据之前描述的基础,指令进入流水线,通过流水线处理,从流水线出来的过程,对于我们程序员来说,是比较直观的。

I486拥有五级流水线。分别是:取指(Fetch),译码(D1, main decode),转址(D2, translate),执行(EX, execute),写回(WB)。某个指令可以在流水线的任何一级。

为什么处理器指令要搞成流水线?

但是这样的流水线有一个明显的缺陷。对于下面的指令代码,它们的功能是将两个变量的内容进行交换。

1

2

3

XOR a, b

XOR b, a

XOR a, b

从8086直到386处理器都没有流水线。处理器一次只能执行一条指令。再这样的架构下,上面的代码执行并不会存在问题。

但是i486处理器是首个拥有流水线的x86处理器,它执行上面的代码会发生什么呢?当你一下去观察很多指令在流水线中运行,你会觉得混乱,所以你需要回头参考上面的图。

1、第一步是第一条指令进入取指阶段;

2、然后在第二步第一条指令进入译码阶段,同时第二条指令进入取指阶段;

3、第三步第一条指令进入转址阶段,第二条指令进入译码阶段,第三条指令进入取指阶段。

4、但是在第四步会出现问题,第一条指令会进入执行阶段,而其他指令却不能继续向前移动。

5、第二条xor指令需要第一条xor指令计算的结果a,但是直到第一条指令执行完成才会写回。

所以流水线的其他指令就会在当前流水级等待直到第一条指令的执行和写回阶段完成。第二条指令会等待第一条指令完成才能进入流水线下一级,同样第三条指令也要等待第二条指令完成。

这个现象被称为流水线阻塞或者流水线气泡。

常用概念:

1、流水线级数:流水线的节拍数。

2、吞吐率:单位时间内流水线能处理的任务数量。

3、最大吞吐率:流水线达到不间断流水的稳定状态后可获得的吞吐率。

4、加速比:流水方式的工作速度与等效的顺序工作方式时间的比值。

流水线指标:

1、流水技术无助于减少单个任务的处理延迟(latency),但有助于提高整体工作负载的吞吐率

2、多个不同任务同时操作, 使用不同资源

3、潜在加速比= 流水线级数

4、流水线的速率受限于最慢的流水段

5、流水段的执行时间如果不均衡,那么加速比就会降低

6、开始填充流水线的时间和最后排放流水线的时间降低加速比

低功耗嵌入式领域的ARM7就是采用3级流水线结构。

为什么处理器指令要搞成流水线?

MIPS架构的流水线

为什么处理器指令要搞成流水线?

X86架构的流水线

为什么处理器指令要搞成流水线?

流水线是处理器中用于执行指令的一种设计方式。它将指令的执行过程分解为多个阶段,并允许在同一时间内处理多个指令。这种设计可以提高处理器的性能,但也可能带来一些影响。

以下是流水线对处理器性能的一些影响:

  1. 提高指令吞吐量:流水线允许同时处理多个指令的不同阶段,从而提高了指令的吞吐量。这意味着在同一时间内可以执行更多的指令,从而加快程序的执行速度。
  2. 增加延迟: 尽管流水线提高了吞吐量,但也引入了一定的延迟。由于指令被分解为多个阶段,每个阶段都需要一定的时间来执行。如果其中一个阶段的执行时间较长,整个流水线的效率可能会受到影响。
  3. 数据冒险和控制冒险: 流水线执行过程中可能会遇到数据冒险和控制冒险。数据冒险发生在需要等待前一条指令结果的情况下,而控制冒险涉及到分支指令可能改变程序流程的情况。这些冒险可能导致流水线中断或延迟。
  4. 复杂的设计和管理: 流水线的设计和管理相对复杂,需要考虑各个阶段的协同工作、错误处理、分支预测等。这使得处理器设计变得更加复杂,可能增加了成本和难度。

指令执行过程中可能遇到的一些冒险(Hazards)和解决方案:

  1. Structure Hazards(结构冒险):
  • More hardware(更多硬件): 在处理器中,结构冒险可能发生在多个指令试图同时使用同一硬件资源的情况下。为了解决这个问题,可以增加硬件资源的数量,例如添加更多的功能单元或执行单元,以便同时处理更多的指令。
  • Register renaming(寄存器重命名): 通过在流水线中使用重命名技术,可以使得多个指令可以同时使用相同的寄存器,而不会发生冲突。这有助于避免因结构冒险而导致的延迟。
  • Performed by compiler(由编译器执行): 编译器可以通过调整指令顺序或插入适当的指令来最小化结构冒险。这可能包括对数据和操作的重新排列,以便更好地利用硬件资源。
  • Data Hazards(数据冒险):
    • Compiler Scheduling(编译器调度): 编译器可以通过重新安排指令的执行顺序来最小化数据冒险。通过考虑指令之间的数据依赖关系,编译器可以优化指令的排列,以减少因读后写(Read after Write)、写后写(Write after Write)、写后读(Write after Read)而导致的冒险。
    • Out-of-order execution(乱序执行): 处理器可以在不按照指令顺序执行的情况下,根据数据的可用性进行指令执行。这有助于减少数据冒险的影响,提高执行效率。
    • Register renaming(寄存器重命名): 同时也在这里起到了减少数据冒险的作用,因为它允许多个指令同时使用相同的寄存器,而不会发生冲突。
  • Control Hazards(控制冒险):
    • Branch Prediction(分支预测): 处理器可以使用分支预测来猜测分支指令的执行路径,从而避免由于分支导致的控制冒险。正确的预测可以减少流水线的中断,提高执行效率。
    • Speculative execution(猜测执行): 一些处理器可能采用猜测执行技术,在未确定分支结果的情况下继续执行指令。如果猜测正确,执行效率会提高,否则,需要回滚到正确的执行路径。

    总体而言,这些技术和方法都是为了最大程度地提高处理器的性能,同时克服在指令执行过程中可能遇到的结构、数据和控制冒险。

    流水线级数太多有什么问题?

    虽然流水线可以提高处理器的性能,但过多的流水线级数也可能引入一些问题,包括:

    1. 增加时钟周期:每个流水线级别都需要一个时钟周期来完成,而在流水线中的每个阶段都要经过。过多的流水线级数可能导致每个指令的总执行时间增加,因为时钟周期的数量也会相应增加。
    2. 增加延迟:多级流水线可能导致增加的流水线级别之间的数据传输和控制信号传递延迟。这些延迟可能会降低流水线的效率,因为在较高的流水线级别上等待的指令可能会阻塞后续指令的流动。
    3. 复杂的设计和控制:随着流水线级数的增加,处理器的设计和控制变得更加复杂。需要更多的硬件资源和更复杂的逻辑来确保各个流水线阶段的协同工作。这可能增加了设计的复杂性和制造成本。
    4. 增加结构冒险:结构冒险是指多个指令试图同时使用同一硬件资源的情况。过多的流水线级数可能导致更多的结构冒险,因为硬件资源的竞争可能会增加。
    5. 增加能耗:更多的流水线级数通常需要更多的功耗。每个流水线级别都需要电源,并且在切换时钟周期时可能会有更多的电压和电流波动。这可能导致处理器的整体功耗增加。
    6. 对分支预测的挑战:随着流水线级数的增加,分支指令的预测变得更为复杂。较长的流水线可能导致更多的分支预测错误,因为在更晚的阶段才能确定分支的执行路径。

    在设计处理器时,需要权衡流水线级数和性能之间的关系,以确保在提高性能的同时,不引入过多的问题和复杂性。不同类型的应用和需求可能需要不同级别的流水线来实现最佳性能。

    流水线处理概述

    CPU主要工作方式:

    顺序

    重叠

    流水

    和铺地板的原理相似…

    设指令工作方式分成取指令、分析、执行指令

    为什么处理器指令要搞成流水线?

    若各阶段执行时间相等,则共需3n t

    优点:控制简单;

    缺点:速度慢,机器各部件的利用率很低。

    重叠(Overlap):在两条相近指令的解释过程中,某些不同解释阶段在时间上存在重叠部分。

    包括一次重叠、先行控制技术和多操作部件并行。

    将相邻两条指令的重叠时间再往前提前一个阶段;T=3×t+(n-1)×t=(n+2)×t

    一次重叠:取指令操作隐含在分析、执行指令过程中,则在任何时候只允许上条指令“执行”与下条指令“分析”相重叠。T=(n+1)×t

    若各段时间不等时,有实际执行时间:

    为什么处理器指令要搞成流水线?

    先行控制:分析部件和执行部件能分别连续不断地分析和执行指令,预取和缓冲相结合的技术 ,通过对指令流和数据流的先行控制,使指令分析器和执行部件能尽量连续并行工作。

    执行时间:

    为什么处理器指令要搞成流水线?

    多操作部件并行:采用有多个功能部件的处理机,把ALU的多种功能分散到几个具有专门功能的部件中,这些功能部件可以并行工作,使指令流出速度大大提高。

    为什么处理器指令要搞成流水线?

    先行控制:现代计算机指令系统是复杂的,“分析”和“执行”所需要的时间往往相差很大,从而造成功能部件的浪费,因此,需要采用先行控制技术。

    为什么处理器指令要搞成流水线?

    分析指令和执行指令时间不等时的一次重叠方式

    为什么处理器指令要搞成流水线?

    采用先行缓冲栈是指令执行过程的一种表示方法

    先行控制:

    一般采用先行缓冲栈的方式实现:

    一般设置四种缓冲栈:

    先行指令缓冲栈

    当主存比较忙时,指令分析器能够从先行指令缓冲栈中得到所需指令。

    先行操作栈

    对于条件转移等使用。

    先行读书栈

    主存储器和运算器之间的缓冲存储器,用来平缓运算器和主存储器之间的工作。

    后行写数栈

    当前没有完全写到主存的数据可以暂存到写数栈

    先行控制的处理机结构:

    为什么处理器指令要搞成流水线?

    先行控制中的缓冲深度设计:

    通过一种极端情况计算举例:

    假设先行指令缓冲栈已经完全充满,缓冲深度是D1。

    此时指令缓冲栈输出端,指令流出速度最快,而输入端,流入最慢

    假设指令序列的最大长度是L1,平均分析一条指令的时间是t1

    而此时更坏的是取指令很慢,平均取一条指令的时间是t2

    假设先行控制栈充满到被取空的过程中指令分析条数是L1

    则此时有:L1t1 = (L1-D1)t2

    为什么处理器指令要搞成流水线?

    1989年推出的i486处理器引入了五级流水线。这时,在CPU中不再仅运行一条指令,每一级流水线在同一时刻都运行着不同的指令。这个设计使得i486比同频率的386处理器性能提升了不止一倍。五级流水线中的取指阶段将指令从指令缓存中取出(i486中的指令缓存为8KB);第二级为译码阶段,将取出的指令翻译为具体的功能操作;第三级为转址阶段,用来将内存地址和偏移进行转换;第四级为执行阶段,指令在该阶段真正执行运算;第五级为退出阶段,运算的结果被写回寄存器或者内存。由于处理器同时运行了多条指令,大大提升了程序运行的性能。

    处理器一般由如下功能单元组成:

    取指单元

    译码单元

    执行单元

    Load/store单元(load用于从内存中取数据,而STORE用与保存数据到内存)

    例外/中断单元

    电源管理单元

    流水线通常由取指、译码、执行及Load/Store等单元组成。各单元按图所示的几个步骤循环重复自身工作。

    超流水

    超流水线技术是通过细化的流水,提高主频。使得机器在一个周期内完成一个甚至多个操作,其实质是用空间换取时间。

    超流水处理器是相对于基准处理器而言的,一般cpu的流水线是基本的指令预取,译码,执行和写回结果四级。超流水线(superpiplined)是指某型CPU内部的流水线超过通常的5~6步以上,例如Pentium pro的流水线就长达14步。将流水线设计的步(级)数越多,其完成一条指令的速度越快,因此才能适应工作主频更高的CPU。这一点我们可以用日常事例来说明,比如有5个人接力传送木头(对应一个5级的流水线),超流水是说细化该流水过程,即由10个人接力(此时为10级流水),显然完成全部任务的速度会快。相当于毛主席的一句话:人多力量大(效率高)。

    为什么处理器指令要搞成流水线?

    超标量

    超标量是指在CPU中有一条以上的流水线,并且每时钟周期内可以完成一条以上的指令,这种设计就叫超标量技术。其实质是以空间换取时间。

    CPU架构是指在一颗处理器内核中实行了指令级并行的一类并行运算。这种技术能够在相同的CPU主频下实现更高的CPU吞吐率(throughput)。

    为什么处理器指令要搞成流水线?

    CPU、SoC、MCU什么区别

    为什么MCU一般跑RTOS,SoC一般跑嵌入式Linux?

    为什么会产生那么多处理器的指令集?

    哈佛结构那么好?为什么冯诺依曼更流行?

    处理器为什么需要多核?

    国产SoC厂家

    一阵腥风血雨的收购之后,MCU哪家强?

    进入硬十网站,可以下载更多处理器资料,限时免费购买

    为什么处理器指令要搞成流水线?

    继续阅读