Processor Microarchitecture

Processor Microarchitecture

  1. 处理器的更新的两个主要原因:技术的升级、工作负载的更新

  2. 处理器的不同侧面的分类:(正交分类,一个处理器具备多个属性)

    • 流水线处理器和非流水线处理器

    • 按序处理器和乱序处理器

    • 标量处理器(每周期吞吐量不超过一条指令)和超标量处理器

      VLIW也是超标量处理器(许多指令的延迟作为指令集体系结构的一部分,对程序员可见),VLIW处理器要求编程人员必须能够了解硬件结构,从而能够保证程序的正确执行,而其它处理器则不需要了解硬件结构信息

    • 向量处理器

    • 多核处理器

    • 多线程处理器(能够同时在一个或者多个核上执行超过一个线程的处理器)

      多线程处理器和多核处理器的区别在于多线程处理器在执行多个线程时会共用大部分硬件资源,而在多核处理器中大多使用不同的硬件资源。一个处理器即可以是多核处理器也可以是多线程处理器。

  3. Reorder Buffer的目标:存储指令相关的信息,以保证指令正常执行

  4. Register renaming的目标:去除指令中所有的伪相关(WAW,WAR),也称为name dependences。这些相关是由于重复使用同一个storage造成的
    这里写图片描述

  5. Dispatch阶段:预定指令将会使用到的资源,包括ROB表项,issue queue表项,load/store buffer表项。如果资源没有空余的,指令将会在此等待

  6. Issue阶段:指令被分配到issue queue中,直到issue的逻辑单元决定当前指令可以执行为止

  7. Bypass:归属于执行阶段。基本的由若干条连线组成,这些线将某些某些单元的执行结果发送到一些单元的输入部分。线延迟会成为决定处理器时钟周期的一个重要因素。

  8. 实地址空间:处理器可以在总线上产生的地址的范围

    虚地址空间:程序可使用的地址范围。虚地址产生的两个主要原因

    • 虚地址允许程序可以运行在拥有不同的物理地址的机器上或者是多任务共享内存的机器上
    • 使用虚地址能够有效的隔离开不同的程序,以保护多任务系统中的每个程序
  9. 并行的cache访问:tag array和data array同时访问,最后利用一个way multiplexor选择出正确的数据。并行的访问可以获得更低的时钟频率和更高的功耗,但是使得cache访问在一个周期内完成。

    串行的cache访问:首先访问tag array,确定way地址后,访问data array。串行访问去除了way multiplexor,减轻了关键路径的长度。尽管此时cache访问需要多于一个周期,但是允许cache在一个更高频率上运行。同时这种设计功耗更低,因为不需要一次性取出一个set。

    在乱序处理器中,cache的访问延迟可以被掩盖,此时串行访问更好,在按序流水线中,存储访问延迟更加重要,此时并行访问更合适。

  10. 相连度影响着cache的访问时间和cache的访问冲突

  11. Non-blocking cache或者lockup-free cache

  12. implicitly MSHR:针对于同一个cache block的同一个word的cache miss只能发生一次
    这里写图片描述

    explicitly MSHR:允许针对于同一个cache block的同一个word的cache miss发生多次
    这里写图片描述

  13. 多端口的cache

    • True multiported cache:所有的cache内部的控制逻辑和数据通路都需要复制一份,即两个地址tag和data的译码器,两个way multiplexors,两个tag比较器,两个aligner(定位器)等。此时data和tag array并没有被复制一份,只是内部被设计为允许针对同一个的array cell可以并行访问(array需要是多端口的)。此时优势在于高带宽,但是会增加cache的访问时间。实际很少在商业上使用
    • array复制:复制data array和tag array。采用tag array复制的设计更多。此时能够得到类似于真多端口一样的效果,高带宽,但是不会影响处理器的时钟周期。Alpha 21164
    • Virtual Multiporting:分时复用的技术。例如在alpha 21264的设计中,在一个时钟周期的上升沿和下降沿分别执行一次cache的read。从而表现出一个周期两个read的效果。但是在现代的微处理器中,由于带宽太高了,这样的设计很难实现。IBM Power2
    • Multibanking:Cache被划分为多个不同的小array(banks),每个bank一个单端口。当两个cache read发生在不同的bank上,则在一个周期内能够完成多个cache read操作。MIPS R10000,AMD Opteron
  14. Instruction Cache

    • 单端口cache:由于程序中的指令在取指时以顺序取指为主,所以指令cache通常情况下会一次性取出整个cache block的数据,从而包含连续的多条指令。因此在这种情况下,多端口的设计没有很大的必要
    • Blocking cache:程序的执行顺序所决定的。如果之前的指令尚未取到执行,之后的指令不应该被提前取到执行
    • 并行的tag和data array访问:加快访问进程,减少由于mispredict所带来的影响;
  15. Trace Cache和传统的cache的两点不同

    • 数据会被复制,同时存储器每个端口的带宽会被充分利用。在Trace cache中同一条指令会出现在多个不同的traces中,而传统的cache中只会存在一次
    • 在传统的cache中,端口的带宽受限于taken的分支指令的出现频率,而这个频率在某些整点程序中非常高。而Trace cache没有这个限制。
      这里写图片描述
  16. BTB:branch target buffer。硬件的一个table,用于预测当前指令是否为一条分支指令,使用PC进行索引。BTB的每个表项有多个元素,元素个数取决于当前取指单元每次可以同时取到的指令的个数。每个元素仅需要一个bit,用于指示当前指令是否为分支指令。BTB主要用于预测PC相关的条件分支指令。

  17. RAS:return address stack。return from-subroutine instructions。Hardware LIFO structure。如果RAS能够无限大,则所有的return instructions都不会被预测错误。当RAS满了之后,旧值会被扔弃。

  18. 静态分支预测:profiling information、loop branch

  19. 混合的分支预测器:多个分支预测器组合在一起,使用选择器选择出当前最合适的预测器进行分支预测。优点:不同的代码在不同的分支预测器上效果不一样、每个分支预测器的warm-up时间不一样。

    预测器的warm-up时间:预测器从初始状态开始(tables和registers包含着和当前分支指令不相关的信息)到一个稳定的状态能够预测正确的时间。一层的局部预测器的warm-up时间很短,其次相关预测器(gshare)warm-up的时间很更长。

    在上下文刚切换之后,local predictor的效果更好,之后一段时间后,correlative predictor会更好。

  20. 译码阶段的作用:明白指令的语义,同时定义指令如何在当前处理器上执行。

    • 指令的类型是什么:控制、存储、算术等
    • 指令应该执行什么操作?例如算术指令应该让ALU执行什么操作
    • 指令需要哪些资源?例如算术指令的源操作数寄存器和目的操作数寄存器
  21. 译码的复杂程度取决于:ISA的定义,同时译码的指令数

  22. micro-operations/uops:x86指令在执行过程中,翻译成内部的类RISC指令格式,这些内部指令称为微操作。

  23. x86的译码分为两个阶段:Instruction Length Decode(Predecode, ILD), dynamic translation to uops。两者之间增加IQ(instruction queue)锁存指令。ILD主要将指令流转换为若干条x86指令,然后进行微操作翻译。

  24. x86中的寄存器和寄存器指令会被翻译为一个微操作,而带有存储器操作数的指令或者使用了复杂的地址索引模式的指令会被翻译为多条微操作

  25. Allocation阶段的功能:寄存器重命名和指令分派(dispatch)

  26. 寄存器重命名第一次被Tomasulo提出,在他的针对于IBM 360/91浮点执行部件的乱序执行设计中使用了寄存器重命名。

  27. 寄存器重命名的三种方式:利用reorder buffer,利用rename buffer,利用merged register file

  28. 使用ROB的寄存器重命名:将寄存器的数值存放在ROB和体系结构寄存器中。ROB存储着尚未提交的指令的结果,体系结构寄存器则存储着最新的已经提交的指令的寄存器的值。此时rename table存储着每个结构寄存器的最新值是在ROB中还是在体系结构寄存器中,同时table还会存储当前结构寄存器在ROB中的位置。Intel Core 2

  29. 使用Rename Buffer的寄存器重命名:许多指令不会产生寄存器的结果,因此ROB中的位域空闲浪费,因此使用Rename Buffer拆分之前ROB中的位域,以减少空间浪费。Rename Buffer只存储当前在执行的指令中产生寄存器结果的指令,其余基本与使用ROB的一致。IBM Power3

  30. 使用Merged Register File的寄存器重命名:MRF同时存储尚未提交的指令和提交之后指令所产生的结果。MRF相较于ARF更大。使用Free List来维护当前MRF中尚未被使用的寄存器。使用Register Map Table记录体系结构寄存器和MRF中寄存器的对应关系。当一个寄存器明确不会被使用,此时才会被认为是free。防止当发生类似于分支预测错误时,Rename Table能够正确回退。Alpha 21264,MIPS R12000, Pentium 4

  31. A physical register is Dead:之后使用到了同一个体系结构寄存器作为目的寄存器的指令提交之后,则这个体系结构寄存器之前的映射关系所对应的Physical Register认为是Dead

  32. Register File Read:read before issue / read after issue

  33. Read Before Issue:在指令发送到Issue Queue之前读取操作数,如果可用,则在Issue queue中存储具体数值,否则存储将要产生的功能单元的标号。优点在于Register File不需要大量的端口。问题:占用更多的空间。同一个数据可能被读两次(RF,Issue Queue),写一次(Issue Queue),从而带来更多的能量开销。

  34. Read After Issue:Issue Queue存储寄存器的标号,当实际执行时,根据标号读取实际的值。这种方案要求RF有大量的端口,保证同时读取多个数据。

  35. 使用ROB/RNB进行寄存器重命名,同时采用read-after-issue策略所带来的问题:当一个寄存器被重换名到ROB的一个表项,此时Issue Queue中则会存储该表项的指针,但是如果在将要使用到该指针指向的表项的值时,ROB中的该表项提交了,此时原先在Issue Queue中存储的寄存器的指针将会出现问题。

  36. 按序发射是指指令被发送到执行部件进行执行的顺序和指令的取指顺序一致。当前指令必须等待之前的所有指令issue之后才能被issue(此时也要满足操作数可用,硬件资源有空闲)

  37. 按序发射逻辑有时就在译码阶段,此时只需要两个表检查:data dependence table 和 resource table。前者使用寄存器号索引,用于指示当前寄存器的值是否可用。后者记录功能部件当前是否空闲可用。

  38. VLIW处理器不需要之前的两个表来实现按序发射的逻辑。VLIW处理器的按序发射逻辑由软件在上层进行保证

  39. 乱序发射是指当前指令的操作数如果可用并且需要使用的功能单元空闲,则将指令发射到功能部件上。

  40. Issue Process when Source Operands Are Read before Issue。统一的Issue Queue

    • (Issue阶段第一步)Instruction Wakeup:一个事件用于提醒指令中的某一个源操作数已经产生。这个信号通常包括reg ID(after renaming), value, valid bit。在read before issue的设计中,这个信号不仅要广播到Issue Queue,同时也要广播到Renaming阶段。同时由于read在issue之前,所以allocation阶段和issue阶段之间需要一个写周期,这个写周期也必须能够收到wakeup信号,以避免产生死锁(在写周期内产生的wakeup丢失)
    • (Issue阶段第二步)Instruction Selection:用于选择当前Issue queue中所有ready(操作数可用,功能部件空闲)的指令集合。一般被称为Arbiters/Schedulers。功能单元和Issue queue都会和一个arbiter相连。Issue queue需要一个arbiter,用于决定当前指令应该在哪一个queue中分配entry,同时大致保持每个queue中的指令数目大致相同。
    • (Issue阶段第三步)Entry Reclamation:Issue queue的表项在指令发送到功能部件后(某些情况下,需要当指令开始执行时才能够释放),可以被安全的回收。
  41. Issue Process when Source Operands Are Read after Issue.。统一的Issue Queue

    • Allocation阶段操作变少,缺少了read op的部分,同时Issue阶段增加了Data Read的部分
    • 对RF读端口的数量有更大的需求
    • 减少RF读端口个数:1) 将寄存器复制一份,减少每个寄存器堆的端口数;2) 通过计算当前选择的指令所需要的读端口个数,来决定当前选择的指令集合能否执行;3) 如果当前发射到功能部件开始执行的指令所需要的寄存器端口数超过了已有的,某些已经发射的指令需要重新会到issue queue,重新发射。
  42. 乱序Issue的其它实现方式

    • Distributed Issue Queue:处理器中的功能单元以簇的形式组合在一起,形成多个簇,每个簇有一个私有的Issue Queue。Intel Pentium 4
    • Reservation Station:每个功能单元一个私有的Buffer,称为RS。RS用于存储将要执行的指令和输入值。Tomasulo,IBM 360/91
  43. Issue Logic for Memory Operations:nonspeculative and speculative disambiguation policies.

    • nonspeculative:要求当前的存储操作在执行之前,所有之前相关的存储操作已经完成。
    • speculative:预测当前的存储操作是否与之前的存储操作有相关,然后执行
    • 保守的策略带来性能的限制,激进的策略会带来复杂的恢复机制和更大的功耗
  44. 非推测的存储策略:Total Ordering、Partial Ordering、Load ordering and store ordering

    • Partial Ordering:all stores are processed in order, but loads execute out of order as long as all previous stores have computed their address。MIPS R10000,AMD K8
    • Load Ordering and Store Ordering: Execution between loads and stores is out of order, but all loads /all stores execute in order among them。AMD K6
  45. 提前预测Load指令命中了Cache(假设3个周期内一定可以取到数据):因为Load访问cache是否产生miss并无法确定,因此一般情况下需要等待Load明确hit cache之后,才会发出wake up的信号,通知之后的指令操作数可用,但是这个时间内后续执行无法执行。在当前cache hit rate较高的情况下,提前预测load会hit,提前发出wake up信号,使得之后的指令提前开始准备ISSUE,加快执行。

    • 如果预测错误,之后issue的指令需要重新会到issue queue之中,在发射一遍。但是Issue queue这个时候可能已经被后续的指令占满,解决方案有两种
    • 第一种:清空issue queue,重新从load之后的指令开始执行
    • 第二种:被预测hit之后发射的指令,在issue queue之中的表项不清空,直到知道这些指令不需要reissue之后在被回收
    • 由于issue queue的entry很少,如果一直占用不回收,之后的指令将无法进入queue。此时提出使用replay queue,用于存储可能需要reissue的指令,同时replay queue相对于issue queue的等级更高。
  46. x86处理器算术运算的六种标志位:sign, parity, adjust, zero, overflow, carry

  47. 某些处理器中,为了节省面积和功耗,会将整数的乘法和除法运算放入FPU,整数首先转换为浮点数,然后在FPU中进行运算。(尽管运算时间会变长,但是带来的好处更大,同时实际应用中整数的乘法和除法很少)Intel Atom

  48. x86的地址计算:offset=base+(index*scale)+displacement

  49. 控制流指令计算PC的三种形式:Direct absolute、Direct PC-relative、Indirect

  50. FPU包括了浮点数的算术运算,同时也包括了浮点和整点之间的转换功能

  51. 通过SIMD单元由若干独立的单元组成:sub-units、a float-point unit、an integer/logical unit and a shuffle unit。每一个unit可以继续划分为若干个lanes。lane是最小的处理vector的的单元,每个lane能够计算得到一个vector元素的结果。lanes的个数并没有严格的限制为vector的元素个数,具体设计需要根据性能和面积,功耗决定。

  52. Bypass的出现:当一条指令需要前一条指令的执行结果作为源操作数时,如果当前指令等待前一条指令将结果写回寄存器之后再读取,则当前指令必须等待一段时间(在某些复杂流水线中)。编译器解决这种情况的方法:在两条相关指令之间插入无关指令。硬件解决:bypass,提前获取前一条指令产生的结果
    这里写图片描述
    这里写图片描述
    这里写图片描述

  53. Bypass:wire and multiplexors(因此称为bypass network)。bypass一方面可以改进性能,但是也会影响功耗和cycle time

  54. Multilevel bypass for wide out-of-order machines

    和r0锁存器相连的五路选择器包括的内容:w0,w1两个锁存器的内容(上一个周期FU的结果,Result drive阶段的bypass),FU0,FU1当前周期的结果,R0寄存器的内容
    这里写图片描述
    这里写图片描述
    这里写图片描述

  55. 在Bypass方面,乱序执行的机器比按序执行的机器可能更加的复杂。按序执行中,write-back阶段必须在最慢的FU功能单元执行结束之后才能开始执行,否则将会出现乱序提交的情况。在按序处理器中,延迟write-back的操作称为staging(字面翻译:分段运输)of the result/staging latch。在高频的按序处理器中,staging会非常的深。为了指令执行过程中,不需要bubble停顿,所有的staging必须利用bypass前递数据。

  56. 按序执行中的bypass设计:为了减少latch的使用和能耗,设计structure register file 存储指令在执行过程中产生的结果,直到指令按序提交之后释放。所有的bypass从SRF出发,一个结果也不需要复制多次,类似于乱序执行中的ROB或者是merged physical registers。

  57. 随意的增加功能部件,以提高乱序执行的性能所带来的问题:复杂性增加,可扩展性变差,功耗增加,热量增加,bypass网络更加复杂。因此利用更多的硬件资源以提高性能,必须有一定的组织方式:clustering,将关键的硬件拆分,在保持大部分的并行性的同时,改善可扩展性。

  58. Clustering the bypass network:最简单的cluster的形式。在设计bypass network时,不允许两个功能单元之间的数据传递,但是允许每个功能单元有局部的bypass逻辑。此时如果两个指令有相关,可以将其发射到同一个功能部件上,此时仍旧不会有bubble产生。优点:复杂性更低,线更少,功耗更低,执行频率也会更高。
    这里写图片描述

  59. Clustering with Replicated Register Files

    RF的读端口和写端口增加会使得access latency增加。因此为了解决在乱序执行过程中由于太多的功能部件请求RF,而RF端口无法设计太多的问题,Alpha 21264将整点的功能部件划分为两个clusters,每个clusters有一个RF,两个RF是相互复制的关系,数据均相同。从而使得单个RF的端口数量需求变少。这样带来的优点:bypass网络更加的简单,功耗更低,频率更高
    这里写图片描述

  60. Clustering with Distributed Issue Queue and Register Files

    Distributed Register File:不再是RF的副本,而是将一个RF拆分为两个部分,每个cluster一个,大小变为一般(端口和表项)。两个RF之间可以使用隐式的机制通信传递数据,也可以使用显式的copy指令,传递寄存器数据。

    Issue Queue分为若干个,每一个cluster一个。在rename stage之后,使用steer机制决定当前之后应该进入哪一个issue queue,以产生最小的cluster之间的通信。
    这里写图片描述

  61. speculative:在乱序执行过程中,所有在commit之前的流水线阶段都认为是推测式的,不会改变体系结构状态直到commit之后。

  62. 精确中断:可以提供正确的系统状态,就好像是发生exception的指令在出发异常之前时的体系结构状态一样。

  63. architectural state, speculative state

    architectural state:在commit阶段更新的状态,如果当前处理器时按程序的顺序执行。包括存储器状态和每个逻辑寄存器的值

    speculative state:architectural state和当前处理器正在执行的指令修改的系统状态

  64. 对于X86指令,许多复杂的指令会分解为多条micro-operations,只有当所有的微操作全部执行结束之后才能够认为当前x86指令可以提交,然后更改体系结构状态。但是对于会分解为很多条微操作的指令而言,处理器根据指令手册,会定期的在某些特定的执行节点,提交部分微操作的结果。

  65. ROB的表项在allocation/rename 阶段分配,当指令提交或者被squashed时回收。

  66. 当ROB中的指令提交之后,指令产生的计算结果也将从ROB中转移到RRF(逻辑寄存器)中,此时所有尚未读到值的消费者需要直到,当前ROB中不存在这个值,需要到RRF中读取。

    • read before issue:当ROB表项提交之前,data能够被正常的从ROB中读取。当ROB表项提交之后,rename table需要进行更新,指明当前的数据在RRF中,从而使得之后的指令在RRF读取数据
    • read after issue:此时当ROB表项提交时,不仅仅要通知allocation stage,同时也要通知所有在allocation和issue阶段之间的指令,包括issue queue的指令。以保证所有带有ROB标号的指令重新指向
  67. 使用merged register file相对于ROB的好处。但是前者在状态recovery时更加复杂。

    • 当提交之后,value的位置不会发生改变。physical register会一直保持之前的值,直到不会在被使用,尽管指令已经提交。这种方式适合read after issue的策略使用
    • ROB的占用更多的硬件资源。很多表项不会使用value字段保存结果,例如branch指令,store指令。
    • ROB时中心化结构。在硬件资源划分为cluster时,并且是read after issue的情况下,decoupled ROB比较复杂,但是PRF很容易进行复制,分散到每一个cluster。
  68. recovery of the speculative state:branch mispredictions,exception

  69. branch misprediction recovery based on ROB:front-end recovery、back-end recovery

    • front-end recovery:简单。通常情况下,所有错误路径上取到的正在等待重命名的指令清空,恢复BP状态,更新PC到正确路径上的指令。
    • back-end recovery:清除所有错误路径上的指令,包括memory order buffer, issue queue, ROB等。同时恢复renaming table,从正确路径开始rename。所有跟错误路径上指令相关的硬件资源会被回收,例如Registers和queue entry。
    • front-end比back-end恢复更快,指令能够更早的成正确路径上取指。
  70. branch misprediction recovery based on Merged Register File

    处理器会记录一个log,包括renaming table的修改和当前指令的资源分配情况。当branch发生错误预测时,处理器根据记录的log,将处理器恢复到branch被重命名时的正确状态,重新执行。

    在处理器状态需要recovery时,使用log进行回退的时间代价会很长,因此需要采取一些优化方式。MIPS R10000和Alpha 21264增加checkpoint的方式来加快recovery。当branch发生预测错误时,从checkpoint点开始恢复。

  71. Exceptions通常在commit阶段处理,原因:

    • 首先在commit阶段确定当前触发exceptions的指令不是推测执行的(不是错误路径上的)
    • 提供正确的体系结构状态,保证之前的指令都已经按照程序的顺序执行完成
  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值