提问者:小点点

一个简单的5级处理器的级需要多少个时钟周期?


5级流水线CPU具有以下阶段序列:

>

  • IF-从指令存储器中获取指令。

    RD-指令解码和寄存器读取。

    EX-Execute:数据和地址计算的ALU操作。

    MA-数据存储器访问-对于写访问,使用RD状态下读取的寄存器。

    WB-注册回写。

    现在我知道,例如,从内存中获取指令可能需要4个周期(L1缓存)或最多150个周期(RAM)。然而,在每个流水线图中,我看到了这样的东西,其中每个阶段都被分配了一个周期。

    现在,我当然知道真正的处理器有超过19个阶段的复杂管道,每个架构都不一样。然而,我在这里错过了什么吗?在中频和MA中访问内存,这个5级管道能需要几十个周期吗?


  • 共1个答案

    匿名用户

    经典的5级RISC管道是围绕单周期延迟L1d/L1i设计的,允许代码中有1IPC(每个时钟的指令),而不会出现缓存未命中或其他失速。即希望是常见/好的情况。每个阶段都必须有1个周期的最坏情况关键路径延迟,否则会触发失速。

    当时的时钟速度较低(甚至相对于1个门延迟),因此您可以在单个周期内完成更多工作,缓存也更简单,通常8k直接映射的单端口,有时甚至是虚拟标记(VIVT),因此TLB查找不是访问延迟的一部分。第一代MIPS R2000(和R3000)的片上控制器为其直接映射的PIPT拆分L1i/L1d写通缓存提供了1个片上控制器,但实际的标签数据是片外的,从4K到64K。使用这种设置实现所需的单周期延迟将时钟速度限制在15兆赫(R2000)或33兆赫(R3000),使用可用的SRAM技术。TLB完全在芯片上。

    与使用32kiB 8路VIPT L1d/L1i缓存的现代Intel/AMD相比,L1d至少有2个读1写端口,时钟速度如此之高,访问延迟为4个周期(英特尔SnB系列最佳情况),或包括地址生成在内的5个周期。现代CPU也有更大的TLB,这也增加了延迟。当乱序执行和/或其他技术通常可以隐藏延迟时,这是可以的,但是经典的5级RISC只有一个管道,而不是单独的流水线内存访问。另请参阅x86上L1缓存命中与注册的周期/成本?有关现代超标量无序exec x86 CPU与经典RISCCPU的性能差异的更多链接。

    如果您想提高相同晶体管性能(门延迟)的时钟速度,您可以将fetch和mem阶段划分为多个流水线阶段(即更频繁地流水线),如果缓存访问甚至在关键路径上(即如果缓存访问不能再在一个时钟周期内完成)。延长管道的缺点是增加分支延迟(错误预测的成本,以及正确预测必须隐藏的延迟量),以及增加总晶体管成本。

    请注意,经典RISC管道在EX阶段进行地址生成,使用那里的ALU来计算寄存器立即,这是大多数RISCISA围绕此类管道构建的唯一支持的寻址模式。因此,由于转发回EX的加载延迟,加载使用延迟实际上是指针追逐的2个周期。)

    在缓存未命中时,整个管道会停止:那些早期的管道缺乏负载记分板,以允许来自L1d缓存的负载命中或未命中。

    MIPS R2000确实有一个4条目存储缓冲区,以将执行与缓存未命中存储解耦。(根据维基百科,显然是由4个独立的R2020写缓冲芯片构建的。)LSI数据表说写缓冲芯片是可选的,但是对于直写缓存,每个存储都必须DRAM,并且会在没有写缓冲的情况下产生失速。大多数现代CPU使用写回缓存,允许同一行的多次写入,而不会产生DRAM流量。

    还要记住,对于像MIPS R2000这样的早期CPU,CPU速度相对于内存来说没有那么高,单核机器也不需要内核和内存控制器之间的互连。(尽管它们可能确实有一条前端总线连接到一个单独芯片上的内存控制器,一个“北桥”。)但不管怎样,那时DRAM缓存未命中花费的核心时钟周期要少得多。每次未命中都完全失速很糟糕,但它不像现代CPU那样可以在150到350个周期范围内(70 ns*5 GHz)。DRAM延迟的改善几乎没有带宽和CPU时钟那么大。另请参阅http://www.lighterra.com/papers/modernmicroprocessors/具有“内存墙”部分,以及为什么大多数处理器中L1缓存的大小小于L2缓存的大小?回复:为什么现代CPU需要多级缓存,因为CPU速度和内存延迟之间的不匹配已经增加。

    后来的CPU通过允许在非错误加载(成功TLB查找)后继续执行等操作,逐渐允许更多的内存级并行性,只有当你实际读取加载最后写入的寄存器时才会停止,如果加载结果还没有准备好。这允许在仍然很短且相当简单的顺序管道上隐藏加载延迟,并有一些加载缓冲区来跟踪未完成的负载。通过将寄存器重命名为OoO exec,ROB大小基本上是您可以隐藏缓存未命中延迟的“窗口”:https://blog.stuffedcow.net/2013/05/measuring-rob-capacity/

    现代x86 CPU甚至在前端的流水线阶段之间有缓冲区来隐藏或部分吸收获取气泡(由L1i未命中、解码停顿、低密度代码引起,例如跳转到另一个跳转,甚至只是未能预测一个简单的总是获取的分支。也就是说,只有在获取正确路径以外的东西后,最终解码时才会检测到它。没错,即使是像jmp foo这样的无条件分支也需要对获取阶段进行一些预测。)

    https://www.realworldtech.com/haswell-cpu/2/有一些很好的图表。当然,英特尔SnB-系列和AMDZen-系列使用解码的uop缓存,因为x86机器代码很难并行解码,所以它们通常可以绕过一些前端复杂性,有效地缩短管道。(维基百科有Zen 2的框图和微架构细节。)

    另请参阅现代微处理器90分钟指南!关于:现代CPU和“内存墙”:DRAM延迟和核心时钟周期时间之间日益不匹配。随着近年来带宽持续大幅攀升,DRAM延迟仅下降了一点点(以绝对纳秒为单位)。

    R2000数据表显示D-cache是写通的,以及其他各种有趣的事情。

    根据一位SGI工程师1992年的usenet消息,控制逻辑只发送18个索引位,接收一个数据字8个标签位来确定是否命中。CPU忘记了缓存大小;你将正确数量的索引行连接到SRAM地址行。(所以我猜一个4字节字的行大小?)

    您必须使用至少10个索引位,因为标签只有20位宽,并且您需要标签索引2(字中字节)为32,即物理地址空间大小。这将最小缓存大小设置为4K。

    每32位数据20位标记是非常低效的。使用更大的缓存,实际上需要更少的标记位,因为更多的地址被用作索引的一部分。但是Paul Ries发布说R2000/R3000不支持比较更少的标记位。IDK如果你可以将一些地址输出线连接到标记输入线,以生成匹配的位,而不是将它们存储在SRAM中。

    32字节的缓存行仍然只需要20位标签(最多),但每8个字将有一个标签,标签开销提高了8倍。具有更大缓存的CPU,尤其是L2缓存,肯定希望使用更大的行大小。

    但是,您可能更有可能使用更少的大行来获得冲突未命中,尤其是使用直接映射缓存。当您遇到另一个未命中时,内存总线仍然可以忙于填充前一行,即使您有关键字优先/提前重启,因此如果内存总线一开始就处于空闲状态,未命中延迟不会更糟。