用于测量微处理器中的流水线停顿的方法和装置的制作方法

文档序号:6461157阅读:127来源:国知局
专利名称:用于测量微处理器中的流水线停顿的方法和装置的制作方法
用于测量^t处理器中的流水线停顿的方法和装置技术领域本申请一般涉及数据处理系统,并且特别涉及一种用于性能监控的方 法和装置。更特别地,本申请针对的是一种计算机实现的方法、装置和计 算机可用程序代码,其用于标识可归于在指令流水线中执行的指令组中的给定指令的停顿周期(stall cycles )。
技术背景微处理器的性能监控包括计算完成指令执行所需要的平均每指令周期 (CPI, cycles per instruction )。通常,精简指令集计算机(RISC )微处 理器能够在单个处理器时钟周期期间完成一个或多个指令的执行。一般按阶段或分量执行指令。用于完成指令执行的分量通常包括读取 指令、对指令进行解码、进行操作,以及将操作结果写入存储器和/或寄存 器。当将结果写入存储器和/或寄存器时,进行操作的结果便成为可视的或者可用于其它指令和过程。可以通过将每指令周期分成执行分量来分析处理器性能,以便确定指 令执行的哪些部分耗用最多的处理器周期。在无序或推测性(speculatively ) 执行指令的处理器中,在指令完成之后研究执行分量的性能更为方便或准 确。在执行指令或指令组但未完成指令期间所耗用的处理器周期称为停顿 周期。停顿核算(stall accounting)是监控停顿周期的过程,其标识了哪 个指令造成停顿,以及确定停顿的原因。如果用户知道哪个指令停顿以及停顿的原因,则该用户也许能够纠正 问题以避免或减少停顿周期数。举例来说,如果加载指令由于对所需数据值的存储器访问而导致过多的停顿周期,则可以通过高速緩存所需要的数 据值来减少停顿周期数。在每次完成一个指令的处理器中,停顿核算是相当直截了当的。任何 停顿发生都可归于所完成的那一个指令。然而,在指令流水线中完成指令组的处理器,例如IBM⑧POWER5 ,却是较难分析的。在指令流水线中,通过处理器以装配线方式来处理分量执行的各个阶 段中的多个指令。当通过算术逻辑部件(ALU)在执行一个指令的操作时, 可以将下一指令加载到高速緩存,并且将执行另一指令的结果写入寄存器。 可以于同 一时间在各个完成阶段处理具有两个或更多指令的指令组。直到 完成该组中的每个指令时才完成该指令組的执行。如果该组的完成停顿了 , 则停顿周期可能是由于发生在该组中的任何一个或多个指令中的停顿。该指令组的完成发生停顿可能并不是由于单个原因,因为每个指令均 可以具有其自己的停顿原因。然而,在单独的指令阻塞内,原因可能存在 于其阻塞了整个组。举例来说,发生在待完成的最后指令中的停顿导致整 个组的完成的停顿。当前,性能监控标识了指令組中最后的指令完成延迟的来源,并且将 该来源归为整个组停顿的原因。该方法对于分析是有用的,但却不一定准 确描述了指令组所遇到的完成延迟。此外,如果该组中的一个或多个指令 依赖于该组中另 一指令的完成,则将指令组所遇到的完成中的整个延迟归 于最后获知的延迟的现有方法可能导致误导停顿核算。发明内容说明性实施例提供了 一种计算机实现的方法、装置以及计算机可用程 序代码,其用于监控指令流水线中指令的执行。在一个实施例中,该过程 对指令组的停顿周期数进行计数。该过程检索对应于所述指令组的确定性 时延模式(deterministic latency pattern )。该过禾呈将所述停顿周期数与所 述确定性时延模式进行比较。响应于确定所述指令组中的指令在先行指令 完成之后的确定性周期数完成,该过程将所述指令标识为依赖指令。在另 一实施例中,该过程对发生在先行指令完成执行之后的停顿周期 数进行计数,以便形成依赖指令延迟。响应于确定所述依赖指令延迟等于 在所述确定性时延才莫式中所标识的确定性指令延迟,该过程将所述依赖指令延迟确认为可归于所述依赖指令的执行延迟。所述确定性时延模式包括 在先行指令完成执行之后,预计发生依赖指令完成执行的预先确定的周期 数。在另 一实施例中,从所述组的停顿周期数中减去所述依赖指令延迟, 以便确定可归于所述先行指令的先行指令延迟。在另一实施例中,该过程标识所述指令组中每个指令所进行的操作。 基于所标识的由所述指令组中的每个指令所进行的操作,该过程然后从多 个确定性时延模式中标识确定性时延才莫式。在一个实施例中,从^f更编码于 处理器芯片上的晶体管中的多个确定性时延模式中检索所述确定性时延才莫 式。在另一实施例中,从所述处理器芯片上的存储器中检索所述确定性时 延模式。


然而,当结合附图阅读时,通过参照以下对说明性实施例的详细描述,将最好地理解说明性实施例本身,以及其优选的使用模式、进一步的目的和优点,在附图中图1是可以在其中实现说明性实施例的数据处理系统的图形表示;图2是可以在其中实现说明性实施例的数据处理系统的框图;图3是依照说明性实施例用于处理信息的处理器系统的框图;图4是依照说明性实施例的框图,其说明了当将确定性执行值用于指令流水线中的停顿核算时的数据流;图5是依照说明性实施例依赖于加载指令的定点指令的示图;图6是依照说明性实施例说明了用于指令组的性能分析的过程的流程图;以及图7是依照说明性实施例说明了用于对依赖指令进行停顿核算的过程 的流程图。
具体实施方式
现参照附图并且特别参照图1,其示出了可以在其中实现说明性实施 例的数据处理系统的图形表示。计算机100包括系统单元102、视频显示 终端104、键盘106、存^i殳备108 (其可以包括软盘驱动和其它类型的永 久和可装卸存储介质),以及鼠标110。个人计算机100可以包括附加的 输入设备。附加的输入设备的例子包括操纵杆、触摸板、触摸屏、跟踪球、 扩音器等。计算机100可以是任何合适的计算机,例如IBM⑧eServerTM计算机 或IntelliStation⑧计算机,其是位于纽约Armonk的国际商业机器公司的 产品。尽管绘图表示示出了个人计算机,然而可以在其它类型的数据处理 系统中实现其它的实施例。举例来"i兌,可以在网络计算机中实现其它的实 施例。计算机100还优选地包括图形用户接口 (GUI),其可以借由驻留 于在计算机100内操作的计算机可读介质的系统软件来实现。接下来,图2描绘了可以在其中实现说明性实施例的数据处理系统的 框图。数据处理系统200是诸如图1中的计算机100的计算机的例子,可 以在其中安置实现说明性实施例的过程的代码或指令。在所描绘的例子中,数据处理系统200采用包括北桥和存储控制器集 线器(MCH) 202以及南桥和输>^/输出(I/O)控制器集线器(ICH) 204 在内的集线器体系结构。处理单元206、主存储器208以及图形处理器210 耦合于北桥和存储控制器集线器202。处理单元206可以含有一个或多个 处理器并且甚至可以^使用一个或多个不同种类的处理器系统来实现。举例 来说,图形处理器210可以通过加速图形端口 (AGP)耦合于MCH。在所描绘的例子中,局域网(LAN)适配器212耦合于南桥和I/0控 制器集线器204、音频适配器216、⑩和鼠标适配器220、调制解调器222、 只读存储器(ROM)224、通用串行总线(USB)端口和其它通信端口 232。PCI/PCIe设备234通过总线238耦合于南桥和I/O控制器集线器204。硬控制器集线器204。PCI/PCIei殳备可以包括,例如,以太网适配器、附加卡(add-in cards) 以及用于笔记本计算机的PC卡。PCI使用卡式总线控制器,而PCIe并不 使用。ROM224可以是,例如,闪速二进制输入/输出系统(BIOS)。硬 盘驱动226和CD-ROM驱动230可以使用,例如,集成驱动器电子电路 (IDE )或串行高级技术配件(SATA)接口 。超级I/O ( SIO )设备236 可以耦合于南桥和I/O控制器集线器204。操作系统在处理单元206上运行。该操作系统协调和控制图2中的数 据处理系统200内的各种组件。操作系统可以是市售的操作系统,例如 Microsoft Windows XP 。 ( Microsoft⑧和Windows XP⑧是樣t软公司在美 国、其它国家或二者的商标)。面向对象的编程系统,例如JavaTM编程系 统,可以结合操作系统运行并且从在数据处理系统200上执行的JavaTM程 序或应用向操作系统提供调用。JavaTM和所有基于Java的商标是Sun Microsystems公司在美国、其它国家或二者的商标。用于操作系统、面向对象的编程系统以及应用或程序的指令位于诸如 硬盘驱动226之类的存^i殳备上。可以将这些指令加载到主存储器208给 处理单元206执行。说明性实施例的过程可以由处理单元206使用计算机 实现的指令来实现,其中指令可以位于存储器中。存储器的例子是主存储 器208、只读存储器224,或者在一个或多个外围设备中。图1和图2中所示出的硬件可以取决于所说明的实施例的实现而变化。 除了图1和图2中所描绘的硬件之外,或者代替图1和图2中所描绘的硬 件,还可以使用其它内部硬件或外围设备,例如闪速存储器、等效非易失 性存储器或光盘驱动等。另外,说明性实施例的过程可以应用于多处理器 数据处理系统。图2中所示出的系统和组件可以根据所示出的说明性例子而变化。在 一些说明性例子中,数据处理系统200可以是个人数字助理(PDA)。个人数字助理一般配备有闪速存储器,以便提供用于存储操作系统文件和/或用户生成的数据的非易失性存储器。另外,数据处理系统200可以是平 板计算机、膝上型计算机,或者电话设备。图2中所示出的其它组件可以根据所示出的说明性例子而变化。举例 来说,总线系统可以包括一条或多条总线,例如系统总线、1/0总线和PCI 总线。当然,可以使用在依附于构造或体系结构的不同组件或设备之间提 供数据传送的任何合适类型的通信构造或体系结构来实现总线系统。另外, 通信单元可以包括用于发送和接收数据的一个或多个设备,例如调制解调 器或网络适配器。进一步地,存储器可以是,例如,主存储器208或诸如 在北桥和存储控制器集线器202中找得到的高速緩存。此外,处理单元可 以包括一个或多个处理器或CPU。接下来转至图3,其依照本发明的说明性实施例描绘了用于处理信息 的处理器系统的框图。可以将处理器310实现为图1中的处理器102。在说明性实施例中,处理器310是单个集成电路超标量微处理器。因 此,如下文进一步讨论的,处理器310包括各种单元、寄存器、緩冲器、 存储器,以及其它部件,其全部通过集成电路形成。此外,在说明性实施 例中,处理器310根据精简指令集计算机(RISC)技术进行操作。如图3 中所示,系统总线311连接至处理器310的总线接口单元(BIU)312。 BIU 312控制处理器310与系统总线311之间的信息传递。BIU 312连接至指令高速緩存314以及处理器310的数据高速緩存 316。指令高速緩存314向定序器单元318输出指令。响应于来自指令高速 緩存314的这样的指令,定序器单元318选择性地向处理器310的其它执 行电路输出指令。除了定序器单元318之外,在说明性实施例中,处理器310的执行电 路还包括多个执行单元,即分支单元320、定点单元A (FXTJA) 322、定 点单元B (FXUB) 324、复杂定点单元("CFXU,, ) 326、加载/存储单 元(LSU)328,以及浮点单元(FPU)330。 FXUA322、 FXUB324、 CFXU 326,以及LSU328从通用体系结构寄存器(GPR) 332和定点重命名緩冲作为输入。此外,FXUA 322和FXUB 324输入来 自进位比特(CA)寄存器339的"进位比特(carrybit) ,, 。 FXUA322、 FXUB 324、 CFXU 326和LSU 328输出其操作结果(目的操作数信息)用 于存储在定点重命名緩沖器334中所选择的条目处。此外,CFXU 326输 入来自专用寄存器处理单元(SPR单元)337的源操作数信息,并且将目 的操作数信息输出到专用寄存器处理单元(SPR单元)337。FPU 330输入来自浮点体系结构寄存器(FPR) 336以及浮点重命名 緩冲器338的源操作数信息。FPU 330输出其操作结果用于存储在浮点重 命名緩冲器338中所选择的条目处。响应于加栽指令,LSIJ 328输入来自数据高速緩存316的信息,并且 将这样的信息复制到重命名緩冲器334和338中所选择的重命名緩冲器。 如果数据高速緩存316中未存储这样的信息,那么数据高速緩存316输入 来自系统存储器360的这样的信息,系统存储器360连接至系统总线311。 此外,数据高速緩存316能够通过BIU 312和系统总线311将来自数据高 速緩存316的信息输出到连接至系统总线311的系统存储器360。在这些 例子中,GPR 332和FPR 336之一向LSU 328发送存储指令。响应于存储 指令,LSU 328输入来自所选择的GPR 332和FPR 336之一的信息,并且 将这样的信息复制到数据高速緩存316。定序器单元318输入来自GPR332和FPR336的信息,并且向GPR 332和FPR 336输出信息。从定序器单元318,分支单元320输入指示处 理器310的当前状态的信号和指令。响应于这样的信号和指令,分支单元 320向定序器单元318输出信号,该信号指示存储了用于由处理器310执 行的指令序列的合适的存储地址。响应于来自分支单元320的这样的信号, 定序器单元318输入来自指令高速緩存314的所指示的指令序列。如果指 令高速緩存314中未存储该指令序列中的一个或多个,那么指令高速緩存 314输入来自于连接至系统总线311的系统存储器360的该指令。响应于来自指令高速緩存314的指令输入,定序器单元318选择性地 将指令调遣至执行单元320、 322、 324、 326、 328和330中所选择的执行单元。每个执行单元执行特定类别的指令中的一个或多个指令。举例来说,FXUA 322和FXUB 324在源操作数上执行第一类定点数学操作,例如加 法、减法、与(ANDing)、或(ORing)和异或(XORing) 。 CFXU 326 在源操作数上执行第二类定点操作,例如,定点乘法和除法。FPU 330在 源操作数上执行浮点操作,例如,浮点乘法和除法。当在重命名緩冲器之一334处存储了信息时,这样的信息便与指令所 指定的存储位置相关联,其中,对于该指令分配了所选择的重命名緩冲器。 举例来说,信息可以与诸如GPR 332或进位比特(CA)寄存器339之一 的存储位置相关联。响应于来自定序器单元318的信号,将存储在所选择 的重命名緩冲器之一 334的信息复制到其关联的GPR 332或CA寄存器 339之一。响应于"完成"生成该信息的指令,定序器单元318引导对于 存储在所选择的重命名緩沖器之一 334的信息的该复制。此类型的复制称 为"回写"。当在所选择的重命名緩冲器之一 338处存储了信息时,这样的信息便 与FPR336之一相关联。响应于来自定序器单元318的信号,将存储在所 选择的重命名緩冲器之一 338的信息复制到其关联的FPR 336之一。响应 于"完成"生成该信息的指令,定序器单元318引导对于存储在所选择的 重命名緩冲器之一 338的信息的该复制。通过在执行单元320、 322、 324、 326、 328和330中的各个执行单元 处同时处理多个指令,处理器310获得高性能。因此,将每个指令处理为 一系列阶段,其各自可随其它指令阶段并行执行。这样的技术称为"流水 线,,。在说明性实施例的显著方面,通常将指令处理为六个阶段,即读取、 解码、调遣、执^f亍、完成和回写。在读取阶段,定序器单元318选择性地输入来自指令高速緩存314的 一个或多个指令,其来自存储有上文结合分支单元320和定序器单元318 所进一步讨论的指令序列的一个或多个存储地址。在解码阶段,定序器单 元318解码达到四个的所读取的指令。当结果保留了重命名緩冲器条目之后,定序器单元318选择性地将达到四个 的经解码指令调遣至执行单元320、 322、 324、 326、 328和330中所选择 的执行单元。这些结果可以是操作数信息。在调遣阶段,将操作数信息提 供给为调遣的指令所选择的执行单元。处理器310按照指令的编程顺序来 调遣指令。在执行阶段,执行单元执行其调遣的指令,并且输出其操作结果用于 存储在上文进一步讨论的重命名緩冲器334和重命名緩冲器338中所选择 的条目处。在这些例子中,结果是操作数信息。以这样的方式,处理器310 能够相对于指令的编程顺序无序地执行指令。在完成阶段,定序器单元318指示指令"完成"。处理器310按照指 令的编程顺序"完成"指令。在回写阶段,定序器318将对于来自重命名緩沖器334和338的信息 的复制分别引导至GPR332和FPR336。定序器单元318引导对于存储在 所选择的重命名緩冲器的信息的该复制。同样地,在特定指令的回写阶段, 响应于特定的指令,处理器310更新其体系结构状态。处理器310按照指 令的编程顺序处理指令相应的"回写,,阶段。处理器310在特定情形下有 利地融合了指令的完成阶段和回写阶段。在说明性实施例中,每个指令均需要一个机器周期来完成指令处理的 每个阶段。然而, 一些指令,例如由CFXU326所执行的复杂定点指令, 可能需要超过一个的周期。因此,响应于完成先前的指令所需要的时间上 的变化,在特定指令的执行与完成阶段之间可能出现可变延迟。在定序器318内提供完成緩冲器348,以便跟踪正在执行单元内执行 的多个指令的完成。当指示已经成功完成指令或指令组时,按照应用指定 的顺序,可以利用完成緩冲器348来发起将哪些完成的指令的结果传送至 关联的通用寄存器。如文中所使用的,指令组含有两个或更多的指令。另外,处理器310还包括性能监控单元340,其连接至指令高速緩存 314以及处理器310中的其它单元。可以利用性能监控单元340来监控处 理器310的操作,在该说明性实施例中,性能监控单元340是一种软件可14访问机制,其能够提供对存储控制以及指令执行资源的利用的详细信息描述。尽管图3中未进行说明,然而性能监控单元340耦合于处理器310的 每个功能单元,以便准许监控处理器310的操作的所有方面,举例来说, 其包括重构事件之间的关系、标识伪触发、标识性能瓶颈、监控流水线停 顿、监控空闲处理器周期、确定调遣效率、确定分支效率、确定未对准 (misaligned )数据访问的性能损失、标识执行串行化指令的频率、标识 禁止的中断,以及确定性能效率。举例来说,感兴趣的事件还可以包括指 令解码的时间、指令的执行、分支事件、高速緩存未中,以及高速緩存命 中。性能监控单元340包括与实现相关的数目(implementation-dependent number)的计数器341 -342,标记为PMC1和PMC2,其用于对所选事 件的发生进行计数。举例来说,感兴趣的事件还可以包括指令解码的时间、 指令的执行、分支事件、高速緩存未中,以及高速緩存命中。性能监控单元340进一步包括至少一个监控器模式控制寄存器 (MMCR, monitor mode control register)。在该例中,给出了两个控制 寄存器,MMCR343和344,其指定计数器341 - 342的功能。优选地将计 数器341 - 342和MMCR 343 - 344实现为SPR,其对于读或写来i兌可通 过CFXU 326可执行的MFSPR和MTSPR指令进行访问。然而,在一个 可选的实施例中,可以简单地将计数器341 - 342和MMCR 343 - 344实现 为i/o空间中的地址。在另一可选的实施例中,可以间接通过索引寄存器 访问控制寄存器和计数器。性能监控单元340内的各种組件可以用于生成用于性能分析的数据。 取决于特定的实现,不同的组件可以用于生成跟踪数据。在其它的说明性 实施例中,性能单元340可以为用于时间仿形(time profiling)的数据提 供对名称解决方案的动态地址的支持。另外,处理器310还包括中断单元350,其连接至指令高速緩存314。 另外,尽管图3中未示出,然而中断单元350连接至处理器310内的其它 功能单元。中断单元350可以接收来自其它功能单元的信号,并且il^动作,例如,启动错误处理或软中断(trap)过程。在这些例子中,采用中 断单元350来生成可以在程序执行期间发生的中断和异常。图1至图3中所描绘的例子以及上述例子并不意味着暗示体系结构限 制。举例来说,除了采取PDA的形式以夕卜,数据处理系统200还可以是平 板计算机、膝上型计算机或电话设备。此外,处理器310可以包括多核微 处理器和/或复杂指令集计算机(CISC)处理器。图1至图3中所描绘的 例子是说明性实施例,且并不意味着暗示体系结构限制。微处理器的性能监控包括计算完成指令的执行所需要的平均每指令周 期(CPI)。指令通常包括操作码。操作码是指定将要由指令进行的操作 的类型的机器语言指令的一部分。举例来说,指令操作可以包括但不限于 加载操作或诸如加法操作或除法操作的数学操作。通常,精简指令集计算 机(RISC)微处理器能够在单个处理器时钟周期期间完成一个或多个指令 的执行。精简指令集计算机是这样的计算机,即该计算机的处理器可以非 常快速地执行简单的指令集。一般在完成的分量中执行指令,完成的分量包括读取指令、解码指令、 进行操作,以及将操作结果写入存储器和/或寄存器。举例来说,进行操作 可以包括通过微处理器的算术逻辑单元(ALU)来进行诸如加法操作的数 学操作。当将结果写入存储器和/或寄存器时指令完成,此时,结果便成为 可视的或可用于其它指令和独立过程。当指令正耗用相对大量的处理器周期来达到完成和/或未能达到完成 时,在指令未完成的情况下所耗用的周期称为停顿周期。在每次完成一个 指令的处理器中,标识出哪个指令停顿以及标识停顿的原因都是相当直截 了当的。然而,按组(例如在指令流水线中)完成指令的处理器却是较难分析 的。在这样的情况下,直到完成该组中的每个指令时才完成该指令组的执 行。因而,如果该组的完成有停顿,则停顿可能是由于发生在该组中的任 何指令中的停顿。当前,性能监控标识出指令组中最后的指令完成延迟的来源,并且将该来源归为整个组停顿的原因。性能监控;U&控程序的性能以便聚集有关 程序速度、存储器使用以及效率的信息,例如对于待完成的指令或指令组 来说每指令的周期数。通过性能监控所聚集的信息可以用于优化程序或指 令集,从而提高处理速度和加大效率。在当前的解决方案中,性能监控单元推测性地对未完成指令组的任何 周期上的停顿事件进行计数。待清除的最后事件被认为是整个指令组的停 顿原因,并且被确认为停顿的原因。性能监控单元认为所有其它的停顿原 因都是无效的并且舍弃那些原因。标识出最后的指令停顿的原因的该方法 对于分析是有用的,但在该组中的指令相互依赖的情况下却不一定准确描 述指令组所遇到的执行完成延迟。举例来说,在包括加载指令和两个加法指令的指令组中,如果笫一加 法指令需要加载指令所提供的数据值,并且第二加法指令需要第一加法指 令的结果,那么第一加法依赖于加载指令并且第二加法依赖于第一加法。说明性实施例认识到,如果以上例子中的加载指令停顿,则第一和第 二加法指令也将停顿,因为第一和第二加法是依赖指令。依赖指令是这样 的指令,即该指令农赖于用于执行待完成的依赖指令的另一指令。因而, 将该组中的停顿归因于第二加法指令将既不准确又会产生误导,即使第二 加法指令是待完成的最后的指令。说明性实施例还认识到,即使从该指令组中移除第一和第二加法指令, 该指令组仍会由于发生在加载指令上的停顿而在完成中遇到停顿。因此, 用户将不能基于将最后的指令标识为停顿原因来改进该指令組的性能。因 而,在指令组中的指令相互依赖的情况下,将组中的完成停顿的来源标识 为最后的指令的现有方法可能并不准确并且会产生误导。因此,说明性实施例提供了一种计算机实现的方法、装置和计算机程 序产品,其用于监控指令流水线中指令的执行。该过程对于待完成执行的 指令组的停顿周期数进行计数。该过程检索用于该指令组的确定性时延模 式。该过程将停顿周期数与确定性执行时延模式进行比较。响应于确定该 指令组中的指令在先行指令之后的确定性周期数完成,该过程将该指令标识为依赖指令。先行指令是依赖指令所依赖的指令。举例来说,如果加法 指令需要加载指令所提供的数据值,则加载指令是加法指令的先行指令。加法指令是依赖指令,因为加法指4^赖于加栽指令的结果来完成。图4是依照说明性实施例的框图,其说明了当将确定性执行值用于指 令流水线中的停顿核算时的数据流。停顿核算是一种用于标识引起停顿的 指令以及该停顿的原因的方法。可以以任何类型的计算设备来实现计算机 400,例如个人计算机、膝上型计算机、个人数字助理,或者图1和图2 中所描绘的任何其它的计算设备。在该说明性实施例中,计算机400是精 筒指令集计算机。处理器402是用于在计算机400上执行指令的任何已知或可用类型的 处理器,其包括但不限于中央处理器(CPU)。可以以单核处理器、多核 处理器或多处理器来实现说明性实施例。举例来说,处理器402可以是Cell 宽带引擎(BE)芯片处理器。举例来说,处理器402可以是Cell Broadband EngineTM (BE)处理器,其是包括单个基本64位Power PC⑧处理器核心 (PPC)以及八个协处理器核心(SPC)的多核处理器芯片。在该例中, 处理器402是诸如图2中的处理器单元206或图3中的处理器310这样的 处理器。处理器402在执行指令流水线中的指令组404。执行指令组404包括 两个或更多的指令。在该例中,执行指令组是具有五个指令的指令集。直 到执行指令组404中的每个指令完成时才完成执行指令组404。因此,如 果在执行指令组404中的一个或多个指令的执行期间发生停顿,则整个指 令组可能停顿。性能监控单元406是孩i处理器芯片上的硬件組件,在该微处理器芯片 上将处理器402置于计算机400中。性能监控单元406是处理器芯片上的 微处理器逻辑的一部分,其分析处理器402在每个指令执行期间的性能。 在每指令时钟周期(CPI)内测量执行指令组404的处理器402的性能。 在该例中,性能监控单元406是任何已知或可用类型的性能监控单元,举 例来说,诸如图3中的性能监控单元340 。性能监控单元406包括性能监控计数器408。性能监控计数器408是 用于对指令执行期间所耗用或使用的处理器周期数进行计数的软件组件。 举例来说,如果处理器402在执行单个定点指令,并且在执行定点指令期 间利用了两个处理器周期,则性能监控计数器408将对该定点指令计数每 指令两个周期。然而,如果处理器402在执行具有两个或更多指令的指令 組,则性能监控计数器408将对处理器402利用来完成该指令组中所有指 令的执行的周期数进行计数。性能监控单元406包括每指令周期(CPI)分析器410,以便标识可归 于指令组中的依赖指令的每指令周期数。CPI分析器410是硬件或软件组 件,其用于分析对于在执行指令组期间所利用的周期的计数,确定该指令 组中一个或多个指令是否是依赖指令,以及标识可归于每个依赖指令的停 顿周期数。举例来说,如果加法指令需要加载指令所提供数据值,则加法指* 赖于加载指令。换句话说,直到加载指令完成时才可以完成加法值。诸如 加栽指令的先行指令中的任何停顿或延迟都将导致在任何依赖指令中的等效停顿或延迟。在RISC处理器中,很多指令具有确定性执行时延。确定性执行时延 是预先确定的或预计的用于在已完成所有先行指令之后完成依赖指令的执 行的处理器周期数。换句话说,确定性执行时延是在已满足依赖指令的所 有依赖性之后在完成依赖指令完成中所预计的延迟。举例来说,加法指令 可能具有两个周期的确定性执行时延。这意味着当已经满足对于加法指令 的所有依赖性,并且由处理器402进行了加法指令所指定的加法操作时, 预计处理器402耗用两个处理器周期。确定性执行时延将取决于所进行的 操作的类型、指令的依赖性以及处理器的类型而变化。当将停顿周期归于指令组中的给定指令时,性能监控单元406中的 CPI分析器410使用确定性时延来确定正完成的指令是否依赖于先前完成 的指令或先行指令。如果正完成的指令依赖于先前完成的指令,则CPI分 析器410基于指令所进行的给定操作的预先确定的时延模式来划分两个指令之间的停顿周期。在以上给出的例子中,如果完成了加载指令并且然后完成了依赖加法指令,则CPI分析器410预计加法指令在完成加载指令之后耗用两个周期。 因而,不论发生在完成加法指令期间的停顿周期数如何,如果加法指令在 加载指令完成之后的两个周期完成,则CPI分析器410将加法指令标识为 依赖于加载指令。换句话说,如果两个周期的实际指令完成延迟等于两个 周期的预计确定性时延模式,则CPI分析器410认为加法指令依赖于加载 指令。确定性时延才莫式412是一组一个或多个预计的确定性时延才莫式,其指 定了在已经满足依赖指令的所有依赖性之后,对于待完成的依赖指令来说 所预计的周期数。确定性时延模式是在未发生停顿事件的情况下,完成给 定指令组中给定指令的执行所预计的处理器周期数。话句话说,在给定处 理器中,用户可以确定完成加法指令的执行所需要的估计处理器周期数。 举例来说,加法指令可能需要两个处理器周期来完成。因此,用于完成加 法指令的预计或确定性周期数是两个周期。同样地,在包括两个加法指令的指令组中,用户可以确定预计要两个 周期来完成每个加法指令并ilJL生两个加法指令的完成预计要四个周期。 这是用于具有两个加法指令的指令组的确定性时延模式。换句话说,确定 性时延模式是对于待完成的给定指令组来说,基于该组中每个指令所进行 的操作而预计耗用的预期处理器周期模式。因而,如果加载指令需要四个周期来完成,并且指令组包括一个加载 指令和两个加法指令,则该组的确定性时延模式可以是用于加载指令的四 个处理器周期、用于第一加法指令的两个处理器周期,以及用于第二加法 指令的两个处理器周期。确定性时延模式取决于处理器的类型、指令所进行的操作、指令的依 赖性的模式,以及指令组所进行的操作而有所变化。然而,可以预先确定 对于各个指令组来说预计的周期数,并且将其存储在诸如数据存储器414 之类的数据存储设备中。因而,CPI分析器410可以访问确定性时延模式412,以^^标识与处理器402中的执行指令组404相匹配的指令组的周期才莫 式。在指令组完成执行之后,CPI分析器410比较由性能监控计数器408 所计算的对于该指令组来说实际的每指令周期计数。基于每个指令的实际 指令延迟与来自确定性时延模式412的一个或多个匹配模式的比较,CPI 分析器410确定哪些指令是依赖指令。基于该比较,CPI分析器410标识 哪些指令是依赖指令以及哪些指令是先行指令。基于实际的每指令周期计数与匹配的确定性时延才莫式的比较,CPI分 析器410确定可归于先行指令的停顿周期数和/或可归于一个或多个依赖指 令的停顿周期数。数据存储器414是用于存储数据的任何已知或可用类型的硬件或软件 设备。举例来说,数据存储器414可以包括硬编码于处理器芯片上的晶体 管中的数据、单片存储器、片外存储器,例如只读存储器(ROM)、非易 失性随机访问存储器(NVRAM),或者任何其它已知或可用类型的数据 存储设备。现参照图5,其依照说明性实施例示出了依赖于加载指令的定点指令 的时序图。完成信号500是用于完成包括依赖于加载指令的定点指令的指 令组的信号。在执行该指令组期间,性能监控单元并不知道哪些指令是依 赖指令。在该例中,定点指令信亏502是示出了在对定点指令的完成中的时延 或停顿的信号。定点指令是该指令组中待完成的最后指令。定点指令信号 502指示指令組中在指令完成之前经历该指令组的最长时延的定点操作。 定点延迟504是在完成定点指令的执行期间所经历的实际延迟或停顿量。加载指令信号506指示相同的指令组中在完成加栽指令之前经历了时 延的加载指令。加栽时延508是在完成加载指令时的延迟量。加载时延508 小于定点指令信号502的定点延迟504。完成停顿是对于整个指令组的完 成来说总的延迟量。依赖定点延迟510是依赖于加载指令的定点指令的确定性执行值。依赖定点延迟510不是停顿周期的实际计数。依赖定点延迟510是在定点指 令依赖于加载指令的情况下,预计发生在先行加载指令完成之后、在定点 指令即将完成之前的停顿。依赖定点延迟510是该指令组的确定性时延模 式中预先确定的值。换句话说,依赖定点延迟510是完成该指令组中的定 点指令所预计的延迟。诸如图4中的CPI分析器410的CPI分析器标识出匹配的确定性时延 模式,以便标识依赖定点延迟510。 CPI分析器将定点指令的定点延迟504 与依赖定点延迟510进行比较。如果依赖定点延迟510与在加栽指令完成 之后发生的实际定点延迟504的停顿部分相匹配,那么CPI分析器将定点 指令标识为依赖于加载指令。换句话说,如果定点指令依赖于加载指令, 则CPI分析器预计该定点指令在该加栽指令之后的确定性周期数完成。确 定性周期数是预计在指令即将完成之前要耗用的预先确定的周期数。换句 话说,如果在未发生停顿时处理器通常需要两个处理器周期来完成加法指 令,那么在该例中对于加法指令,确定性周期数是两个处理器周期。在这种情况下,在加载指令完成之后发生的定点延迟504匹配于依赖 定点延迟510。因而,在该例中,CPI分析器确定定点指令依赖于加载指 令。如上所示,性能监控单元的CPI分析器利用在执行指令组期间发生的 特定事件之间的确定性关系来将诸如定点延迟504这样的停顿期拆分成分 量。CPI分析器识别出依赖定点指令将在满足其依赖性之后的已知周期数 完成。如果CPI分析器检测到加载操作结束,并且然后在此后的确定性周 期数中结束了定点操作,则CPI分析器可以推断该定点操作依赖于该加载 操作。在这种情况下,从完成停顿时间中减去加载指令时延,以便确定可 归于定点指令的实际延迟。在这种情况下,可归于定点指令的延迟等于依 赖定点延迟。在该例中,使用定点延迟和加载时延作为例子。然而,说明性实施例 的过程可应用于具有确定性关系的含有两个或更多指令的任何指令组,而 不管指令的类型和/或指令所进行的操作的类型。图6是依照说明性实施例说明了用于指令組的性能分析的过程的流程 图。在图6所示出的该说明性例子中,通过诸如图4中的性能监控单元406 这样的硬件和/或软件组件来实现该过程,用于监控处理器性能、将每指令 周期与确定性值的模式进行比较、标识依赖指令,以及标识依赖指令延迟。该过程通过确定指令组是否正在执行(步骤602)而开始。如果单个 指令正在执行,则该过程返回到步骤602。返回步骤602,如果指令组正在 执行,则该过程从诸如图4中的性能监控计数器408这样的性能监控计数 器检索对于该指令组的每指令周期数(步骤606)。该过程标识该指令组 所进行的操作的类型(步骤608)。可以基于指令中的操作码来确定操作 类型。接下来,该过程为所标识的操作标识确定性模式(步骤610)。举例 来说,如果对指令组所标识的操作包括加栽和两个加法操作,则该过程为 包括加载和两个加法的指令组检索确定性模式。该确定性模式提供了在该 组中的指令之一依赖于另一指令的情况下会预期的预计时延或停顿周期 数。举例来说, 一种模式可以包括用于依赖于加载的第一加法以及依赖于 第 一加法的第二加法的确定性值。另 一种确定性模式可以包括用于依赖于 加载的第一加法以及不依赖于加载或加法指令的第二加法的确定性值。对 于该例中的操作的第三确定性模式可以包括这样的模式,即在该模式中, 两个加法操作均依赖于加载。该过程将所检索的CPI计数与确定性时延模式进行比较,以便对关于 是否标识了任何模式匹配进行确定(步骤612)。如果发现模式匹配,则 该过程标识依赖指令,并且将来自模式匹配的确定性时延计数值确认到相 应的依赖指令(步骤614)。换句话说,如果发现模式匹配,则该过程基 于才莫式匹配标识一个或多个依赖指令。该过禾呈然后可以基于才莫式匹配确定 依赖指令延迟。将该依赖指令延迟确认到或归于所标识的依赖指令。该过 程从可归于来自该模式的依赖指令的CPI中减去确定性计数值,以便标识 可归于先行指令的时延(步骤616),且此后该过程终止。返回到步骤612,如果没有发现模式匹配,则该过程舍弃来自确定性时延才莫式的确定性计数值(步骤618),并且将停顿周期归于待完成的最 后指令(步骤620),且此后该过程终止。在另一说明性实施例中,当还未完成指令组时,并且当刚好结束或终 止由于加载时延而导致的完成停顿时,性能监控单元开始对周期进行计数。如果性能监控单元确定定点指令结束于加栽指令完成之后的适当周期数, 则性能监控单元可以将该计数确认成依赖定点延迟。性能监控单元还可以 将发生在依赖定点延迟之前的计数归于加载指令,该加栽指令也被称为依 赖定点指令的先行指令。然而,如果在定点指令未完成的情况下超过了确定性周期数,则性能 监控单元舍弃或不予处理加载时延以及依赖定点延迟计数。在这种情况下, 性能监控单元将整个停顿计数归于待完成的指令组中的最后指令。在这种 情况下,会将整个停顿计数归于定点指令。图7是依照说明性实施例说明了用于对依赖指令进行停顿核算的过程 的流程图。在图7所示出的该说明性例子中,通过用于分析每指令周期的 软件组件(例如图4中的性能监控单元406)来实现该过程,以侵_标识依 赖指令和依赖指令时延。该过程通过为指令组的每指令周期进行计数(步骤702)而开始。该 过程对关于是否完成了先行指令进行确定(步骤704)。换句话说,该过 程确定是否还未完成指令组以及是否已经完成了先行指令。如果该过程确 定先行指令完成,则该过程标识依赖指令所进行的操作(步骤706),并 且开始对每指令周期进行计数,以便形成依赖指令延迟CPI (步骤708)。基于诸如图4中的性能监控单元406这样的性能监控单元所收集的数 据,该过程确定是否完成了依赖指令(步骤710)。如果未完成指令,则 该过程返回到步骤708。当完成指令时,该过程确定依赖执行延迟CPI是 否匹配于所标识的操作的确定性执行时延(步骤712)。如果发现匹配, 则该过程确认该指令是依赖指令,并且将依赖执行延迟CPI确认到依赖指 令(步骤714)。换句话说,整个停顿计数并不归于依赖指令。相反,仅 ^JL生在先行指令完成之后的停顿周期归于依赖指令。该过程从整个组的总CPI中减去依赖执行延迟CPI,以便为先行指令标识执行CPI延迟(步 骤716),且此后该过程终止。返回到步骤712,如果依赖执行延迟CPI并不匹配于该操作的确定性 执行时延,则该过程舍弃依赖执行延迟CPI (步骤718)并在此后终止。因而,说明性实施例提供了一种计算机实现的方法、装置和计算机程 序产品,其用于在指令流水线中进行停顿核算。该过程对于待完成执行的 指令组的停顿周期数进行计数。该过程检索对应于该指令组的确定性时延 模式。对应于指令组的确定性时延模式是用于与正完成执行的指令组相匹配 的指令组的模式。举例来说,如果正完成执行的指令组或刚好完成执行的 指令组包括加载指令和两个加法指令,则对应的确定性时延模式是用于具 有加载指令和两个加法指令的指令组的时延模式。如果在数据存储设备中 可获得用于具有两个加栽指令和三个加法指令的指令组的确定性时延模 式,那么该确定性时延模式将不是与具有单个加载指令和两个加法指令的 正完成的指令组相对应的确定性时延才莫式。该过程将停顿周期数与确定性执行时延模式进行比较。响应于确定指 令组中的指令在先行指令完成之后的确定性周期数完成,该过程将该指令 标识为依赖指令。因而,说明性实施例较为准确和可靠地标识了依赖指令以及可归于依 赖指令的停顿周期数。用户能够通过标识造成停顿周期的先行和依赖指令 来改进处理器性能。附图中的流程图和框图说明了根据各种实施例的系统、方法和计算机 程序产品的可能实现的体系结构、功能性和操作。就此而言,流程图或框 图中的每个块均可以表示模块、区段,或者代码的一部分,其包括用于实 现指定逻辑功能的一个或多个可执行指令。还应当注意,在某些可选的实 现中,块中所指出的功能可以不按照附图中所指出的顺序发生。例如,实 际上,取决于所涉及的功能性,完全可以并行地执行连续示出的两个块, 或者有时可以以相反的顺序执行这些块。说明性实施例可以采取全硬件实施例、全软件实施例或者既含有硬件 元素又含有软件元素的实施例的形式。可以以软件实现可选实施例,其包 括但不限于固件、常驻软件、微码等。此外,说明性实施例可以采取可访问于计算机可用或计算机可读介质 的计算机程序产品的形式,该计算机可用或计算机可读介质提供由计算机或任何指令执行系统使用的或者与计算机或任何指令执行系统结合使用的 程序代码。对于该描述来说,计算机可用或计算机可读介质可以是能够容 纳、存储、通信、传播或传送由指令执行系统、装置或设备使用的或者与 指令执行系统、装置或设备结合使用的程序的任何有形装置。介质可以是电子、磁性、光学、电磁、红外或半导体系统(或装置或 设备)或者传播介质。计算机可读介质的例子包括半导体或固态存储器、磁带、可装卸计算机磁盘、随机访问存储器(RAM )、只读存储器(ROM )、 硬磁盘和光盘。光盘的当前的例子包括只读光盘存储器(CD-ROM)、读 /写光盘(CD画R/W)和DVD。适于存储和/或执行程序代码的数据处理系统可以包括通过系统总线 直接地或间接地耦合于存储元件的至少一个处理器。存储元件可以包括在 程序代码的实际执行期间所使用的局部存储器、大容量存储器,以及为了 减少在执行期间必须从大容量存储器检索代码的次数而提供对至少一些程 序代码的临时存储的高速緩冲存储器。输入/输出或I/0设备(包括但不限于键盘、显示器、指点设备等)可 以直接地或者通过插入I/O控制器耦合于系统。网络适配器也可以耦合于系统,从而使得数据处理系统能够适于通过备。调制解调器、电缆调制解调器和以太网卡正是几种当前可用类型的网 络适配器。已经出于说明和描述的目的给出了对说明性实施例的描述,且并不旨 在以所公开的形式穷举或限制于说明性实施例。对本领域的普通技术人员 来说,很多修改和变形将是显而易见的。选择和描述实施例是为了最好地解释说明性实施例的原理、实际应用,以及使本领域的普通技术人员能够
权利要求
1.一种用于监控指令流水线中的指令执行的计算机实现的方法,所述计算机实现的方法包括对于待完成执行的指令组的停顿周期数进行计数;检索对应于所述指令组的确定性时延模式;将所述停顿周期数与确定性执行时延模式进行比较;以及响应于确定所述指令组中的指令在先行指令完成之后的确定性周期数完成,将所述指令标识为依赖指令。
2. 根据权利要求1的计算机实现的方法,其进一步包括 将所述确定性周期数分派给所述指令以形成依赖指令延迟。
3. 根据权利要求2的计算机实现的方法,其进一步包括 从所述组的停顿周期数中减去所述依赖指令延迟,以便确定可归于所述先行指令的先行指令延迟。
4. 根据权利要求1的计算机实现的方法,其中预先确定的执行时延模 式包括在先行指令完成执行之后,预计发生依赖指令完成执行的确定性 周期数。
5. 根据权利要求1的计算机实现的方法,其进一步包括 标识所述指令组中每个指令所进行的操作。
6. 根据权利要求3的计算机实现的方法,其进一步包括 基于所标识的所述指令组中每个指令所进行的操作,从多个确定性执行时延模式中标识确定性时延模式。
7. 根据权利要求l的计算机实现的方法,其中从硬编码于处理器芯片 上的晶体管中的多个确定性执行时延模式中检索所述确定性时延模式。
8. 根据权利要求l的计算机实现的方法,其中从存储在处理器芯片上 的存储器中的多个确定性执行时延模式中检索所述确定性时延模式。
9. 一种用于监控指令流水线中的指令执行的计算机实现的方法,所述 计算机实现的方法包括基于对应于指令组的确定性时延模式,标识所述指令组中的依赖指令; 对发生在先行指令完成执行之后的停顿周期数进行计数,以便形成依赖指令延迟;以及响应于确定所述依赖指令延迟等于在确定性执行时延模式中所标识的确定性指令延迟,将所述依赖指令延迟确认为可归于所述依赖指令的执行延迟。
10. 根据权利要求9的计算机实现的方法,其进一步包括 从存储在处理器芯片上的存储器中的多个确定性执行时延模式中检索对应于所述指令组的确定性时延模式。
11. 根据权利要求9的计算机实现的方法,其进一步包括 从硬编码于处理器芯片上的晶体管中的多个确定性执行时延模式中检索对应于所述指令组的确定性时延模式。
12. 根据权利要求9的计算机实现的方法,其进一步包括 将待完成的指令组的停顿周期数与所述确定性执行时延模式进行比较;以及响应于确定所述指令组中的指令在先行指令完成之后的确定性周期数 完成,将所述指令标识为依赖于所述先行指令的指令。
13. 根据权利要求12的计算机实现的方法,其进一步包括 从待完成的指令组的停顿周期数中减去所述依赖指令延迟,以便确定可归于所述先行指令的先行指令延迟。
14. 根据权利要求9的计算机实现的方法,其中所述确定性时延模式 包括在先行指令完成执行之后,预计发生依赖指令完成执行的预先确定 的周期数。
15. 根据权利要求9的计算机实现的方法,其进一步包括 标识所述指令组中每个指令所进行的操作。
16. 根据权利要求15的计算机实现的方法,其进一步包括 基于所标识的所述指令组中每个指令所进行的操作,从多个确定性执行时延才莫式中标识对应于所述指令组的确定性时延模式。
17. —种计算机系统,其包括用于实现权利要求1至16中任何一项 的方法的装置。
18. —种装置,其包括 总线系统;连接至所述总线系统的通信系统;连接至所述总线系统的存储器,其中所述存储器包括计算机可用程序 代码;以及连接至所述总线系统的处理单元,其中所述处理单元执行所述计算机 可用程序代码,以便基于对应于指令组的确定性时延模式,标识所述指令 组中的依赖指令;对发生在先行指令完成执行之后的停顿周期数进行计数, 以便形成依赖指令延迟;以及响应于确定所述依赖指令延迟等于在确定性 执行时延模式中所标识的确定性指令延迟,将所述依赖指令延迟确认为可 归于所述依赖指令的执行延迟。
19. 根据权利要求18的装置,其中所述处理单元进一步执行所述计 算机可用程序代码,以便从存储在处理器芯片上的存储器中的多个确定性 执行时延模式中检索对应于所述指令组的确定性时延模式。
20. 根据权利要求18的装置,其中所述处理单元进一步执行所述计 算机可用程序代码,以便从硬编码于处理器芯片上的晶体管中的多个确定 性执行时延模式中检索对应于所述指令組的确定性时延模式。
21. 根据权利要求18的装置,其中所述处理单元进一步执行所述计 算机可用程序代码,以便将待完成的指令组的停顿周期数与所迷确定性执 行时延模式进行比较;以及响应于确定所述指令组中的指令在先行指令完 成之后的确定性周期数完成,将所述指令标识为依赖于所述先行指令的指 令。
22. 根据权利要求18的装置,其中所述处理单元进一步执行所述计 算机可用程序代码,以便从待完成的指令组的停顿周期数中减去所述依赖 指令延迟,以l更确定可归于所述先行指令的先行指令延迟。
23. 根据权利要求18的装置,其中所述确定性时延模式包括在先行指令完成执行之后,预计发生依赖指令完成执行的预先确定的周期数。
24. 根据权利要求18的装置,其中所述处理单元进一步执行所述计 算机可用程序代码,以便标识所述指令组中每个指令所进行的操作。
25. 才艮据权利要求18的装置,其中所述处理单元进一步执行所述计 算机可用程序代码,以便基于所标识的所述指令组中每个指令所进行的操 作,从多个确定性执行时延模式中标识对应于所述指令组的确定性时延才莫 式。
26. —种微处理器芯片,其包括精简指令集计算机处理器,其中所述精简指令集计算机处理器在指令 流水线中执行指令组;性能监控计数器,其中所述性能监控计数器对于待完成执行的指令组 的停顿周期数进行计数;以及每指令周期分析器,其中所述每指令周期分析器检索对应于所述指令 组的确定性时延模式,将所述停顿周期数与确定性执行时延模式进行比较, 以及响应于确定所述指令组中的指令在先行指令完成之后的确定性周期数 完成,将所述指令标识为依赖指令。
27. 根据权利要求26的微处理器芯片,其中所述微处理器芯片进一 步包括一组电阻,其中将多个确定性执行时延模式硬编码到所述一组电阻中。
28. 根据权利要求26的微处理器芯片,其中所述微处理器芯片进一 步包括在所述微处理器芯片上的存储器,其中将多个确定性执行时延模式存 储在所述^L处理器芯片上的存储器中。
全文摘要
本发明提供了用于测量微处理器中的流水线停顿的方法和装置。一种计算机实现的方法、装置和计算机程序产品,其用于监控指令流水线中指令的执行。该过程标识待完成执行的指令组的停顿周期数。该过程检索对应于所述指令组的确定性时延模式。该过程将所述停顿周期数与确定性执行时延模式进行比较。响应于确定所述指令组中的指令在先行指令完成之后的确定性周期数完成,该过程将所述指令标识为依赖指令。
文档编号G06F9/38GK101246447SQ20081007411
公开日2008年8月20日 申请日期2008年2月14日 优先权日2007年2月15日
发明者A·E·梅里卡斯, V·R·因杜库鲁 申请人:国际商业机器公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1