处理器基本概念

236 阅读14分钟

影响程序执行时间的三个因素:Total Instructions(程序指令个数),Cycles/Instructions(每条指令所需周期个数,简称CPI),Seconds/Cycle(每个周期需要的时间)。
对于非流水线处理器,需要多个周期才能执行一条指令,而对于流水线处理器,每周期最多执行一条指令,想每周期执行多于一条的指令,就需要使用超标量处理器(20 世纪 80 年代后期出现了超标量处理器)。
在超标量处理器中,每周期从I-Cache中取出n条指令送到处理器的流水线中,处理器在每周期内也最少可以执行n条指令,这称为n-way的超标量处理器。现代的高性能处理器大多使用了超标量的结构。 超标量技术:超标 量结构允许指令流水线的每一阶段同时处理多条指令。如果把单发射结构比作单车道马路, 多发射结构就是多车道马路。
多发射数据通路:让处理器中每级流水线都可以同时处 理更多的指令, 这被称为多发射数据通路技术。例如双发射流水线意味着每一拍用 PC 从指令存储器中取两条指令, 在译码级同时进行两条指令的译码、 读源寄存器操作, 还能同时执行两条指令的运算操作和访存操作, 并同时写回两条指令的结果。要在处理器中支持多发射, 首先就要将处理器中的各种资源翻倍。
多发射数据通路技术虽然从理论上而言可以大幅度降低处理器的 CPI,但是由于各类相关所引起的阻塞影响, 其实际执行效率是要大打折扣的。解决办法:动态调度(核心部件:发射队列,该部件核心在于“挑选没有被阻塞的指令”)。
流水线是现代处理器获得高性能的重要法宝,通过流水线可以降低处理器的周期时间,从而获得更快的执行频率。指令流水线把一条指令 的执行划分为若干阶段 (如分为取指、 译码、 执行、 访存、 写回阶段) 来减少每个时钟周期 的工作量, 从而提高主频; 并允许多条指令的不同阶段重叠执行实现并行处理 (如一条指令处于执行阶段时, 另一条指令处于译码阶段)。 虽然同一条指令的执行时间没有变短, 但处理器在单位时间内执行的指令数增加了。
指令相关性:数据相关性:先写后读(RAW,一条指令的操作数来自之前的指令的结果,则必须等待之前指令将结果计算出来才可继续执行);先读后写(WAR,一条指令要将结果写到某个寄存器中,但是这个寄存器还在被其他指令读取,所以不能马上写入。解决办法:将指令的结果写到其他寄存器中);先写后写(WAW,两条指令都需要将结果写到同一个寄存器中,那么后面的指令必须等到前面的指令写完之后,才能执行写操作。解决办法: 后续指令将结果写到其他寄存器);数据相关性是和寄存器直接相关的,只要在解码阶段得到了寄存器的名字,就可以找到这些相关性。控制相关性(由分支预测引起,条是转移指令且另一条指令是否被执行取决于该转移指令的执行结果, 则这两条指令之间存 在控制相关)。结构相关性(指令必须等到处理器中某些部件可以使用的时候才能就行执行,即两条指令使用同一份硬件资源)。
指令相关性,导致指令在流水线中无法完全地乱序执行。超标量处理器可以顺序或乱序执行指令(乱序是在发射(Issue,将指令发送到对应的服务功能单元)、Execute&Memory、Writeback阶段存在)
取指令(Fetch),解码(Decode),Issue(发射),Execute&Memory,Writeback,Commit
取指令(Fetch):从I-cache中取指令,放到指令缓存(有可能存在)中
解码(Decode):识别指令类型、指令所需操作数、指令的控制信号,这部分设计与指令集相关。由于每条指令都需要一个完整的解码电路,所以对于一个每周期可以解码n条指令的超标量处理器来说,就需要n个解码电路。
寄存器重命名(Reigster Renaming):将指令解码后得到的逻辑寄存器重命名为物理寄存器(个数多于逻辑寄存器),从而使处理器可以调度更多可以并行执行的指令。由于寄存器重命名所需时间较长,所以会单独使用一级流水线。
分发(Dispatch):被重命名的指令按照程序中规定的顺序,写到发射队列(Issue Queue)、重排序缓存和Store Buffer等部件中。这个阶段可以单独使用一个流水段,或者和寄存器重命名阶段放在一起。分配电路从发射队列中找到空闲的空间,将寄存器重命名之后的指令存储到其中。
Issue(发射):仲裁(select)电路从发射队列中找出合适的指令送到FU中执行。发射队列中包括唤醒(wake-up)电路(将发射队列中对应的源操作数置为有效状态),仲裁电路和唤醒电路互相配合进行工作。
读取寄存器(Register File Read):指令从物理寄存器堆(PRF)中读操作数,或者从旁路网络(FU的输出端到输入端间的通路)中得到操作数(减少PRF的读端口个数,个数多则PRF的访问速度会下降)(由多路选择器选择是从物理寄存器后者旁路网络中获取)。
执行(Execute):指令得到操作数后,马上就可以送到对应的FU(也称EU,负责指令执行)中执行了。FU包括ALU(算术和 逻辑运算部件)、AGU(地址计算单元) 等。处理器中包含的运算单元数 目也逐渐增加, 从早期的单个运算单元逐渐增加到多个运算单元,相同类型的运算单元也有多个。
提交(Commit) :重命名之后的指令被写到发射队列的同时,也会被写到重排序缓存。起作用的部件是重排序缓存(ROB),它会将乱序执行的指令拉回到程序中规定的顺序,实现原理是指令在流水线分发阶段,按照程序中规定的顺序写到了重排序缓存中。当前指令只有之前所有指令都执行完成,才能离开重排序缓存,执行在流水线的各阶段发生的异常,但异常只有在提交阶段才能进行处理。指令一旦离开重排序缓存,就会对处理器状态进行修改,再也回不到之前的状态。
处理器状态恢复:预测技术失败,使用恢复电路恢复处理器状态。
Cache存在原因:计算机中存在时间相关性(一个数据被访问,那么以后很有可能还会被访问)和空间相关性(一个数据被访问,那么它周围的户数以后有可能也被访问)。L2 Cache以MB为单位,现代处理器一般都是多核共享L3 Cache,L1 Cache是每个核私有的(大小几十KB)。
一个软件可以运行在任务支持同一指令集体系的不同处理器上面。指令集的硬件实现方式称为微架构。
CISC指令集如x86,RISC指令集如MIPS和ARM。
冯.诺依曼结构特点:计算机由存储器、 运算器、 控制器、 输入设备和输出设 备五部分组成, 其中运算器和控制器合称为中央处理器 ( Central Processing Processor, 简称CPU)。而输入、 输出设备统一通过北桥和南桥与中央处理器连接。
北桥 (North Bridge) 是离 CPU 最近的芯片, 主要负责控制显卡、 内存与 CPU 之间的数据交换, 向上连接处理器, 向下连接南桥。南桥 (South Bridge) 主要负责硬盘、 键盘以及各种对带宽要求较低的 IO 接口与内存、CPU 之间的数据交换。
在 CPU-GPU-北桥-南桥四片结构中, 计算机的各个部件根据速度快慢以及与处理器交换 数据的频繁程度被安排在北桥和南桥中。 CPU 通过处理器总线 (也称系统总线) 和北桥直接 相连, 北桥再通过南北桥总线和南桥相连, GPU 一般以显卡的形式连接北桥。 内存控制器集成 在北桥芯片中, 硬盘接口、 USB 接口、 网络接口、 音频接口以及鼠标、 键盘等接口放在南桥芯片中。 此外, 在北桥上还会提供各种扩展接口用于其他功能卡的连接。
随着芯片集成度的进一步提高, 图形处理器也开始被集成到 CPU 芯片中, 于是, 北桥存在的 必要性就进一步降低, 开始和南桥合二为一, 形成 CPU-南桥结构。
片上系统 ( System on Chip, 简称 SoC) 是一种单片计算机系统解决方案, 它在单个芯片上集 成了处理器、 内存控制器、 GPU 以及硬盘、 USB、网络等 IO 接口, 使得用户搭建计算机系统时只需要使用单个主要芯片即可,SoC 单片结构最常见的是在手机等移动设备中。
处理器对存储器的控制是通过读写指令来完成的。 处理器通过读写 IO 寄存器来访问设备,通过向IO寄存器写入数据,被设备控制器解析成命令, 因此有些情况下将处理器对 IO 寄存器的访问称为命令字,处理器通过向 IO 寄存器写入命令字来控制 IO 设备。处理器 和 IO 设备之间的同步有两种方式: 查询和中断。代计算机的绝大部分 IO 设备都支持中断方式。中断本质上是 IO 设备对处理器发出的一个信号, 让处理器知道此时有数据传输需要或者 已经发生数据传输。 CPU 收到中断信号后, 会暂停当前 CPU 的执行进程, 转去执行某个特定的程序。
内存总线用于连接处理器和主存储器。系统总线是处理器与其他芯片进行数据交换的主要通道,, 同时也作为多处理器间的连接以构成多路系统。设备总线用于计算机系统中与 IO 设备的连接。计算机系统启动过程:无论采用何种指令系统的处理器, 复位后的第一条指令都会从一个预先定义的特定地址取回(这个地址需要对应一个能够给处理器核提供指令的设备, 这个设备以前是各种 ROM, 现在通常是闪存(Flash)。)。 处理器的执行就从这条指令开始。 处理器的启动过程, 实际上就是一个特定程序的执行过程。 这个程序我们称之为固件, 又称为 BIOS( Basic Input Output System, 基本输入输出系统)。从获取第一条指令开始, 计算机系统的启动过程也就开始了。为了使计算机达到一个最终可控和可用的状态, 在启动过程中, 需要对包括处理器核、内存、 外设等在内的各个部分分别进行初始化, 再对必要的外设进行驱动管理。
初始化:过 load / store 指令或其他方法将指定寄存器或结构设置为特定数值。
实现不同处理器核之间相互同步与通信的一种手段是核间中断(核间中断也是利用一组 IO 寄存器实现,Linux 内核采用该方式)与通信信箱机制(信箱寄存器)。
目前计算机中常见的存储层次包括寄存器、 高速缓存 (Cache)、 内存、 IO 这四个层次。
存储系统分为高速缓存 (Cache)、 主存储器和辅助存储器三个层次。Cache由静态随机访问存储器(SRAM)实现,访问速度纳秒级,使用 DRAM(访问速度一般在几十纳秒级)来构建程序的主存储器 (也称为主存、 内存), 使用磁盘或闪存来构建大容量的存储器。Cache 是内存的映像, 其内容是内存内容的子集, 处理器访问 Cache 和访问内存使用相同的地址。闪存是一种半导体存储器, 它和磁盘一样是非易失性的存储器, 但是它的访问延迟却只有磁盘的千分之一到百分之一, 而且它尺寸小、 功耗低, 抗震性更好。 常见的闪存有 SD 卡、 U 盘和 SSD 固态磁盘等。
由于 Cache 没有独立的编址空间, 且只能存放一部分内存的内容, 所以一个 Cache 单元可能在不同时刻存储不同的内存单元的内容。 这就需要一种机制来标明某个 Cache 单元当前存储的是哪个内存单元的内容。 因此 Cache 的每一个单元不仅要存储数据, 还要存储该数据对应的内存地址 (称为 Cache 标签, Tag) 以及在 Cache 中的状态 (如是否有效, 是否被改写等)。
现代处理器采用多种微结构设计技术挖掘指令级并行性, 包括指令流水线、 多发射、 动态调度、 寄存器重命名、 转移猜测等技术。 指令流水线重叠执行多条不相关的指令; 多发射技术允许一个时钟周期执行多条指令, 类似于 “多车道”; 动态调度允许后续指令越过前面被阻塞的指令继续被调度执行, 相当于允许 “超车”; 寄存器重命名可以消除RAW 和 WAW 的假相关并支持猜测执行; 转移猜测技术可以猜测分支指令的方向和目标, 在分支指令还未执行完之前获取更 多可执行指令, 以减少控制相关造成的指令流水线阻塞。 这方面的技术已经比较成熟。
程序的并行行为主要包括:指令级并行性(Instruction Level Parallelism, 简称 ILP) 主要指指令之间的并行执行。数据级并行性 (Data Level Parallelism, 简称 DLP) 是指对集合或者数组中的元素同时执行相同的操作,这种并行性通常来源于程序中的循环语句。任务级并行性 (Task Level Parallelism) 是将不同的任务 (进程或者线程) 分布到不同的处理单元上执行,针对任务表现为进程或者线程。
在共享存储系统中, 所有处理器共享主存储器, 每个处理器都可以把信息存入主存储器, 或从中取出信息, 处理器之间的通信通过访问共享存储器来实现。
多核处理器 ( Multicore Processor) 在单芯片上集成多个处理器核, 也称为单片多处理器(Chip Multi- Processor, 简称 CMP), , 一般大于 64 核为众核处理器。通用多核处理器的一级Cache 几乎都是私有的,片内共享最后一级 Cache。