CPU的流水线指令设计(上)

简介: CPU的流水线指令设计

为什么小小一个CPU,有那么多周期(Cycle)?


程序的性能=指令数×CPI×时钟周期,和周期相关的只有一个时钟周期,即CPU主频的倒数。

一个CPU的时钟周期可以认为是可以完成一条最简单的计算机指令的时间。

那为何构造CPU时,有那么多周期?

单指令周期处理器

一条CPU指令的执行,由FDE三步组成。这个执行过程,至少需花费一个时钟周期。因为在取指令的时候,我们需要通过时钟周期的信号,来决定计数器的自增。


很自然,我们希望能确保让这样一整条指令的执行,在一个时钟周期内完成。

这样,一个时钟周期可执行一条指令,CPI=1,看着就比执行一条指令要多个时钟周期性能好。

这就是单指令周期处理器(Single Cycle Processor):一个时钟周期内,处理器正好能处理一条指令。


但时钟周期固定,指令的电路复杂程度不同,所以实际一条指令执行时间不同。

随门电路层数增加,由于门延迟,位数多、计算复杂指令需执行更久。


不同指令执行时间不同,但要让所有指令都在一个时钟周期内完成,只好把时钟周期和执行时间最长的那个指令一样。不然就会导致快速执行完成的指令,需等待满一个时钟周期,才能执行下一条指令。


虽然CPI能够保持在1,但时钟频率却没法太高。太高,有些复杂指令没法在一个时钟周期内完成。在下个时钟周期到来,开始执行下条指令时,前一条指令执行结果可能还没写入寄存器。下一条指令读取的数据就不准确了。


  • 前一条指令的写入,在后一条指令的读取之前

1.png

一个CPU时钟周期,可认为是完成一条简单指令的时间。

为什么单指令周期处理器,反而变成执行一条最复杂的指令的时间?

无论是Intel CPU or ARM CPU,都不是单指令周期处理器,而是采用一种叫作指令流水线(Instruction Pipeline)的技术。


现代处理器的流水线设计

指令执行过程会拆分成“取指令、译码、执行”三步。


更细分,执行的过程,还包含从寄存器或内存读数据,通过ALU运算,把结果写回寄存器或内存。


CPU的指令执行过程,其实也是由各电路模块组成:

  • 取指令时,需要译码器,把数据从内存取出来,写入寄存器
  • 指令译码时,需要另外一个译码器,把指令解析成对应控制信号、内存地址和数据
  • 指令执行时,需要一个完成计算工作的ALU。这些都是一个一个独立的组合逻辑电路,我们可以把它们看作一个团队里面的产品经理、后端工程师和客户端工程师,共同协作来完成任务。
  • 流水线执行示意图

image.png

这就不用把时钟周期设置成整条指令执行的时间,而是拆分成完成这样的一个一个小步骤需要的时间。同时,每一个阶段的电路在完成对应的任务之后,也不需要等待整个指令执行完成,而是可以直接执行下一条指令的对应阶段。

这样的协作模式,就是指令流水线。这里每个独立步骤,称为流水线阶段或流水线级(Pipeline Stage)。


把一个指令拆分成“取指令-指令译码-执行指令”三部分,那这就是一个三级流水线。

进一步把“执行指令”拆分成“ALU计算(指令执行)-内存访问-数据写回”,就变成一个五级流水线。


五级流水线:同一时钟周期里,同时运行五条指令的不同阶段。这时,虽然执行一条指令的时钟周期变成5,但可提高CPU的主频。

无需确保最复杂那条指令在时钟周期里执行完成,只要保障一个最复杂的流水线级操作,在一个时钟周期内完成即可。


若某一操作步骤时间太长,可考虑把该步骤拆分成更多步骤,让所有步骤需执行时间尽量差不多长。这就可解决在单指令周期处理器中遇到的,性能瓶颈来自最复杂的指令的问题。

像ARM或IntelCPU,流水线级数都已到14级。


虽然不能通过流水线,减少单条指令执行的“延时”指标,但通过同时在执行多条指令的不同阶段,提升了CPU的“吞吐率”。

外部看来,我们的CPU好像“一心多用”,同一时间,同时执行5条不同指令的不同阶段。

CPU内部,就像生产线,不同分工的组件不断处理上游传递下来的内容,而无需等待单件商品生产完成后,再启动下一件商品的生产。


目录
相关文章
|
6月前
|
缓存 Linux Go
一次性构建出多CPU指令集的 Docker 镜像
本文介绍了使用 Docker Buildx 构建跨平台 Docker 镜像的流程。首先确保系统为 Ubuntu 22.04,安装 Docker 和相关依赖。然后配置 Docker Buildx,编写 Go 程序和 Dockerfile。接着,创建构建脚本 `build.sh` 自动化构建并推送镜像到 Docker Hub。运行此脚本将为不同平台(如 amd64, arm64)构建并推送镜像。最后,在 Docker Hub 可查看构建结果,并可在其他系统上测试镜像。
110 3
|
Docker Windows 容器
cpu不支持avx指令集怎么办
如果CPU不支持AVX指令集,可以考虑以下两种解决方案: 更新BIOS版本:在某些情况下,更新BIOS版本可能会支持AVX指令集。可以联系电脑厂商或者查阅相关教程进行BIOS更新。 更换支持AVX指令集的CPU:如果更新BIOS版本后仍不支持AVX指令集,那么可以考虑更换支持AVX指令集的CPU。可以根据自己的需求和预算选择适合的CPU。 另外,如果在tf1.6以后的官方的tf包都是用AVX编译的,而电脑的CPU不支持AVX指令集,那么可以考虑使用Docker来配置运行环境。但需要注意,Docker在Windows上配置稍显繁琐,并需要配置虚拟机等其他东西。 总的来说,如果不支持AVX指令
3722 0
|
算法 编译器
【计算机架构】响应时间和吞吐量 | 相对性能 | 计算 CPU 时间 | 指令技术与 CPI | T=CC/CR, CC=IC*CPI
【计算机架构】响应时间和吞吐量 | 相对性能 | 计算 CPU 时间 | 指令技术与 CPI | T=CC/CR, CC=IC*CPI
1126 1
|
6月前
|
存储 Ruby 内存技术
【机组期末速成】CPU的结构与功能|CPU结构|指令周期概述|指令流水线|中断系统
【机组期末速成】CPU的结构与功能|CPU结构|指令周期概述|指令流水线|中断系统
249 1
|
1月前
CPU的工作原理基于其内部结构,通过执行指令来完成各种任务
CPU的工作原理基于其内部结构,通过执行指令来完成各种任务
55 2
|
5月前
汇编语言(第四版) 实验一 查看CPU和内存,用机器指令和汇编指令编程
汇编语言(第四版) 实验一 查看CPU和内存,用机器指令和汇编指令编程
|
5月前
|
芯片
芯片设计 | 一文读懂,CPU、精简指令集、复杂指令集该如何理解
芯片设计 | 一文读懂,CPU、精简指令集、复杂指令集该如何理解
338 0
|
6月前
|
存储 Java 索引
探索CPU的黑盒子:解密指令执行的秘密
本文深入探讨了CPU执行指令的相关知识,包括CPU内部的寄存器组成、程序计数器的作用、函数调用机制以及CPU指令执行的五个阶段。通过学习这些内容,读者可以进一步了解计算机的工作原理。
探索CPU的黑盒子:解密指令执行的秘密
|
6月前
|
存储 Java 程序员
cpu与指令集
cpu与指令集
89 0
|
6月前
|
存储 缓存 Java
揭秘计算机指令执行的神秘过程:CPU内部的绝密操作
本文介绍了计算机指令和CPU如何执行指令。它解释了计算机指令可以被视为CPU所理解的语言,不同的CPU支持不同的指令集。文中重点介绍了MIPS指令集作为示例。同时,还描述了CPU的内部处理过程,包括控制单元、算术逻辑单元和数据单元。文章最后讨论了CPU和内存之间通过地址和数据总线进行的数据传输。
230 1