用于在同步多线程处理器中 改变流水线长度的方法和电路 【技术领域】
本发明一般地涉及用于具有同步多线程(SMT,simultaneous multi-threading)和单线程操作模式的处理器的方法和电路。
背景技术
长期以来,获得更高性能的关键在于每周期执行更多的指令,换而言之,称之为指令级并行运算(ILP,Instruction Level Parallelism),或者减少指令等待时间。为在每周期执行更多指令,不得不添加更多的功能单元(如整数运算,浮点运算,载入/存储单元等)。为更加协调地执行多条指令,可使用称作失序处理(OOP,out-of-order processing)的处理范例,且实际上,这种类型的处理已经成为主流。
OOP的出现是由于多个指令依赖于已选入处理流水线的其他指令的结果。为有助缓解该问题,将大量指令进行存储以允许立即执行。这样做的原因是为了搜索到更多互不依赖的指令。用于存储准备立即执行的指令地存储区称为重排序缓冲区。在最新式的商业计算机结构中,重排序缓冲区的尺寸不断增大,一些系统可存储多达126条指令。重排序缓冲区尺寸增大的原因很简单:空间相关的代码势必也在执行方面瞬时相关(可能对于复杂结构的数组及链表除外)。存在的问题是这些指令还可能依赖于以前指令的结果。由于CPU所需代码量日益增长,为了寻找更加独立的指令仅有的现行方法是增大重排序缓冲区尺寸。
然而,使用这种技术会导致在性能增长率方面呈相当有影响的下降趋势,且实际上已显示出转向减少。为获得相同性能增长率,现在采用越来越多的晶体管。人们不再专心关注单处理器ILP的性能获得,而是关注于通过多线程(多处理)的指令级或线程级获得性能的初级形式,而不以系统总线作为主要约束。
在单个芯片上安置更多晶体管的能力已允许进行片上处理(CMP,on-chip multiprocessing)。为利用潜在的性能增长,体系结构不是将这些多处理器用作单处理器,而是必须使用依赖于以并行方式执行指令的多处理。这要求在CMP上执行的程序还应以并行方式写入执行,而不以纯串行或顺序的方式。假设应用以并行方式(多线程)写入执行,则对于按这种方式写入的程序以与所添加处理器数量成正比的更快速度执行,存在着固有的困难。
在一个晶片上使用多个核心的一般原理在于,通过一次执行两个线程来获得更高性能。由此,两个CPU一起能保持始终做有用工作的功能单元总数占有更高的百分比。如果处理器有更多的功能单元,则在任一时刻更低百分比的这些单元可做有用的工作。片上处理器降低了每个处理器的功能单元数量,并使各个任务(和线程)分布到每个处理器。以此方式,能够获得有关双任务组合的更高吞吐量。相当的单处理器会比CMP芯片更快地通过一个线程或任务,这是由于尽管其存在有浪费的功能单元,但还具备有当处理器同时计算多个数据片时使用所有有效功能单元的“突发(burst)”行为。多处理器的一个思想是保持各个处理器不经历这种突发行为的机会,而是使每个处理器使用其最常用并因此高效可用的资源。在一个时钟周期内,一些功能单元不被使用称为“水平浪费”,这是CMP尽量避免的。
然而,使用CMP存在着问题。传统CMP芯片为快速完成两个或多个线程会牺牲单线程性能。以此方式,对于普通应用,CMP芯片相对不够灵活,这是由于若仅有一个线程,整个一半的分配资源处于空闲而完全未使用(正如在传统多处理器(MP)系统中在使用单线程程序的系统中添加另一处理器不会起到什么作用一样)。使CMP中的功能单元更加有效的方法是使用进程粒度多线程(CMT,course-grainedmultithreading)。通过在一定数量的时钟周期内执行一个线程,CMT提高了功能单元的利用效率。效率的提高是由于减少了“垂直浪费”。垂直浪费指的是因一个线程失效而导致所有功能单元都不能工作的情形。
当要切换到另一线程时,处理器保存该线程的状态(即保存指令在流水线中所处的位置,正在使用哪些单元)并切换到另一个线程。这通过使用多个寄存器组来实现。这样做的好处是考虑到在线程遇到高速缓存不能命中之前或者在线程运行完独立执行的指令之前只能运行一定的时间这一事实。CMT处理器仅能以此方式执行与其所支持的相同数量的不同线程。因而,仅能存储如下数量的线程,即对于所有这些线程的每一个都存在其物理位置以存储它们的执行状态。因此,N路CMT处理器需要有存储N个线程状态的能力。
关于该原理的一种变型是执行一个线程直至其遇到高速缓存未命中(通常是L2(二级)高速缓存未命中),在该点处系统将切换到另一线程。这具有使线程轮换通过处理器所需逻辑简化的优点,这是由于前面的线程一旦失效,将简单地切换到另一个线程。从而,减轻因等待要将请求的块输送回高速缓存而付出的代价。这与一些处理器所用的“失败但同时又命中(hit under miss,或hit under multiple miss)”的缓冲方案相似,但由于它操作在线程而非指令,从而又有所不同。CMT较CMP的优点在于,CMT不牺牲单线程的性能,且有很少的硬件重复(等分的很少硬件使两个处理器“等同于”一等效的CMT)。
对于多线程的一种更积极的方法称为细粒度多线程(FMT,fine-grained multithreading)。如同CMT一样,FMT的基础是在线程之间快速切换。不过与CMT所不同的是,其思路是在所有周期都切换。尽管CMT和FMT实际上确实减慢了一个线程的完成,但FMT加快了继续工作的所有线程,且其最紧要的是总体吞吐量。
CMP可消除某些在其中或到其中的垂直浪费。CMT和FMT可消除某些(或全部)垂直浪费。然而,可使用包括称为同步多线程(SMT)的高级形式的多线程的体系结构来减少水平和垂直浪费。SMT的主要目的在于具有在任何给定时刻以及在任何给定功能单元内从不同的线程运行指令的能力。通过轮换通过线程,SMT体系结构作用如同FMT处理器,通过同时从不同的线程执行指令,其作用如同CMP。由此,它允许设计者设计出更宽域的核心,而不用担心性能降低。由于具有在不同线程之间共享“未用”功能单元的能力,对于SMT有可能实现比FMT更高的效率;以此方式,SMT获得了CMP机器的效率。不过,与CMP系统有所不同,SMT系统对单线程性能造成的牺牲很少(下文中将会讨论该很少的牺牲)。其原因很简单。当运行单个线程时CMP处理器的大部分保持空闲,且在CMP芯片上具有更多处理器时该问题更加显著,而SMT处理器能够对单线程提供所有的功能单元。虽然这显然不像能够运行多线程那样有价值,但在单线程与多线程环境之间的均衡能力是非常有用的特性。这意味着,SMT处理器可尽可能的利用线程级并行运算(TLP,thread-level parallelism),若不能,则将完全专注于指令级并行运算(ILP)。
为支持多线程,SMT处理器比传统超标量体系结构处理器需要更多的寄存器。其一般目的是对于每个支持的线程提供与对单处理器同样多的寄存器。对于传统精简指令集计算机(RISC,reduced instructionset computer)芯片,这意味着需要32倍的N个寄存器(其中N为在一个周期中SMT处理器可处理线程的数量)加上多个再命名寄存器。对于4路SMT处理器的RISC处理器,这将意味着需要128个寄存器加上多个再命名寄存器。
大多数SMT模式直接源自传统的失序处理器。由于实际吞吐量增加对指令发布宽度有迫切需求,也应相应增大指令发布宽度。由于上述在寄存器文件尺寸方面的增加,SMT流水线长度可增加两级(一个用于选择寄存器库,一个用于读或写),以减慢时钟周期长度。因而,将用于寄存器读和寄存器写的级(stage)两者都分为两个流水线化的级。
为避免任何一个线程支配流水线,应该尽量确保其他线程获得执行时间和资源的实际一部分。当功能单元请求工作时,取机制将对那些在流水线中现有极少指令的线程提供更高的优先级。当然,如果其他线程根本没有指令去执行,则来自该线程的多个指令会支配流水线。
SMT趋向共享任何可能的要素。然而,在一些示例中,这破坏了数据的传统组织结构,以及指令流。当分支预测单元被共享时会变得效率更低,这是因为它不得不以更多指令监视更多的线程,并因此在给出精确预测方面效率更低。这意味着流水线会因预测失败需要经常刷新,不过可运行多线程的能力足以弥补这方面的不足。
由于SMT体系结构使用更长的流水线(多两级),再由于需要相当大的寄存器文件,对于误预测所导致的代价更大。然而,技术的进步使SMT体系结构中每线程所需寄存器的数量最小化,这是通过更有效的操作系统(OS,Operating System)和更好释放寄存器的硬件支持、以及若另一线程不使用所有寄存器时从另一线程上下文共享寄存器的能力来实现。
另一个问题是,与高速缓存尺寸、高速缓存的行(line)尺寸、以及由它们提供的带宽相关的线程数量。这对于单线程的程序,增大高速缓存行尺寸会减小未命中率,但也增大了未命中代价。对于使用更多不同数据的更多线程的支持使该问题更为严重,从而有效用于每个线程的高速缓存更少。当处理在多线程化工作负载之上的多程序化工作负载时,这种对高速缓存的竞争更为显著。因而,如果使用更多线程,则应使高速缓存更大。这还适用于具有共享L2高速缓存的CMP处理器。
更多使用线程会带来更高的总体性能,在内存数据的联系中的差异会变得更加显而易见。有迹象表明,当L1(一级)高速缓存尺寸保持恒定时,使用更相关的高速缓存实现最高级性能,尽管访问时间更长。在改变线程数量的同时通过改变不同关联的块尺寸,实现了用于确定性能的检测。正如以前所述,增大块的相关水平总是会提高性能;不过,若多于两个线程在使用,增大块尺寸会降低性能。其程度足以导致块相关度增加不足于弥补由更大块尺寸的更大未命中代价所导致的不足。
可以将部分SMT处理器实施为流水线单元以避免不得不增大时钟周期。例如,可对加载取指令地址寄存器(IFAR)、通过取得的地址访问高速缓存存储器、且若访问的指令为分支指令(分支预测逻辑)时进行预测的电路实现流水线。当指令为分支指令时,值得预测它是否为采纳的分支,以便从高速缓存载入该分支之后的下一个“目标”指令。一旦在流水线中的分支预测逻辑预测出采纳该分支,则计算出在分支路径中的下一个指令的目标地址。对于单线程,IFAR和高速缓存行将被刷新,并且对预测采纳的分支指令用计算出的目标地址载入IFAR。在此情形中,基于作为采纳分支的分支指令,对单线程的指令将保留程序次序。对于单线程操作,该操作的流水线显然应是最优化的。
在SMT模式中,在流水线输入处交替从两个线程,线程0(T0)和线程1(T1)的每一个对IFAR进行指令载入。如果条件出现诸如针对T0预测采纳的分支,则到IFAR的反馈依据流水线长度在一定数量的时钟周期之后将出现。此时重要的是使自T0和T1的指令按程序次序执行;因此,重要的是从处理来自T0的指令的反馈不要影响来自T1指令的顺序,反之亦然。在效果上,这可能需要在SMT模式中的流水线与在单线程模式中相比具有不同的周期长度。因此,需要一种方法和电路,对SMT系统进行配置,以便在SMT模式中为从多个线程中正确的一个接收输入而对流水线处理进行同步,以及使在执行单线程的应用中最快速的操作最优化。
【发明内容】
取指令单元(IFU,instruction fetch unit)具有三个时钟周期流水线,其中流水线包括用于载入取指令地址寄存器(IFAR)的电路、用于访问指令高速缓存(I-Cache)的电路、和用于确定指令是否为预测采纳的分支指令的电路。在SMT模式中,在交替的时钟周期上,从线程0(T0)的程序计数器,然后从线程1(T1)的程序计数器交替地对IFAR进行载入。当从一个线程(如T0)载入一分支指令时,分支预测电路直到第三个时钟周期(三周期流水线)才确定是否为预测采纳的分支,以及计算目标地址(在分支路径中的下一个指令)。在单线程模式中,在作为检测出预测采纳分支指令后下一个时钟周期的第四时钟周期上,将目标地址载入IFAR。然而,由于流水线为三个周期,这与在SMT模式中对于T1的正常载入相干扰。在本发明的实施例中,自分支预测逻辑的目标地址反馈被延迟一个时钟周期,如果选择SMT模式并检测出预测采纳的分支,确保在对于T0的周期期间将目标地址载入IFAR,这样不会与T1干扰。本发明有效地将流水线从单线程的三周期流水线切换到SMT模式中的四周期流水线。
为更好地理解本发明的详细描述,以上相当宽泛地概述了本发明的特征及技术优点。下面,将描述本发明的其他特征及优点,并形成本发明的权利要求内容。
【附图说明】
为充分理解本发明及其优点,现将参照附图给出以下描述,其中:
图1为在根据本发明实施例的SMT处理器中功能单元的方块图;
图2为实现本发明实施例的方法步骤的电路方块图;
图3为根据本发明实施例的方法步骤的流程图;和
图4为实现本发明的示例性硬件环境。
【具体实施方式】
在以下描述中,所给出的许多具体细节用于充分理解本发明。不过,应该理解对于本领域技术人员可在不具有这些具体细节的条件下实现本发明。在其他示例中,以方块图形式示出众所周知的电路,以避免不必要的细节使本发明模糊。对于本发明的大部分,通信协议中有关定时、数据格式等的细节对于充分理解本发明并不重要,且为相关领域普通技术人员所熟知,从而省略这些细节的绝大部分。
现参照附图,其中,没有必要按比例画出所示元件,且其中在数个图中相同或相似的元件用相同的附图标记表示。
参看图1,在此显示出CPU 410的细节。所设计的CPU 410用于在每个时钟周期执行多条指令。从而在任意一个时钟周期内,可在定点运算单元(FXU,fixed point unit)114、浮点运算单元(FPU,floatingpoint unit)118、和载入/存储单元(LSU,load/store unit)116的任何执行单元中执行多条指令。同样,CPU 410可在SMT模式中同时执行来自多线程的指令。
程序计数器(PC,program counter)134对应于具有执行指令的线程0(T0)和线程1(T1)。线程选择器133在T0与T1之间交替选择以将指令地址连接到取指令单元(IFU,instruction fetch unit)108。指令地址载入到取指令地址寄存器(IFAR,instruction fetch addressregister)103中。IFAR 103从指令高速缓存(I-CACHE)104对每个线程交替取指令。对于T0,将指令缓冲在指令队列(IQ,instructionqueue)135,对于T1,将指令缓冲在IQ 136中。IQ 135和IQ 136连接至指令调度单元(IDU,instruction dispatch unit)132。在线程优先级选择器137的控制下从IQ 135和IQ 136选择并读取指令。通常,线程优先级选择器137基本上正比于每个线程的程序所控制的优先级从IQ 135和IQ 136读取指令。
在IDU 132中的解码器(未示出)中将指令解码。然后,指令定序器113可按照由多种算法所确定的顺序将指令以组进行放置。指令组被发送到指令发送队列(IIQ,instruction issue queue)131。指令定序器113按程序次序从两个线程接收指令,但指令可不按程序次序从IIQ 131并从任一个线程发出。通用目标寄存器(GPR,general purposeregister)文件115和浮点寄存器(FPR,floating point register)文件117由多个执行单元使用,它们表示系统的程序状态。这些硬件寄存器可称为“结构化”寄存器。当将指令放入发送队列时,每个“结构化”寄存器都将被重命名。现修改的每个结构化寄存器都被指派一个物理寄存器,相应的查询表标识出与结构化寄存器相关联的物理寄存器。因此,在发送队列中已将结构化寄存器重命名,以便同时存在结构化寄存器的多个拷贝。这使得只要源操作数有效,就允许指令无序执行。寄存器重命名单元140对寄存器重命名并进行映射,以便当完成引用具体物理寄存器的所有指令以及物理寄存器不含有最新的结构化状态时,可重新指派未使用的物理寄存器。
指令在IIQ 131中进行排队,以在适当的执行单元中执行。如果指令包含有定点操作,则可使用多个定点运算单元(FXU)114中的任何一个。包括FXU 114、FPU 118和LSU 116的所有执行单元都与具有完成表(未示出)的完成单元119相连接,完成表表明已完成哪些发送的指令以及其他状态信息。来自完成单元119的信息发送至IFU 108。IDU 132还可向完成单元119发送信息。自LSU 116存储操作的数据连接至数据高速缓存(D-Cache)102。该数据可存储在数据高速缓存102中用于近期使用和/或发送到总线接口单元(BIU,bus interface unit)101,由总线接口单元通过总线412将数据发送到内存139。LSU 116可从数据高速缓存102载入数据以为执行单元(如FXU 114)所使用。
图2的方块图表示根据本发明实施例的IFU 108的细节。程序计数器134与在处理器410中执行的线程相应。在SMT模式中,在每个时钟周期对线程选择器133进行双态切换以从T0和T1交替选择指令。在每个时钟周期通常以此方式对IFAR 103载入,载入地址是连续的,除非存在一些早先的指令(来自先前载入的地址)在从另一个源对IFAR 103进行载入情形中强制重定向。实际中,可能存在数个源用于对IFAR 103进行载入,但它们不会涉及到本发明。
IFU 108具有三个周期流水线,包括对IFAR 103进行载入、访问指令高速缓存104、和确定指令是否为在分支逻辑203中预测采纳的分支。如果分支预测逻辑203检测出预测采纳的分支指令,则它计算写入到IFAR的目标地址,以便能够从指令高速缓存104访问对应于所采纳路径的下一个指令。在单线程模式中,输出204将直接连接到输入211目标地址与用于IFAR 103的控制信号。在此情形中,在分支预测电路203检测出预测采纳的分支后的下一个时钟周期,利用来自分支预测逻辑203的目标地址对IFAR 103载入。刷新与分支指令相连续的指令。
在SMT模式中,从T0的程序计数器,然后从T1的程序计数器交替对IFAR 103进行载入。其他每个周期指派给具体线程。为保持程序指令顺序,必须保持这种协议。在SMT模式中,如果分支预测逻辑203检测出预测采纳的来自T0的分支指令,且将目标地址直接从输入204连接到IFAR 103,则其载入将落入(fall in)T1的周期。在这些条件下对IFAR 103的载入将导致程序指令失序。
为解决该问题,添加了用于将反馈级延伸一个时钟周期的装置。添加MUX 208和寄存器207。MUX 208在SMT模式信号206的控制下选择输入204或输入209。如果没有选择SMT模式,信号206选择输入204以将目标地址和任何控制信号直接连接到IFAR 103的输入211。连接到输入211的控制信号表明是否将使用目标地址对IFAR进行载入。如果选择SMT模式,则信号206选择输入209连接至IFAR 103的输入211。当分支为分支预测逻辑203中所预测采纳的分支时,寄存器207接收在反馈路径中插入一个周期延迟以有效增加在SMT模式中的流水线一级的控制信号和目标地址。
图3表示本发明实施例的方法步骤的流程图。在步骤301中,在每个时钟周期201交替从两个线程选择指令地址,并将其连接到IFAR103的输入。该选择过程与在包括IFAR、指令高速缓存和分支预测逻辑的流水线级中发生的其他事件无关。在步骤302中,在当前时钟周期内进行检测以确定分支预测电路是否已检测出预测采纳的分支指令。分支指令应由早两个时钟周期载入IFAR 103的地址而引起。如果检测的结果为否,则在IFAR 103的输入处仅用来自所选线程的地址对IFAR103载入。重复步骤302和303,直至等到在第三流水线级中的分支预测电路203的反馈表明已检测出预测采纳的分支。如果在步骤302的检测结果为是,则分支预测电路已检测出预测采纳的分支并已计算出用于采纳路径的目标地址。依据选择的是SMT模式还是单线程模式,而发生不同的操作。在步骤304中,进行检测以确定是否选择SMT模式。如果未选择SMT模式,则在步骤305中执行单线程模式的反馈处理,其中刷新循环刷新用于单线程的IFAR 103和高速缓存行。然后,在步骤306中,在检测预测采纳的分支之后的下一个时钟周期中用来自分支预测电路的目标地址对IFAR 103载入。如果在步骤304中的检测结果为是,则设置SMT模式,且已检测出预测采纳的分支(例如来自T0)。在此情形中,在当前时钟周期用来自当前所选线程(还是T0)的地址对IFAR 103载入。在步骤308中,刷新与预测采纳的分支指令相连续的指令。在步骤309中,通过寄存器207将目标地址和任何控制信号的反馈延迟一个时钟周期。在分支预测逻辑203中检测预测采纳的分支之后的下一个时钟周期为T1的周期,而不是产生检测出预测采纳分支的T0的周期。为确保在处理中在该点保持程序次序,延迟一个周期保证了在SMT模式中使反馈同步化。寄存器207在SMT模式中对预测采纳的分支添加一个延迟的周期实际对流水线增加一级。在单线程模式或在没有预测采纳的分支的SMT中,流水线保持三级。在步骤310中,在延迟周期之后的下一个时钟周期使用由分支预测逻辑203计算出的目标地址对IFAR 103载入。在步骤310之后,分支回到步骤302。
在图3的方法中,如果在步骤302中检测的结果为否,则执行步骤303,这表明已检测出没有预测采纳的分支指令。若考虑到所有指令情形,则IFAR 103的实际操作可能会更为复杂。为简化本发明的解释,并不对每种情形都做考虑。例如,将对IFAR 103中地址的响应取得的指令,对于T0,将其存储在指令队列135中,对于T1,将其存储在指令队列136中。在本发明的一个实施例中,如果在队列135和136中存在用于取得的指令的空间,则IFAR 103增加并行取得的指令的数目(例如,在32字节的边界上一次可取得8个指令)。对于在队列135或136中没有空间用于当前取得的指令的情形,则IFAR 103被占用(held)。不过,仅当没有从后面的流水线级反馈回地址的早期指令时,该情况才可能属实。当错误预测了分支指令时,指令产生异常情况或要求重新执行,或者存在外部中断时,会出现这样的情形。
图4表述用于实施本发明的代表性硬件环境,说明了根据本发明的工作站的典型硬件配置,其中本发明具有通过系统总线412互连的多处理器中央处理单元(CPU)410和多个其他单元。如图4所示的工作站包括随机存取存储器(RAM)414,只读存储器(ROM)416,和用于将外围设备如磁盘机420和磁带机440连接至总线412的输入/输出(I/O)适配器418,用于将键盘424、鼠标426、扬声器428、麦克风432和/或其他用户接口设备如触摸屏设备(未示出)连接至总线412的用户接口适配器422,用于将工作站连接至数据处理网络的通信适配器434,和用于将总线412连接至显示设备438的显示适配器436。
尽管详细描述了本发明及其优点,但是应该理解,在不偏离所附权利要求所限定的本发明精神和范围的条件下,可进行多种改变、替代和变型。