页表中维护性能监测结构用于监测程序性能的方法和设备的制作方法

文档序号:6512782阅读:222来源:国知局
专利名称:页表中维护性能监测结构用于监测程序性能的方法和设备的制作方法
技术领域
本发明一般涉及一种改进的数据处理系统。具体地说,本发明提供一种用于获得数据处理系统内的性能数据的方法和设备。更具体地说,本发明提供一种用于在获得数据处理系统内的性能数据时对软件工具提供硬件协助的方法和设备。
背景技术
在分析和增强数据处理系统和在该数据处理系统内执行的应用程序的性能时,知道数据处理系统内的哪些软件模块正在使用系统资源是有帮助的。数据处理系统的有效管理和增强需要知道如何和何时使用了各种系统资源。性能工具用来监测和检查数据处理系统,以确定各种软件应用程序在数据处理系统内执行时的资源消耗。例如,性能工具可以识别数据处理系统中最频繁执行的模块和指令,或者可以识别分配最大量的存储器或执行最多I/O请求的那些模块。硬件性能工具可以内置在系统中,或者在以后的时间点添加。
一种公知的软件性能工具是跟踪工具。跟踪工具可以使用多种技术来提供表示执行程序的执行流的跟踪信息。一种技术通过随着特定事件的发生而对其进行记录来跟踪特定指令序列,即所谓的基于事件的概略(profiling)技术。例如,跟踪工具可以记录对模块、子例程、方法、函数或系统组件的每一次进入和每一次退出。或者,跟踪工具可以记录每一个存储器分配请求的请求者以及为其分配的存储器量。典型地,为每一个这样的事件产生时间戳记录。还使用类似于进入-退出记录的对应记录对来跟踪开始和完成I/O或数据传输以及用于很多其它感兴趣事件的任意代码段的执行。
为了改善由不同计算机家族生成的代码的性能,经常有必要确定处理器在执行代码时在何处花费了时间,这样的工作在计算机处理领域内通常称作定位“热点”。在理想情况下,希望以指令和/或源代码行级别查出这样的热点,从而将注意力集中在通过代码改进而可能受益最大的区域。
另一种跟踪技术涉及周期性地对程序的执行流进行采样,以识别该程序似乎花费大量时间的特定程序位置。该技术基于以规则间隔周期性地中断应用程序或数据处理系统执行的思想,即所谓的基于样本的概略。每次中断时,对预定时间长度或者预定次数的感兴趣事件记录信息。例如,在每个间隔期间可以记录当前执行线程的程序计数器,其中该线程是正被进行概略的较大程序的可执行部分。可以在后处理时对照数据处理系统的装载图(load map)和符号表信息来解析这些值,并且可以通过这一分析获得正在何处花费时间的概略信息(profile)。
创建诸如得到与特定情形或问题有关的答案的工具可能非常费力,并且可能非常难以校准,因为软件工具本身影响测试中的系统。本发明认识到对工具开发和问题分析的硬件协助可以极大地减轻开发软件性能工具所需的工作量。此外,随着处理器的密度增大,可以包括硬件协助来提供附加调试和分析特性。
因此,具有一种用于为用来分析数据处理系统的性能的性能工具提供硬件协助的改进方法、设备和计算机指令将是有利的。

发明内容
本发明提供了一种用于处理指令的数据处理系统中的方法、设备和计算机指令。在数据处理系统中的处理器处接收指令。如果选定指示符与该指令相关联,则使得能够对与该指令的执行相关联的每个事件进行计数。
在本发明的一些实施例中,可以检查与这些指示符相关联的计数,以确定这些计数是否高于阈值。如果计数高于阈值,则可识别关联指令/数据地址为热点,并且可以根据热点的识别来进行代码执行的优化。
在本发明的另外实施例中,可以生成根据性能指示符的遇见(encounter)而生成的计数器值的算术组合,并且将其与阈值进行比较,以确定是否向监测应用程序产生中断。在这些实施例中,处理器的微代码被编程为检查由监测应用程序指定的计数器的计数器值,以由监测应用程序指定的方式组合计数器值,然后将组合值与由性能监测应用程序提供的阈值进行比较。这样,可以在处理器的硬件内提供更复杂的中断调节。
在本发明的其它实施例中,在性能监测应用程序中提供用于根据初级度量(metric)的计数器值启动关于所识别的指令、数据地址、所识别指令的范围、或所识别数据地址的范围的次级度量的测量的功能性。因此,例如,当初级度量计数器或初级度量计数器的组合满足或超过预定阈值时,可以产生中断。响应于接收到中断,可以启动与测量一定范围的指令/数据地址的次级度量相关联的计数器。这样,可以使用初级度量性能计数器首先识别特定感兴趣的区域,并且通过使用涉及测量与特定感兴趣的区域相关联的度量的次级度量性能计数器来获得更详细的信息。
在本发明的另外实施例中,性能指示符和计数器值可以用作识别高速缓冲存储器命中(hit)和高速缓冲存储器未中(miss)的机制。采用该实施例,将性能指示符与计算机程序中的选定感兴趣例程的指令相关联。每次执行这些例程的指令时,以及每次必须将这些指令重载(reload)到高速缓冲存储器中时,递增性能计数器。根据这些计数器的值,可以确定高速缓冲存储器命中-未中率。
当高速缓冲存储器命中-未中率变得小于预定阈值,即高速缓冲存储器未中的次数大于高速缓冲存储器命中的次数时,本发明可以确定出现了问题状态。对该小高速缓冲存储器命中-未中率的一个贡献者可能是“追尾(chase tail)”状态。当指令/数据块必须被装载到高速缓冲存储器中、但是在高速缓冲存储器中没有足够可用空间来存储整个指令/数据块时,发生“追尾”状态。在这种情况下,向高速缓冲存储器中的可用空间写入指令/数据,并且在高速缓冲存储器的最近最少使用部分上写入任何溢出。这可导致被覆写的指令/数据上的高速缓冲存储器未中,从而增大高速缓冲存储器未中的次数。
当由于表示低的高速缓冲存储器命中-未中率的性能计数器值而检测到问题状态时,本发明可以在模式寄存器中设置模式位,其表示处理器应当在处理器的微代码内实现“追尾”操作。采用该“追尾”操作,当处理用于将指令/数据块重载到高速缓冲存储器中的重载操作时,处理器进行检查,以确定对于整个指令/数据块,高速缓冲存储器中是否存在可用空间。如果高速缓冲存储器中存在可用空间,则以正常方式在高速缓冲存储器中存储该指令/数据块。然而,如果在高速缓冲存储器中没有足够的空间来存储要被重载的该指令/数据块,则将该指令/数据块或者该指令/数据块的至少溢出部分装载到高速缓冲存储器的保留部分中,其中高速缓冲存储器的保留部分采用与将指令/数据重载到高速缓冲存储器的非保留区域中、并且覆写高速缓冲存储器中已经存在的指令/数据的算法不同的算法来重载。
另外,可以将性能指示符与指令块相关联,从而表示当再次执行该指令块中的指令时,或者当再次访问该数据地址块中的数据地址时,处理器应当在高速缓冲存储器保留区域中查找该指令/数据。
因此,通过当高速缓冲存储器命中-未中率低于预定阈值时调用本实施例的“追尾”操作,本发明通过使不能被高速缓冲存储器内的可用空间容纳的指令/数据的任何重载存储在高速缓冲存储器的保留区域中、而不是覆写高速缓冲存储器非保留区域中的现有高速缓冲存储器条目来避免“追尾”情形。这样,可以避免与由于覆写高速缓冲存储器中最近最少使用的条目而引起的覆写和重载有关的多米诺效应。
在本发明的另外实施例中,本发明的性能指示符可用来获得有关指令或数据高速缓冲存储器内高速缓冲存储器命中和高速缓冲存储器线重载的性质的信息。例如,本发明的这些实施例可用来确定多处理器系统(如对称多处理器(SMP)系统)的处理器是否真正共享高速缓冲存储器线,或者是否存在假高速缓冲存储器线共享。然后,该确定可以用作确定如何更佳地存储高速缓冲存储器线的指令/数据、以防止假高速缓冲存储器线共享的手段。
真或假高速缓冲存储器线共享的确定可以有益于确定在高速缓冲存储器中存储数据和指令的方式。也就是,如果确定高速缓冲存储器线是假共享的,因此由于第一处理器向没有正在被第二处理器访问的高速缓冲存储器线区域写入而经常执行高速缓冲存储器线重载,则可采取适当的措施来最小化假高速缓冲存储器线共享量。
例如,在本发明的另外实施例中,当使用上述机制确定高速缓冲存储器线是假共享的时,可以将正被访问的数据或指令写入到专用于假高速缓冲存储器线共享数据的独立存储器区域中。
然后,可以通过插入指向该新存储器区域的指针来修改代码。因此,当代码再次试图访问原始存储器区域时,将该访问重定向到新存储器区域而非遭受假共享的先前存储器区域。这样,可以避免高速缓冲存储器线的重载。
在本发明的另外实施例中,编译器可随同计算机程序的指令/数据一起获得该性能概略数据,并且使用该信息来优化执行计算机程序、存储指令/数据等的方式。也就是,编译器可以在初始应用程序装载期间花费额外的时间来优化应用程序和指令/数据存储,以便优化应用程序的运行时组件。
编译器优化计算机程序的运行时各方面的方式可根据所获得的特定性能概略数据而变化,其由通过使用前述性能指示符、计数器、标志等而获得的输出来注解。该优化可以是优化指令路径、优化在初始应用程序装载中所花的时间、利用高速缓冲存储器和存储器的方式等。
在本发明的其它实施例中,性能指示符、计数器、阈值和其它性能监测结构可以存储在用来将虚拟地址转换成物理存储地址的页表中。标准页表以用于存储性能监测结构的附加字段扩增。当发生需要对存储器访问的事件时,可以由性能监测应用程序设置这些结构,并且可以对其进行查询和修改。
在逻辑上,对于每次指令提取和数据访问都必须参考页表,以将程序地址或虚拟地址转换成物理地址。为了改善性能,最近使用的页表条目保存在高速缓冲存储器中(转换后备缓冲器或有效到真实地址后备缓冲器),从而提供对将程序地址转换成物理地址所需的信息的快速访问。包含在页表条目中的性能跟踪指示符也可以高速缓存在相同的后备缓冲器中。
在将程序地址转换成物理地址的过程期间,可以从性能监测结构确定指令/数据是否具有关联性能指示符、计数器值、阈值等。通过根据本发明的本实施例的扩增式页表,可以提供在本发明的其它实施例中所述的性能指示符和硬件计数器所提供的相同功能性。
通过阅读下面对优选实施例的详细描述,本发明的这些和其它特性和优点将会得到更详细的描述,或者对于本领域的普通技术人员而言将会变得更加清楚。


在所附权利要求中阐述了被认为是本发明特征的新颖特性。然而,通过参考下面结合附图对示例性实施例的详细描述,本发明本身以及优选使用模式及其进一步目的和优点将会得到更好的理解,其中图1是可以实现本发明的数据处理系统的方框图;图2是根据优选实施例的用于处理信息的处理器系统的方框图;图3是示出根据本发明优选实施例的用于处理与指示符相关联的指令的组件的图;图4是示出根据优选实施例的一种用于将性能指示符与指令或存储器位置相关联的机制的图;图5是示出根据本发明优选实施例的指令包(bundle)的图;
图6A-6B是根据本发明优选实施例的包含性能指示符的子例程的图;图7是根据本发明优选实施例的用于处理包含性能指示符的指令的过程的流程图;图8是根据本发明优选实施例用于选择性地发送指令到中断单元的过程的流程图;图9是根据本发明优选实施例用于响应对与性能指示符相关联的存储器位置的访问而产生中断的过程的流程图;图10是根据本发明优选实施例的用于对事件进行计数的过程的流程图;图11是根据本发明优选实施例的用于对指令进行选择性计数的过程的流程图;图12是根据本发明优选实施例的用于对指令进行选择性计数的过程的流程图;图13是根据本发明优选实施例的用于识别超过阈值的指令的过程的流程图;图14是根据本发明优选实施例的用于访问存储器位置的过程的流程图;图15是示出根据本发明优选实施例的用于生成如性能指示符的元数据的组件的方框图;图16是示出根据本发明优选实施例的元数据的图;图17是示出根据本发明优选实施例的装载和维护性能检测影象高速缓冲存储器(performance instrumentation shadow cache)时所涉及的组件的图;图18是根据本发明优选实施例的用于生成指令元数据的过程的流程图;图19是根据本发明优选实施例的用于生成存储器位置元数据的过程的流程图;图20是根据本发明优选实施例的用于对特定指令的执行进行计数的过程的流程图;图21是根据本发明优选实施例的用于对特定存储器位置的访问进行计数的过程的流程图;图22是示出用于访问关于对指令的执行或对存储器位置的访问所收集的信息的组件的图;图23是根据本发明优选实施例的用于自主修改程序中的代码以允许对代码部分进行选择性计数或概略的组件的方框图;
图24是根据本发明优选实施例的用于将性能指示符动态添加到指令中或者使其与指令相关联的过程的流程图;图25是示出根据本发明优选实施例的用来通过将性能指示符与页内的指令相关联来扫描页的组件的图;图26是根据本发明优选实施例的用于将指示符关联到页内的指令的过程的流程图;图27是示出根据本发明优选实施例的包含堆栈帧的调用堆栈的图;图28是根据本发明优选实施例的用于识别与调用和返回指令相关联的事件的过程的流程图,其中从性能监测器单元收集数据;图29是根据本发明优选实施例的用于识别已被执行多于选定次数的指令的过程的流程图;图30是根据本发明优选实施例的用于在特定指令被执行多于某选定次数时检查调用堆栈并识别例程调用者的过程的流程图;图31是示出根据本发明优选实施例的为进行监测而选择的指令和数据范围的图;图32是根据本发明优选实施例的用于对设定范围的访问次数以及在设定范围内执行的指令数进行计数的过程的流程图;图33是当确定高速缓冲存储器/存储器的热点时本发明一个示例性实施例的主要操作单元的示例性方框图;图34是概述当识别高速缓冲存储器或存储器中的指令/数据的热点时、本发明实施例的示例性操作的流程图;图35是概述当重新装配(repackage)代码中的指令以进行连续执行时、本发明实施例的示例性操作的流程图;图36是概述当使用影象(shadow)数据结构存储热点来优化代码执行时、本发明实施例的示例性操作的流程图;图37是示出当执行计数器值的算术组合以确定是否向监测应用程序发送中断时、本发明的示例性实施例的示例图;图38是概述当组合计数器的值以确定是否应当产生中断时、本发明的示例性操作的流程图;图39是概述根据本发明实施例的当根据初级度量(metrics)的性能计数器值而启动次级度量的监测时本发明的示例性操作的流程图;
图40是概述当用来调用处理器的“追尾(chase tail)”操作时本发明的示例性操作的流程图;图41是概述根据本发明当在处理器内执行“追尾”操作时本发明的示例性操作的流程图;图42是根据本发明示例性实施例的数据高速缓冲存储器的一部分的示例性方框图;图43是根据本发明一个示例性实施例的写标志位区域的示例性方框图;图44是概述当处理对高速缓冲存储器线区域的访问请求时、本发明一个示例性实施例的示例性操作的流程图;图45是概述当处理高速缓冲存储器线的重载时、本发明示例性实施例的示例性操作的流程图;图46是概述当处理例如通过图45的操作而产生的高速缓冲存储器线重载中断时、本发明示例性实施例的示例性操作的流程图;图47是概述移动被识别为假共享的高速缓冲存储器区域以避免假共享的本发明示例性实施例的示例性操作的流程图;图48是概述当优化应用程序执行时本发明示例性实施例的示例性操作的流程图;图49示出利用页表将虚拟地址映射成物理地址的数据流的示例性方框图;图50示出根据本发明示例性实施例的示例性页表条目;以及图51是概述当使用扩增式页表来存储性能监测结构时本发明的示例性操作的流程图。
具体实施例方式
现在参照图1,其示出了可以实现本发明的数据处理系统的方框图。客户机100是计算机的例子,实现本发明的过程的代码或指令可以位于其中。客户机100采用外围组件互连(PCI)局部总线架构。虽然所示例子采用PCI总线,但是也可以使用其它总线架构如加速图形端口(AGP)和工业标准架构(ISA)。处理器102和主存储器104通过PCI桥108连接到PCI局部总线106。PCI桥108还可以包括用于处理器102的集成存储器控制器和高速缓冲存储器。与PCI局部总线106的附加连接可以通过直接组件互连或者通过内插板来实现。
在所示例子中,局域网(LAN)适配器110、小型计算机系统接口SCSI主机总线适配器112和扩展总线接口114通过直接组件连接而连接到PCI局部总线106。与此相反,音频适配器116、图形适配器118和音频/视频适配器119通过插入到扩展槽中的内插板而连接到PCI局部总线106。扩展总线接口114为键盘和鼠标适配器120、调制解调器122和附加存储器124提供连接。SCSI主机总线适配器112为硬盘驱动器126、磁带驱动器128和CD-ROM驱动器130提供连接。典型的PCI局部总线实现将支持三个或四个PCI扩展槽或内插连接器。
操作系统运行在处理器102上,并且用来协调和提供对图1的数据处理系统100内的各个组件的控制。操作系统可以是市场上可买到的操作系统,如可从微软公司获得的Windows XP。面向对象的编程系统如Java可以结合操作系统运行,并且提供从在客户机100上执行的Java程序或应用程序对操作系统的调用。“Java”是太阳微系统公司(Sun Microsystems,Inc.)的商标。操作系统、面向对象的编程系统、以及应用程序或程序的指令位于诸如硬盘驱动器126的存储装置上,并且可以装载到主存储器104中以由处理器102执行。
本领域的普通技术人员应当理解,图1中的硬件可以根据具体实现而不同。作为对图1所示的硬件的补充或替代,可以使用其它内部硬件或外围装置,如快闪只读存储器(ROM)、等效非易失性存储器或光盘驱动器等。另外,本发明的过程也可以应用于多处理器数据处理系统。
例如,客户机100,如果可选地配置为网络计算机,则可以不包括SCSI主机总线适配器112、硬盘驱动器126、磁带驱动器128和CD-ROM 130。在这种情况下,该计算机可以适当地称作客户计算机,并包括某种网络通信接口,如LAN适配器110、调制解调器122等。作为另一个例子,客户机100可以是配置成在不依赖于某种网络通信接口的情况下可启动的独立系统,而不管客户机100是否包括某种网络通信接口。作为另外一个例子,客户机100可以是个人数字助理(PDA),其配置有ROM和/或快闪ROM,以提供用于存储操作系统文件和/或用户所产生数据的非易失性存储器。图1所示的例子和上述例子不意味着隐含结构性限制。
本发明的过程使用计算机实现指令由处理器102执行,其中该指令可以位于例如主存储器104、存储器124的存储器或者一个或多个外围装置126-130中。
接下来参照图2,其示出了根据本发明优选实施例的用于处理信息的处理器系统的方框图。处理器210可以作为图1中的处理器102实现。
在优选实施例中,处理器210是单个集成电路超标量微处理器。从而,如下面进一步所述,处理器210包括各种单元、寄存器、缓冲器、存储器和其它部分,所有这些都由集成电路形成。另外,在优选实施例中,处理器210根据简化指令集计算机(“RISC”)技术运行。如图2所示,系统总线211连接到处理器210的总线接口单元(“BIU”)212。BIU 212控制处理器210与系统总线211之间的信息传输。
BIU 212连接到处理器210的指令高速缓冲存储器214和数据高速缓冲存储器216。指令高速缓冲存储器214将指令输出到定序器单元218。响应来自指令高速缓冲存储器214的这些指令,定序器单元218将指令选择性地输出到处理器210的其它执行电路。
除了定序器单元218之外,在本优选实施例中,处理器210的执行电路还包括多个执行单元,即分支(branch)单元220、定点单元A(“FXUA”)222、定点单元B(“FXUB”)224、复杂定点单元(“CFXU”)226、装载/存储单元(“LSU”)228以及浮点单元(“FPU”)230。FXUA 222、FXUB 224、CFXU 226和LSU 228从通用架构寄存器(“GPR”)232和定点重命名(rename)缓冲器234输入其源操作数信息。而且,FXUA 222和FXUB 224从进位(“CA”)寄存器239输入“进位”。FXUA 222、FXUB 224、CFXU 226和LSU 228输出它们的运算结果(目的操作数信息),以存储在定点重命名缓冲器234内的选定条目(entry)上。另外,CFXU 226从专用寄存器处理单元(“SPR单元”)240输入并向其输出源操作数信息和目的操作数信息。
FPU 230从浮点架构寄存器(“FPR”)236和浮点重命名缓冲器238输入其源操作数信息。FPU 230输出其运算结果(目的操作数信息),以存储在浮点重命名缓冲器238内的选定条目上。
响应装载指令,LSU 228从数据高速缓冲存储器216输入信息,并且将该信息拷贝到重命名缓冲器234和238中选定的一个。如果该信息未存储在数据高速缓冲存储器216中,则数据高速缓冲存储器216(通过BIU 212和系统总线211)从连接到系统总线211的系统存储器260输入该信息。而且,数据高速缓冲存储器216能够(通过BIU 212和系统总线211)将信息从数据高速缓冲存储器216输出到连接到系统总线211的系统存储器260。响应存储指令,LSU 228从GPR 232和FPR 236中选定的一个输入信息,并且将该信息拷贝到数据高速缓冲存储器216。
定序器单元218从GPR 232和FPR 236输入信息,并且向其输出信息。分支单元220从定序器单元218输入指令和表示处理器210的当前状态的信号。响应该指令和信号,分支单元220(向定序器单元218)输出表示存储要由处理器210执行的指令序列的合适存储器地址的信号。响应来自分支单元220的该信号,定序器单元218从指令高速缓冲存储器214输入所指示的指令序列。如果指令序列中的一条或多条指令没有存储在指令高速缓冲存储器214中,则指令高速缓冲存储器214(通过BIU 212和系统总线211)从连接到系统总线211的系统存储器260输入这些指令。
响应从指令高速缓冲存储器214输入的指令,定序器单元218选择性地将指令调度到执行单元220、222、224、226、228和230中选定的执行单元。每个执行单元执行一条或多条特定指令类的指令。例如,FXUA 222和FXUB224对源操作数执行第一类定点算数运算,如加法、减法、与运算、或运算以及异或运算。CFXU 226对源操作数执行第二类定点运算,如定点乘法和除法。FPU 230对源操作数执行浮点运算,如浮点乘法和除法。
当信息存储在选定的一个重命名缓冲器234上时,该信息与由为其分配了选定重命名缓冲器的指令指定的存储位置(例如,GPR 232或CA寄存器242之一)相关联。响应来自定序器单元218的信号,将选定的一个重命名缓冲器234上存储的信息拷贝到与其关联的一个GPR 232(或CA寄存器242)中。定序器单元218响应“完成”产生了该信息的指令,引导拷贝在选定的一个重命名缓冲器234上存储的信息。该拷贝称作“写回”。
当信息存储在选定的一个重命名缓冲器238上时,该信息与一个FPR 236相关联。响应来自定序器单元218的信号,将选定的一个重命名缓冲器238上存储的信息拷贝到与其关联的一个FPR 236中。定序器单元218响应“完成”产生该信息的指令,引导拷贝在选定的一个重命名缓冲器238上存储的信息。
处理器210通过在执行单元220、222、224、226、228和230中的各个单元上同时处理多条指令来实现高性能。因此,每条指令分成一系列阶段来处理,其中每个阶段可以与其它指令的阶段并行执行。该技术称作“流水线技术”。在该示例性实施例的一个重要方面,指令通常分成以下六个阶段来处理,即提取(fetch)、译码、调度、执行、完成和写回。
在提取阶段,定序器单元218选择性地(从指令高速缓冲存储器214)从上面有关分支单元220和定序器单元218而作过进一步讨论的存储指令序列的一个或多个存储器地址输入一条或多条指令。
在译码阶段,定序器单元218对多达四条所提取的指令进行译码。
在调度阶段,定序器单元218在为所调度指令结果(目的操作数信息)保留重命名缓冲器条目之后,将多达四条已译码的指令选择性地调度到执行单元220、222、224、226、228和230中(响应译码阶段中的译码)选定的执行单元。在调度阶段,将操作数信息提供给所调度指令的选定执行单元。处理器210以指令编程序列的次序调度指令。
在执行阶段,如上所述,执行单元执行其调度指令,并且输出其操作结果(目的操作数信息)以存储在重命名缓冲器234和重命名缓冲器238内的选定条目上。以这种方式,处理器210能够相对于指令编程序列无序地执行指令。
在完成阶段,定序器单元218指示指令“完成”。处理器210以指令编程序列的次序“完成”指令。
在写回阶段,定序器218引导将信息分别从重命名缓冲器234和238拷贝到GPR 232和FPR 236。定序器单元218引导拷贝选定的重命名缓冲器上存储的信息。同样,在特定指令的写回阶段,处理器210响应该特定指令更新其架构状态。处理器210以指令编程序列的次序处理指令的相应“写回”阶段。处理器210在特定情形下有利地合并指令的完成阶段和写回阶段。
在该示例性实施例中,每条指令需要一个机器周期来完成指令处理的每一个阶段。但是,一些指令(例如由CFXU 226执行的复合定点指令)可能需要多个周期。因此,响应完成先前指令所需的时间的变化,在特定指令的执行和完成阶段之间可能发生可变延迟。
完成缓冲器248安设在定序器218内,以跟踪正在执行单元内执行的多条指令的完成。一旦出现以应用程序指定顺序成功地完成了一条指令或一组指令的指示时,可以利用完成缓冲器248来启动将这些已完成指令的结果传输到关联通用寄存器。
另外,处理器210还包括连接到指令高速缓冲存储器214以及处理器210中的其它单元的处理器监测单元240。可以利用性能监测器单元240来监测处理器210的操作,在本示例性实施例中,性能监测器单元240是能够提供描述指令执行资源的利用和存储控制的详细信息的软件可访问机制。虽然图2中未示出,性能监测器单元240耦接到处理器210的每个功能单元,以允许监测处理器210的操作的所有方面,包括例如重建事件之间的关系、识别假触发、识别性能瓶颈、监测流水线停顿(pipeline stall)、监测空闲处理器周期、确定调度效率、确定分支效率、确定未对齐数据访问的性能损失(penalty)、识别串行化指令的执行频率、识别被禁止的中断、以及确定性能效率。
性能监测器单元240包括其数目依赖于具体实现的(例如,2-8个)计数器241-242,其被标记为PMC1和PMC2,用来对选定事件的发生进行计数。性能监测器单元240还包括至少一个监测模式控制寄存器(MMCR)。在本例中,存在两个指定计数器241-242功能的控制寄存器MMCR 243和244。计数器241-242和MMCR 243-244最好作为通过可由CFXU 226执行的MFSPR(从SPR传送)和MTSPR(传送至SPR)指令可访问、以进行读或写的SPR来实现。然而,在一个可替换实施例中,计数器241-242和MMCR 243-244可以简单地作为I/O空间中的地址实现。在另一个可替换实施例中,控制寄存器和计数器可以通过变址寄存器来间接访问。该实施例以来自英特尔公司(IntelCorporation)的处理器内的IA-64架构来实现。
另外,处理器210还包括连接到指令高速缓冲存储器214的中断单元250。另外,虽然图2中未示出,中断单元250连接到处理器210内的其它功能单元。中断单元250可以从其它功能单元接收信号,并且启动诸如开始错误处理或捕获过程的操作。在这些例子中,中断单元250用来产生在程序执行期间可能发生的中断和异常。
本发明提供了在程序执行期间监测对特定指令的执行以及对特定存储器位置的访问的能力。具体地说,可以使用空闲字段来保存用于标识指令或存储器位置为要由性能监测器单元或处理器中的某个其它单元监测的指令或存储器位置的指示符。或者,指示符可以存储在与指令或存储器位置相关联的另一个位置中。在指示符置于指令中的情况下,典型地使用空闲字段,但是在一些情况下可以扩展指令以包括指示符所需的空间。在这种情况下,处理器的架构可能需要改变。例如,64位架构可以改成65位架构以容纳指示符。对于数据访问,指示符可以与数据或该数据所在的存储器位置相关联。
现在参照图3,其示出了根据本发明优选实施例的用于处理与指示符相关联的指令的组件的图。指令高速缓冲存储器300接收指令包(bundle)302。指令高速缓冲存储器300是图2中的指令高速缓冲存储器214的示例。指令包是一种指令编组。这种指令编组典型地出现于可从英特尔公司获得的IA-64处理器中。指令高速缓冲存储器300处理所要执行的指令。
作为该指令处理的一部分,指令高速缓冲存储器300确定哪些指令与指示符相关联。在这些例子中,这些指示符也称作“性能指示符”。信号304已与性能指示符相关联。结果,将指令的信号304发送到性能监测器单元306。性能监测器单元306是图2中的性能监测器单元240的例子。
当指令高速缓冲存储器300确定存在与指示符相关联的指令时,发送信号以表示正在执行被标记(marked)的指令。在这些例子中,被标记的指令是与性能指示符相关联的指令。或者,性能指示符可以指示指令包中的所有项目或指令均被标记以被计数。另外,这些指令的信号由指令高速缓冲存储器300发送到适当的功能单元。根据具体实现,不同于性能监测器单元306的功能单元可以对指令执行进行计数。在性能指示符位于指令或指令包中的情况下,高速缓冲存储器单元,即指令高速缓冲存储器300检测指示符,并且向性能监测器单元306发送信号。
当性能监测器单元306接收到这些指令的信号时,性能监测器单元306对与指令304的执行相关联的事件进行计数。如图所示,性能监测器单元306被编程为仅对与性能指示符相关联的指令的事件进行计数。换句话说,使用与指令或存储器位置相关联的指示符来使得能够由性能监测器单元306对与指令或存储器位置相关联的事件进行计数。如果指令高速缓冲存储器300接收到没有性能指示符的指令,则不对与该指令相关联的事件进行计数。总而言之,性能指示符使得能够在处理器中逐指令地或逐存储器位置地进行计数。
如果性能监测器单元306设成对这些类型的被标记指令所允许的度量(metrics)进行计数的模式,则性能监测器单元306对与性能指示符相关联的指令的事件进行计数。在某些情况下,性能监测器单元306可以设成执行作为当前可用功能的某种其它类型的计数,例如对所有指令的执行进行计数。
对于访问存储器位置中的数据,由数据高速缓冲存储器,如图2中的数据高速缓冲存储器216而不是由指令高速缓冲存储器来处理数据和指示符。数据高速缓冲存储器将表示正在访问被标记存储器位置的信号发送到性能监测器单元308。被标记存储器位置类似于被标记指令。这些类型的存储器位置是与性能指示符相关联的存储器位置。
接下来参照图4,其示出了根据本发明优选实施例的一种用于将性能指示符与指令或存储器位置相关联的机制的图。处理器400从高速缓冲存储器402接收指令。在本例中,指示符不与指令一起存储,也不存储于找到数据的存储器位置中。相反,指示符存储在单独的存储区域,即性能检测影象高速缓冲存储器(shadow cache)404内。该存储装置可以是任何存储装置,例如系统存储器、闪速存储器、高速缓冲存储器或盘。
当处理器400从高速缓冲存储器402接收指令时,处理器400检查性能检测影象高速缓冲存储器404,以查看性能指示符是否与指令相关联。对包含数据的存储器位置的访问进行类似的检查。在一个实施例中,为每个不影响实际数据段的对应字提供完全影象字。换句话说,处理器400允许高速缓冲存储器402的架构或配置保持不变。在这些例子中,所述映射是逐字的。然而,也可以使用某种其它类型的映射,例如每数据字一个影象位,其中性能检测影象高速缓冲存储器404中的位对应于一个数据字。
对于这种类型的架构,利用该特性,编译器以类似于调试符号的方式、在与数据区域本身分开的单独工作区域内创建调试信息。当装载模块时,由装载器准备额外的信息,即性能指示符,从而当将指令装载到高速缓冲存储器402中时,使其可用于并入性能检测影象高速缓冲存储器404。这些高速缓冲存储器区域可以是混合的并且要么如此标记要么通过操作模式理解。处理器400使用性能指示符来确定如何对相关数据访问和指令执行进行计数,或者使其采取异常。在这些例子中,通过调试器或性能分析程序将该过程编程,以知道在执行指令时是否使用影象信息。
接下来参照图5,其示出了根据本发明优选实施例的指令包的图。指令包500包含指令槽(slot)502、指令槽504、指令槽506和模板508。如图所示,指令包500包含128位(bit)。每个指令槽包含41位,而模板508包含5位。模板508用来标识当前指令包内的终止,并且将槽内的指令映射到不同类型的执行单元。
指令包500内的空闲位用来保存本发明的指示符。例如,指示符510、512和514分别位于指令槽502、504和506内。这些指示符可以根据具体实现而采取各种形式和各种大小。指示符可以使用单个位或者可以使用多个位。单个位可以用来指示响应该指令的执行要对事件进行计数。多个位可以用来标识阈值,例如用于可以在应该对事件进行计数之前过去的指令执行的多个处理器或时钟周期。此外,这些位甚至可以用作特定指令的计数器。类似的字段使用可以用于标记数据或存储器位置的指示符。
或者,模板508可以用来包含一组相关指示符,从而使用一位来标识指令包中的所有指令。另外,指令包本身可以扩展成256位或某一其它位数,以包含性能指示符的额外信息。
接下来参照图6A和6B,其示出了根据本发明优选实施例的包含性能指示符的子例程和包含性能指示符的数据的图。在本例中,图6A中的子例程600包括多条指令,其中指令602、604和606与性能指示符相关联。这些指令也称作被标记指令。当执行这些指令时,对与这些指令相关联的事件进行计数,从而为软件工具获得数据,以分析执行子例程600的数据处理系统的性能。
数据或包含数据的存储器位置可以采用类似方式以指示符标记。在这些例子中,这些指示符用于对数据或存储器位置访问进行计数。在图6B中,数据610包括与性能指示符相关联的数据。数据612和数据614是与性能指示符相关联的数据612的部分。与性能指示符相关联的这些数据部分也称作被标记数据。
现在参照图7,其示出了根据本发明优选实施例的用于处理包含性能指示符的指令的过程的流程图。图7所示的过程可以在指令高速缓冲存储器,如图2中的指令高速缓冲存储器214中实现。
该过程以接收指令包(步骤700)开始。在这些例子中,每个指令包具有类似于图5中的指令包500的格式。识别指令包中的指令(步骤702)。确定是否存在与指令相关联的性能指示符(步骤704)。该确定可以通过检查指令或指令包中的适当字段来进行。或者,可以检查性能检测影象高速缓冲存储器,如图4中的性能检测影象高速缓冲存储器404,以查看性能指示符是否与指令相关联。
如果存在性能指示符,则发送信号到性能监测器单元(步骤706)。当接收到该信号时,性能监测器单元将对与指令执行相关联的事件进行计数。另外,对指令进行处理(步骤708)。指令处理包括例如将指令发送到适当的功能单元以便执行。
然后,确定在指令包中是否存在另外的未处理指令(步骤710)。如果在指令包中存在另外的未处理指令,则该过程返回到如上所述的步骤702。否则,该过程终止。回到步骤704,如果不存在性能指示符,则该过程直接进入步骤708。
现在参照图8,其示出了根据本发明优选实施例的用于选择性地发送信号到中断单元的过程的流程图。图8所示的过程可以在指令高速缓冲存储器,如图2的指令高速缓冲存储器242中实现。在使用性能监测器单元监测事件可能错过特定事件的情况下采用该过程。例如,性能监测器单元对事件进行计数。当发生高速缓冲存储器未中时,发送信号到性能监测器单元。当将对应高速缓冲存储器线的元数据装载到高速缓冲存储器中时,也引发(raise)一个或多个适当信号。如果元数据表示要引发异常,则发送信号到中断单元,其中该信号表示要引发异常。
该过程以接收指令包(步骤800)开始。识别指令包中的指令(步骤802)。确定是否存在与该指令相关联的性能指示符(步骤804)。发送到中断单元以表示要引发异常的信号不同于发送到性能监测器单元的信号。例如,指令可以与具有导致发送信号到中断单元的第一值的特定性能指示符相关联。性能指示符的第二值可以用来发送不同信号到性能监测器单元。如果存在具有第一值的性能指示符,则发送信号到中断单元(步骤806)。当接收到该信号时,中断单元启动适当的调用流支持以处理该中断。调用流支持可以例如记录试图访问高速缓冲存储器中的指令或数据的功能单元可能发生的高速缓冲存储器未中。
另外,对指令进行处理(步骤808)。指令的处理包括例如发送指令到适当的功能单元以便执行。
然后,确定指令包中是否存在另外的未处理指令(步骤810)。如果指令包中存在另外的未处理指令,则该过程返回到如上所述的步骤802。否则,该过程终止。回到步骤804,如果不存在性能指示符,则该过程直接进入步骤808。
现在参照图9,其示出了根据本发明优选实施例的用于响应对与性能指示符相关联的存储器位置的访问而产生中断的过程的流程图。图9所示的过程可以在数据高速缓冲存储器,如图2的数据高速缓冲存储器246中实现。
该过程以识别访问存储器位置的请求(步骤900)开始。响应识别出该请求,确定性能指示符是否与存储器位置相关联(步骤902)。如果性能指示符与存储器位置相关联,则通过发送信号到中断单元来产生中断(步骤904)。然后,处理对存储器位置的访问(步骤906),然后该过程终止。
在图10中,示出了根据本发明优选实施例的用于对事件进行计数的过程的流程图。图10所示的过程可以在性能监测器单元,如图2的性能监测器单元240中实现。
该过程以从指令高速缓冲存储器接收表示正在处理带有性能指示符的指令的信号(步骤1000)开始。接下来,对与正被处理的指令相关联的事件进行计数(步骤1002),然后该过程终止。事件计数可以存储在计数器,如图2的计数器241中。
接下来参照图11,其示出了根据本发明优选实施例的用于对指令进行选择性计数的过程的流程图。图11所示的过程可以在指令高速缓冲存储器,如图2的指令高速缓冲存储器214中实现。
该过程以确定是否接收到与性能指示符相关联的指令(步骤1100)开始。在本例中,该指示符导致对由处理器执行的这一指令和所有后续指令的事件进行计数。或者,该指示符可以是指示要开始新计数模式的指令本身。如果接收到带有指示符的指令,则设置标志以开始对指令的事件进行计数(步骤1102)。该标志表示应开始对指令的事件进行计数。
接下来,确定是否接收到带有指示符的指令(步骤1104)。或者,指示符可以是指示要停止新计数模式的指令本身。如果接收到带有指示符的指令,则清除(unset)该标志以停止对事件的计数(步骤1106),然后该过程终止。
步骤1100和步骤1104中的指示符可以是相同的指示符,其中该指示符触发标志的设置和清除。在另一种实现中,可以使用两个不同的指示符,其中第一指示符仅设置标志。第二指示符用来清除标志。可以通过在要进行计数时采用高信号而在不再激活计数时采用低信号来简单地实现高速缓冲存储器单元,如指令高速缓冲存储器或数据高速缓冲存储器与性能监测器单元之间为表示计数模式而进行的通信。
接下来参照图12,其示出了根据本发明优选实施例的用于对指令进行选择性计数的过程的流程图。图12所示的过程可以在指令高速缓冲存储器,如图2的指令高速缓冲存储器214中实现。
该过程以检查标志(步骤1200)开始。确定是否设置了标志(步骤1202)。如果设置了标志,则发送信号到性能监测器单元,以激活该单元对事件进行计数(步骤1204),然后该过程终止。否则,发送信号到性能监测器单元,以禁止对事件计数(步骤1206),然后该过程终止。
图11和12所示的过程在指令与性能指示符相关联之后,对所有指令的事件进行计数。通过这种方式,可以使用较少的位来触发对事件的计数。此外,在对所有指令计数的情况下,可以对与外部子例程调用相关联的事件进行计数。
现在参照图13,其示出了根据本发明优选实施例的用于识别超过阈值的指令的过程的流程图。图13所示的过程可以在指令高速缓冲存储器,如图2的指令高速缓冲存储器214中实现。
该过程以接收与性能指示符相关联的指令(步骤1300)开始。为指令识别阈值(步骤1302)。在这些例子中,阈值与完成指令所需的多个处理器或时钟周期相关。如果访问高速缓冲存储器所需的高速缓冲存储器延迟或时间量超过该阈值,则对该事件进行计数。在这些例子中,阈值设置在指示符内。
例如,可以使用三个位来设置八个不同的阈值。例如,“xx1”=10个周期,“x1x”=50个周期,以及“1xx”=100个周期。这三位的某些组合可以用来设置阈值。根据具体实现,可以使用更多或更少的位,并且可以将不同值分配给这些位。这些位的含义也可以通过接口来控制,例如可以用来设置每个位的含义的一组寄存器。这些寄存器是为此特定目的而添加到处理器架构的寄存器。
监测用于执行该指令的周期(步骤1304)。确定对于该指令是否超过了阈值(步骤1306)。如果超过了阈值,则执行选定操作(步骤1308)。该选定操作可以根据具体实现而采取不同的形式。例如,每次超过阈值时,可以递增计数器。或者,可以产生中断。中断可以将控制传递给另一个过程以收集数据。例如,该数据可以包括调用堆栈和获得有关该调用堆栈的信息。堆栈是保留存储器的区域,其中一个或多个程序存储状态数据,如过程和函数调用地址、所传递的参数、性能监测器计数器值以及有时还有局部变量。
确定监测是否结束(步骤1310)。步骤1310可以一次一条指令地实现。当执行了指令或者超过了阈值时,发送信号。在本例中,单条指令的执行导致发送一个信号。在可以同时执行多条指令的情况下,可能需要多个信号来表示每条指令的执行。在一些实施例中,可以支持采样方案,其中仅对一次一条指令支持阈值。这可以通过仅支持处理器指令队列内的特定位置中的那些指令的阈值来实现。在其它实施例中,如果至少一条被标记指令超过阈值,则可以发送一个信号。对于超过阈值的每条指令,为该指令引发或产生单独的信号。
如果监测结束,则将所收集的信息发送到监测程序(步骤1312),然后,该过程终止。否则,该过程返回到如上所述的步骤1304。在步骤1306,如果对于该指令未超过阈值,则该过程直接进入步骤1310。
可以在数据高速缓冲存储器,如图2的数据高速缓冲存储器216中实现类似的过程,以监测对存储器位置的访问。图13所示的过程可以被修改成识别访问存储器位置中的数据所需的周期。如同指令执行一样,当访问存储器位置中的数据所需的时间量超过指定阈值时,进行计数或产生中断。
如同其它例子一样,可以作为指令的一部分或者与存储器位置中的数据一起包括这些指示符。或者,这些指示符可以与指令或数据相关联地在性能检测影象高速缓冲存储器或存储器中找到。
参照图14,其示出了根据本发明优选实施例的用于监测对存储器位置的访问的过程的流程图。图14所示的过程可以在数据高速缓冲存储器,如图2的数据高速缓冲存储器216中实现。该过程用来对存储器位置中的数据访问进行计数。
该过程以接收与性能指示符相关联的数据(步骤1400)开始。确定是否访问了该数据的存储器位置(步骤1402)。如果访问了该存储器位置,则递增计数器(步骤1404)。确定监测是否结束(步骤1406)。如果对存储器位置的监测结束,则该过程终止。否则,该过程返回到步骤1402。在步骤1402,如果没有访问存储器位置,则该过程进入步骤1406。
参照图15,其示出了根据本发明优选实施例的用于生成元数据,如性能指示符的组件的方框图。编译器支持指示要生成元数据的、嵌入在源中的命令(directive)。编译器1500可以生成用于执行的指令1502和用于监测的元数据。在这些例子中,当指令或数据高速缓冲存储器页被装载到存储器中时,操作系统程序装载器/链接器和/或性能监测程序读取由编译器1500生成的元数据,并且将元数据装载到存储器,如性能监测器部分1506中。该部分本身被标记为元数据1504。处理器可以接受性能监测器部分1506中具有编译器所生成部分数据的格式的元数据1504,并且向处理器的内部性能检测影象高速缓冲存储器填充该数据。下面参照图17描述面向块的方案。
在一个实施例中,该格式对于其块或扇区(sector)引用中的每一个都简单地具有性能检测影象高速缓冲存储器条目,并且将元数据1504传送至其对应的一个或多个影象条目。代替具有性能检测影象高速缓冲存储器,可以修改高速缓冲存储器本身的内部格式来包含元数据1504。在修改指令流本身以包含元数据的实施例中,装载器更新指令流以包含适当的指示符和工作区域,或者编译器1500生成了代码来包含元数据1504。在任何情况下,在装载了代码之后,处理器接收元数据1504。
另外,元数据1504可以与指令1502相关联地置于性能检测影象存储器1505中。编译器1500在表或调试数据部分中产生信息。性能监测程序将该信息装载到性能检测影象存储器1505内的影象数据区域中。或者,调试区域可以由一起工作的操作系统和处理器自动填充。
然后,可以由处理器1508执行指令1502。编译器1500可以设置处理器1508中的寄存器,如模式寄存器1510。当设置了该寄存器时,处理器1508在执行指令1502时查看性能检测影象存储器1505中的元数据1504,以确定元数据1504中的性能指示符是否与指令1502中正被执行的指令相关联。使用例如上面参照图2-14所述的过程处理这些性能指示符。如果没有设置模式寄存器1510,则在执行指令1502时忽略元数据1504。
可以对存储器位置1512中的数据执行类似的过程。根据具体实现,元数据1504可以置于指令内或数据内,而不是置于性能检测影象存储器1505中。然而,通过将元数据1504置于性能检测影象存储器1505中,当元数据1504置于性能检测影象存储器1505中时,可以动态执行元数据1504的生成。
该特性允许在不必修改程序的情况下进行对指令的选择和监测。换句话说,编译器1500可以在编译了指令1502以便由处理器1508执行之后生成元数据1504。设置模式寄存器1510使处理器1508在性能检测影象存储器1505中查找元数据1504,而不必修改指令1502。在这些例子中,元数据1504采取告诉处理器1508如何处理对指令1502的执行和/或对存储器位置1512的数据访问的性能指示符的形式。
接下来参照图16,其示出了根据本发明优选实施例的元数据的图。元数据1600是图15中的元数据1504的例子。该元数据由编译器如编译器1500生成。
在本例中,元数据1600包括5个条目,即条目1602、1604、1606、1608和1610,如元数据1600中的行1612所示。在本例中,这些条目中的每一个都包括偏移、长度和用于描述代码的检测(instrumentation)的标志。
条目1602的偏移为0,而其条目长度为120字节。标志1614表示需要对由条目长度1616表示的范围内的所有指令进行计数。在这些例子中,每条指令的长度为4字节。条目1604的条目长度为4字节,这与指令相对应。标志1618表示当执行该指令时应当产生异常。
在条目1606中,以160字节的偏移开始的指令与标志1620相关联。该标志表示如果超过阈值,即100个周期,则应当对指令进行计数。
条目1608中的标志1622表示应当在偏移为256字节的指令处开始跟踪。如条目1610中的标志1624所指示而停止跟踪,其中条目1610在偏移为512字节处具有用于指令的标志。
这些标志用来生成与这些指令相关联的性能指示符。操作系统将由编译器生成的该元数据传送到性能检测影象存储器,如图15的性能检测影象存储器1506中,并且处理该元数据。或者,根据具体实现,该元数据可以置于指令内的字段中。
现在参照图17,示出根据本发明优选实施例的在装载和维护性能检测影象高速缓冲存储器时所涉及的组件的图。在本例中,现有高速缓冲存储器1700包含主段1702。主段1702包括块1704、1706、1708、1710、1712、1714、1716、1718、1720、1722和1724。转换表1726用来提供主段1702中的块1704-1724到性能检测(perfinst)段1728中的块的映射。该段中的数据置于新性能检测影象高速缓冲存储器1730中。
在程序编译的时候,编译器生成如前所述的新性能检测数据部分。在程序装载时候,装载器向处理器查询以确定高速缓冲存储器线大小。装载器以处理器所要求的格式,为装载器所装载的任何文本或数据段解析性能检测段1728、并且构造影象段。该影象段置于新性能检测影象高速缓冲存储器1730中。
影象段中的每一块包含对应主高速缓冲存储器块中的指令或数据的元数据。该元数据例如包括主段1702中的块内每个带标签(tagged)项目的标志、标签字段、阈值和计数字段。该元数据还可以包括代表块中的所有指令或数据的标志。
装载器构造将主段1702中的每个块映射到性能检测段1728中对应的性能检测块,如块1732、1734、1736、1738、1740、1742、1744、1746、1748、1750和1752的表,即转换表1726。此外,装载器还向处理器登记该表即转换表1726的头,以及主段1702的位置和大小。
在页更替的时候,页面调度(paging)软件提供新接口来使性能检测段1728与对应主段即主段1702相关联。当主段1702进行页面调入或调出时,性能检测段1728也进行页面调入或调出。
在高速缓冲存储器线更替的时候,处理器包含新性能检测影象高速缓冲存储器1730,其中的高速缓冲存储器帧与现有数据和指令高速缓冲存储器,如现有高速缓冲存储器1700中的帧直接相关联。当处理器的指令或数据高速缓冲存储器装载新线(line)时,它也必须将对应性能检测块装载到性能检测影象高速缓冲存储器,即新性能检测影象高速缓冲存储器1730中。处理器(从在程序装载的时候由装载器提供的登记数据)知道处理器正在将块带入具有关联性能检测段,即性能检测段1728的高速缓冲存储器。处理器在与该段相关联的转换表1726中查看,得到对与将要装载的块相对应的性能检测块的引用,并且将该性能检测块装载到新性能检测影象高速缓冲存储器1730中。在这些例子中,与元数据相关联的高速缓冲存储器未中不被通知,或者以不同于与主高速缓冲存储器块,如主段1702中的数据相关联的高速缓冲存储器未中的方式进行处理。
现在参照图18,其示出了根据本发明优选实施例的用于生成指令的元数据的过程的流程图。图18所示的过程可以由性能监测程序实现。
该过程以识别要进行概略的指令(步骤1800)开始。该指令可以是例如已被执行多于选定次数的指令。为所识别的指令生成元数据(步骤1802)。该元数据采取性能指示符的形式。例如,性能指示符可以每当执行该指令时递增计数器,在执行指令所需的周期数超过阈值的情况下递增计数器,在该指令之后对所有事件、所有指令触发对事件的计数,或者对响应执行该指令而发生的事件进行计数。在优选实施例中,计数器位于关联的性能检测影象高速缓冲存储器中,并且采取若干位来允许高速缓冲存储器中的数据或指令与被保留用于计数的位之间的一一对应关系。
然后,将元数据与指令相关联(步骤1804)。接下来,确定是否存在更多指令要处理(步骤1806)。如果存在另外的指令,则该过程返回到步骤1800。否则,该过程终止。可以使用类似的过程来动态生成存储器位置中的数据的元数据。
现在参照图19,其示出了根据本发明优选实施例的用于生成存储器位置的元数据的过程的流程图。图19所示的过程可以在编译器如图15的编译器1500中实现。
该过程以识别要进行概略的存储器位置(步骤1900)开始。为所识别的存储器位置生成元数据(步骤1902)。该元数据采取性能指示符的形式。性能指示符可以,例如,每当访问存储器位置时递增计数器,在访问存储器位置所需的周期数超过阈值的情况下递增计数器,或者触发对存储器位置的所有访问的计数。然后,将元数据与存储器位置相关联(步骤1904)。接下来,确定是否存在更多存储器位置要处理(步骤1906)。如果存在另外的存储器位置,则该过程返回到步骤1900。否则,该过程终止。
现在参照图20,其示出了根据本发明优选实施例的用于对特定指令的执行进行计数的过程的流程图。图20所示的过程可以在指令高速缓冲存储器如图2的指令高速缓冲存储器214中实现。
该过程以执行指令(步骤2000)开始。确定计数器是否与指令相关联(步骤2002)。计数器可以包括在指令内的字段中,或者可以位于性能检测影象存储器中。如果计数器与指令相关联,则递增计数器(步骤2004),然后该过程终止。否则,该过程终止而不递增计数器。如果计数器超过阈值,则可以复位计数器。
当计数器作为指令的一部分实现时,该计数器可能为有限大小。在这种情况下,可以设置计数器的阈值以表示计数器何时处于溢出的危险中。计数器的值处于计数器超过阈值之前或者达到该值时。然后,在读到该值之后,则可以复位计数器。该值可以由性能监测器单元或用来分析数据的程序读取。可以实现API来访问该数据。
现在参照图21,其示出了根据本发明优选实施例的用于对特定存储器位置的访问进行计数的过程的流程图。图21所示的过程可以在数据高速缓冲存储器,如图2的数据高速缓冲存储器216和指令高速缓冲存储器214中实现。
该过程以检测对存储器位置的访问(步骤2100)开始。确定计数器是否与存储器位置相关联(步骤2102)。计数器可以包括在存储器位置内,或者可以位于性能检测影象存储器中。如果计数器与存储器位置相关联,则递增计数器(步骤2104),然后该过程终止。否则,该过程终止而不递增计数器。
接下来参照图22,其是示出用于访问关于指令执行或存储器位置访问而收集的信息的组件的图。在本例中,指令单元2200执行指令2202,并且递增计数器2204。每次执行指令2202时,都递增该计数器。在本例中,指令单元2200可以作为图2中的指令高速缓冲存储器214实现。
当指令或数据高速缓冲存储器页被装载到存储器中时,操作系统程序装载器/链接器和/或性能监测程序读取由编译器生成的元数据,并且确定计数与指令或数据访问相关联,然后装载过程分配数据区域来维护计数器作为其性能检测段的一部分。计数器的大小和数据访问的粒度决定所要分配的工作区域的量。
在简单的情况下,数据或指令访问的粒度可以是字大小(从而对字中的任何字节的访问都被认为是访问),并且计数也可以是字大小。在这种情况下,在主段和性能检测段之间存在一对多映射(不需要全字来包含计数或阈值)。装载过程分配一个或多个影象页,并且告诉处理器使用该一个或多个影象页来包含计数。该映射的详细信息在上面参照图17作过描述。处理器中的高速缓冲存储器单元维护影象块条目,以指示对应页包含计数信息。可以提供不同映射和不同级别的支持。
在可替换实施例中,编译器分配工作区域来维护计数,并且指示将这些工作区域置于其生成的数据区域中。元数据中的条目可以表示数据的开始、数据的字节数、数据的粒度、计数区域的开始和每个计数单元的粒度。在任何情况下,将元数据装载到处理器中,并且处理器向其内部(影象)高速缓冲存储器填充元数据。在修改指令流本身来包含元数据的实施例中,装载器更新指令流以包含适当的指示符和工作区域,或者编译器生成了代码来包含元数据。在任一种情况下,在装载了代码之后,处理器接收元数据。
数据单元2206可以作为图2中的数据高速缓冲存储器206实现。在本例中,每当访问数据2208时,都递增计数器2210。数据2208和计数器2210均处于特定存储器位置中。在这些例子中,可以采用新指令,其中,该指令称作ReadDataAccessCount(RDAC),其接受(take)数据地址和寄存器,并且将与该数据地址相关联的计数置于该寄存器中。
指令执行和数据访问这些事件中的每一个都导致计数器的递增。本发明的机制提供接口,即硬件接口2212来访问所收集的这一数据。在这些例子中,硬件接口2212采取用于操作系统2214的应用程序编程接口(API)的形式。这样,分析工具2216可以从计数器2204和计数器2210获得数据。
虽然图22中的例子示出向指令单元和数据单元提供接口,但是也可以实现硬件接口2212来提供对来自处理器中的其它单元的信息的访问。例如,可以为允许访问位于性能监测器单元的计数器,如图2的性能监测器单元240的计数器241和242中的信息的硬件接口2212创建API。
在图23中,示出了根据本发明优选实施例的用于自主修改程序代码以允许对代码部分进行选择性计数或概略的组件的方框图。在本例中,概略器2300是可以用来识别程序如程序2302中具有高使用率的例程的程序,如tprof。在这些例子中,“tprof”是定时器概略器,其捆绑(ship)在来自国际商业机器(IBM)公司的高级交互性执行体(AIX)操作系统上。该程序采集由定时器启动的样本。当定时器结束时,tprof识别所执行的指令。tprof是可以用于系统性能分析的CPU概略工具。该工具基于包括以下步骤的采样技术通过时间或性能监测器计数器周期性地中断系统;随同进程id(pid)和线程id(tid)一起确定被中断代码的地址;记录软件跟踪缓冲器中的TPROF钩子(hook);并且返回到被中断代码。
或者,可以使用性能监测器计数器的固定数目的计数来代替定时器。该程序概略用来指示在程序内何处花费了时间的子例程。使用率超过特定阈值的程序也称作“热点(hot)”。通过使用来自概略器2300的信息,可以识别感兴趣的例程,如程序2302中的子例程2304。
采用该信息,可以由分析工具2306自主修改子例程2304中的指令,以允许对子例程2304的执行进行计数。可以识别另外的例程以由分析工具2306进行修改。例如,还可以识别子例程2304为感兴趣的例程,并修改该例程的指令以允许对子例程2304的执行进行计数。对这些例程中的代码的修改包括将性能指示符与这些子例程的每一个内的一条或多条指令相关联。
在由分析工具2306修改了这些例程中的指令之后,由处理器2308执行程序2302。处理器2308执行程序2302并且为这些例程提供计数。例如,对所执行的指令和执行例程时所用周期数的计数可以使用上述机制由处理器2308执行。
参照图24,其示出了根据本发明优选实施例的用于动态地将性能指示符添加到指令或使其与指令关联的过程的流程图。图24所示的过程可以在诸如图23的分析工具2306的程序中实现。
该过程以使用来自概略器的数据识别感兴趣的指令(步骤2400)开始。该概略器可以例如是AIX中见到的定时器概略器。从识别出的指令中选择指令以作修改(步骤2402)。然后,将性能指示符动态添加到所选指令(步骤2404)。
在步骤2404,可以以无需为执行而修改指令的方式添加指令。可以采用性能检测影象存储器,如图15中的性能检测影象存储器1506来保存性能指示符。在这种情形下,设置处理器中的寄存器以指示当执行指令时应检查性能检测影象存储器以获得性能指示符。
然后,确定是否存在另外的所识别指令要修改(步骤2406)。如果存在另外的指令要修改,则该过程返回到步骤2402。否则,该过程终止。
接下来参照图25,其示出了根据本发明优选实施例的用来通过将性能指示符与页内的指令相关联而扫描页的组件的图。本发明的机制使用性能指示符来允许每次一页地检测(instrument)或修改程序中的指令。
在本例中,程序2500包含三页,即页2502、页2504和页2506。扫描守护进程(daemon)2508每次一页或多页地将性能指示符与程序2500中的指令相关联。例如,页2502中的指令可以通过扫描守护进程2508与性能指示符相关联。然后,由处理器2510执行程序2500。然后,可以收集来自执行程序2500的数据。该数据包括例如对响应页2502中的指令而发生的事件的计数,从而对执行页2502中的每条指令的次数进行计数,和/或识别对页2502的访问次数。
接下来,扫描守护进程可以从页2502内的指令中去除性能指示符,并且将性能指示符与页2504中的指令相关联。然后,由处理器2510再次执行程序2500,并且收集来自对该程序的执行的数据。然后,可以在所执行的程序2500中修改页2506中的指令,以收集有关该页的数据。
以这种方式,可以识别诸如定时器概略器的程序通常不记录的对例程的使用。由于中断可能被禁止,或者样本的定时可能产生同步非随机行为,因此定时器概略器可能不记录对例程的某些使用。通过修改程序2500中的指令,可以获得对例程或其它模块的计数,其中,计数是无偏差的,并且系统是不受干扰的。以这种方式,避免了中断驱动的计数。此外,虽然对代码的检测是每次一页,但是在扫描程序时也可以使用指令的其它编组,例如形成程序的模块。例如,编组可以是单个可执行程序、库、一组选定函数和一组选定页。
接下来参照图26,其示出了根据本发明优选实施例的用于将指示符添加到页内指令的过程的流程图。图26所示的过程可以在诸如图25的扫描守护进程2508的程序中实现。
首先,识别页的选择范围(selection)(步骤2600)。在本例中,这些页是程序中所要扫描或检测的那些页。接下来,选择页的选择范围中的一页以作修改(步骤2602)。然后,将指示符与选定页内的所有指令相关联(步骤2604)。然后执行程序(步骤2606)。接下来,确定是否扫描了选择的所有页(步骤2608)。如果扫描了所有页,则该过程随后终止。然而,如果并非所有的页都已被扫描,则选择要扫描的下一页(步骤2610),并且该过程返回到如上所述的步骤2604。
图26所示的过程示出所扫描的作为页的指令编组。根据具体实现,可以以这种方式扫描或检测其它类型的指令分组,例如形成程序的模块。
采用程序来根据调用堆栈中找到的信息从例程中识别调用者。该程序通过识别已进行的函数调用,允许识别在例程中发生了什么,并且提供对在程序中发生了什么的总结。然而,该程序需要将指令插入代码中以获得该信息。
本发明的机制允许识别调用和返回,而不必执行特别的代码检测。具体地说,可以使用对特定指令集产生中断的函数来收集有关系统和应用程序的信息。在这些例子中,调用和返回的指令与产生中断的性能指示符相关联。
通过向上回巡(walk back)调用堆栈,可以获得完整的调用堆栈以作分析。“堆栈漫步(stack walk)”也可以被描述为“堆栈展开(stack unwind)”,而“漫步堆栈”的过程也可以被描述为“展开堆栈”。这些术语中的每一个阐明了对该过程的不同比喻。当该过程必须逐步或逐帧地获得和处理堆栈帧时,该过程可以被描述为“漫步”。当该过程必须获得和处理指向彼此的堆栈帧时,该过程也可以被描述为“展开”,而这些指针及其信息必须通过很多指针解除引用(dereference)来“展开”。
堆栈展开遵循响应与性能指示符相关联的指令的执行而产生中断时的函数/方法调用顺序。调用堆栈是例程加上在程序执行期间进入的例程(即模块、函数、方法等)内的偏移的有序列表。例如,如果例程A调用例程B,然后例程B调用例程C,而处理器正在执行例程C中的指令,则调用堆栈为ABC。当控制从例程C返回到例程B时,调用堆栈为AB。为了在所生成的报告内表达更简洁和易于解释起见,提供例程的名称而没有任何偏移信息。偏移可以用于对程序执行进行更详细的分析,然而,这里不进一步考虑偏移。
因此,在通过执行与特定性能指示符关联的指令而启动的中断处理期间或后处理时,所生成的基于样本的概略信息反映调用堆栈的采样,而不是如同某些程序计数器采样技术中一样仅仅为可能调用堆栈的叶子(leaf)。叶子是分枝末端的节点,即没有后代的节点。后代是父节点之子,而叶子是无子节点。
现在参照图27,其是示出根据本发明优选实施例的包含多个堆栈帧的调用堆栈的图。“堆栈”是保留存储器区域,其中一个或多个程序存储状态数据,如过程和函数调用地址、所传递参数,并且有时还有局部变量。“堆栈帧”是线程堆栈的一部分,其表示单个函数调用的局部存储(自变量、返回地址、返回值和局部变量)。每一个活动的执行线程具有为其堆栈空间分配的一部分系统存储器。线程堆栈由堆栈帧序列组成。线程堆栈上的帧集在任何时候都表示该线程的执行状态。由于堆栈帧典型地是相互链接的(例如,每个堆栈帧指向前一堆栈帧),因此经常有可能往回跟踪堆栈帧序列,并且形成“调用堆栈”。调用堆栈表示所有尚未完成的函数调用——换句话说,它反映任何时间点的函数调用序列。
调用堆栈2700包括标识正在运行的例程、调用其的例程等等一直到主程序的信息。调用堆栈2700包括多个堆栈帧2702、2704、2706和2708。在所示例子中,堆栈帧2702位于调用堆栈2700的顶部,而堆栈帧2708位于调用堆栈2700的底部。调用堆栈的顶部也称作“根”。修改(大多数操作系统中见到)的中断,以获得被中断线程的程序计数器值(pcv)以及指向该线程的当前活动堆栈帧的指针。在英特尔架构中,这典型地由寄存器的内容EIP(程序计数器)和EBP(指向堆栈帧的指针)来表示。
通过访问当前活动的堆栈帧,有可能利用(典型的)堆栈帧链接约定,以便将所有帧链在一起。标准链接约定的一部分还规定函数返回地址正好放在被调用函数的堆栈帧之上;这可以用来确定被调用函数的地址。虽然本讨论采用基于英特尔的架构,但是本例不是限制。大多数架构采用可以类似地由修改的概略中断处理程序导航的链接约定。
当发生中断时,所获取的第一参数是程序计数器值。下一个值是指向被中断线程的当前堆栈帧的顶部的指针。在所示例子中,该值将指向堆栈帧2708中的EBP 2708a。EBP 2708又指向堆栈帧2706中的EBP 2706a,而EBP 2706a又指向堆栈帧2704中的EBP 2704a。该EBP又指向堆栈帧2702中的EBP2702a。标识调用例程的返回地址的EIP 2702b-2708b位于堆栈帧2702-2708内。可以根据这些地址来识别这些例程。因此,通过向上或向后漫步堆栈而收集所有返回地址来定义例程。
在某些情况下获得完整的调用堆栈可能是困难的,因为环境可能使跟踪困难,例如,当具有一个调用堆栈的应用程序对具有不同调用堆栈的内核进行调用时。由本发明的机制提供的硬件支持避免了这些问题中的某些问题。
接下来参照图28,其示出了根据本发明优选实施例的用于识别与调用和返回指令相关联的事件的过程的流程图,其中从性能监测器单元收集数据。图28所示的过程也可以在分析工具,如图22的分析工具2216中实现。
该过程以识别调用和返回指令(步骤2800)开始。调用和返回的指令是用于确定何时调用了例程和何时例程完成的感兴趣指令。这可以为中断、中断返回、系统调用和从系统调用返回而实现。
接下来,将性能指示符与所识别的调用和返回指令相关联(步骤2802)。然后执行程序(步骤2804),并且从性能监测器单元收集数据(步骤2806),然后该过程终止。该信息可以通过接口,如图22所示的硬件接口2212来收集,其中,采用API来获得由处理器中的不同功能单元收集的数据。
利用该数据,可以进行例程调用者的识别。该信息可以用来产生诸如树的数据结构,以跟踪和呈现有关程序执行的信息。数据结构的生成可以使用类似于在分析工具中提供的过程来实现。
接下来参照图29,其示出了根据本发明优选实施例的用于识别已被执行多于选定次数的例程的过程的流程图。图29所示的过程可以在处理器内的功能单元,如图2的指令高速缓冲存储器214中实现。该过程用来识别对被执行指令的计数,并且当这些指令出现次数多于某选定次数时产生中断。
首先,确定是否检测到对选定指令的执行(步骤2900)。通过检查每条被执行的指令来执行该确定操作,以查看性能指示符是否与该指令相关联。这些性能指示符可以通过不同工具,如图15中的编译器1500或图22中的分析工具2216与该指令相关联。
如果没有识别出对包含性能指示符的指令的执行,则该过程返回到步骤2900,直到检测出选定指令。如果选定指令被识别为正在执行,则为该选定指令递增具有设定阈值的计数器,以对执行该特定指令的频度进行计数(步骤2902)。在这些例子中,为被标识以进行监测的每条指令分配计数器。
接下来,确定是否达到设定阈值(步骤2904)。对于每一个高速缓冲存储器级,起初通过使用文档化高速缓冲存储器未中次数来确定阈值。然而,增加次数用来确定因高速缓冲存储器干扰(来自其它处理器的访问)引起的问题。可以以不同值重复运行,以识别具有最差性能的区域。
在这些例子中,指令可以与包括要监测对指令的执行并提供计数器的指示的指示符相关联。此外,可以包括计数标准来识别何时要产生中断。例如,当指令被执行多于十三次时,可以产生中断。
如果尚未达到阈值,则该过程返回到如上所述的步骤2900。如果达到了设定阈值,则将中断发送到监测程序(步骤2906),然后该过程终止。该中断可以被发送到中断单元,如图2中的中断单元250,这将控制传到适当的过程或进程以处理中断。
该过程可能尤其有用于具有很多分支的例程。在这种情况下,将标志所有分支指令以进行计数。通过这种计数而获得的信息可能有用于通过使分支最少化、或调整在所用处理器的指令架构中支持的提示(hint)标志来识别对编译器和即时(just-in-time-JIT)代码生成的改进。
接下来参照图30,其示出了根据本发明优选实施例的、用于当特定指令被执行的次数多于某选定次数时,检查调用堆栈并识别例程的调用者的过程的流程图。图7所示的过程可以由中断单元如图2中的中断单元250启动。该过程用来识别例程中的调用,并且可以用来递归获得调用者的信息。
首先,检查调用堆栈,并且识别例程的调用者(步骤3000)。接下来,从指令高速缓冲存储器捕获对被执行指令的计数(步骤3002)。该计数对应于图29的步骤2902中所用的计数器。然后,复位计数器(步骤3004),随后从中断返回控制(步骤3006)。可以使用在图30的过程中获得的信息来识别另外的要监测的例程,以递归识别例程的调用者。
接下来参照图31,其是示出根据本发明优选实施例的、为进行监测而选择的指令和数据的范围的图。在本例中,程序3100包括指令范围3102和3104。这些范围中的每一个均被识别为所要监测的感兴趣范围。这些范围中的每一个均设在诸如图2的指令高速缓冲存储器214的指令单元内。每个范围由处理器用来在程序3100的执行期间,对在范围内执行的指令数以及进入范围的次数进行计数。
指令高速缓冲存储器3106使用范围寄存器3108来定义指令范围。这些寄存器可以是现有寄存器,或者可以修改指令高速缓冲存储器3106来包括定义指令范围的寄存器。这些范围可以基于指令地址。另外,范围寄存器3108可以由各种调试器程序和性能工具更新。
如果在诸如指令范围3102或指令范围3104的范围内执行指令,则在指令高速缓冲存储器3106中递增计数器。或者,可以发送指令到性能监测器单元,如图2中的性能监测器单元240。在这些例子中,性能监测器单元跟踪对该范围内执行的指令数和进入该指令范围的次数的计数。
数据访问可以以类似方式监测。例如,数据3112包括数据范围3114。可以以与指令范围3102或指令范围3104内的指令执行类似的方式对数据范围3114的数据访问进行计数。这些范围可以定义在诸如图2的数据高速缓冲存储器216的数据单元内的寄存器中。这些数据范围可以作为数据的存储器位置的范围定义在寄存器中。
接下来参照图32,其示出了根据本发明优选实施例的、用于对设定范围的访问次数以及在设定范围内执行的指令数进行计数的过程的流程图。图32所示的过程可以在诸如图2的指令高速缓冲存储器214的指令单元中实现。
首先,识别所要执行的指令(步骤3200)。接下来,确定指令是否在设定的指令范围内(步骤3202)。该范围可以通过检查定义一条或多条指令范围的寄存器来识别。如果指令不在设定的指令范围内,则该过程返回到如上所述的步骤3200。如果该指令在设定的指令范围内,则确定前一指令是否在设定范围内(步骤3204)。如果前一指令不在设定的指令范围内,则递增访问计数器,以告诉处理器已进入该指令范围多少次(步骤3204)。另外,递增执行计数器,以对在设定的指令范围内执行的指令数进行计数(步骤3206),然后该过程终止。
回到步骤3204,如果前一指令在设定的指令范围内,则该过程进入如上所述的步骤3208。
可以对数据访问实现类似于图32所示的过程。在这种情况下,该过程将典型地在数据单元而非指令单元中实现。
如上所述,对于通过本发明的计数机制以及与指令/数据地址相关联的性能指示符而提供的硬件协助,存在很多可能的应用。下面描述旨在提供本发明的另外实施例,其中以不同方式利用上述性能指示符和计数机制,以实现关于计算机程序的改进概略能力。可以单独地或者以各种组合利用上述和下述实施例而不脱离本发明的精神和范围。
上下文切换需要更新指针以指向适当的元数据。上下文可以从一个线程改变到另一个线程,或者从一个例程改变到另一个例程或库。这些控制的转移中的任一个可以具有新的上下文。作为调用序列的一部分而设置的寄存器可以包括指示新影象高速缓冲存储器数据的寄存器。
如上面关于图13、14和29所述,本发明的性能指示符和计数器可以用来确定指令被执行、数据地址被访问、例程被执行等的次数。另外,可以确定指令、数据区域或例程是否被执行/访问多于阈值次数,以便确定是否执行随后操作。在本发明的另外实施例中,这些机制用来确定高速缓冲存储器或存储器内的热点,以便改善由本发明的机制概略的计算机程序的性能。
也就是,计算机程序的指令和/或数据区域、高速缓冲存储器或存储器通过以前述方式添加性能指示符来检测。当指令/数据区域访问的计数超过设定阈值时,这可以表示高速缓冲存储器或存储器的“热点”区域,即与其它区域相比消耗相对更大处理器时间量的区域。
图33是当确定高速缓冲存储器/存储器的热点时本发明一个示例性实施例的主要操作单元的示例性方框图。采用本发明的所示实施例,当响应检测到与指令/数据地址或区域相关联的性能指示符(PI)而递增高速缓冲存储器3320或存储器的指令3312或者数据地址或地址范围的计数器3310时,例如,在图29的步骤2900-2904中,确定该计数是否超过预定阈值。如果超过预定阈值,则发送中断到监测程序3330(参见图29的步骤2906)。
采用本发明的本实施例,当接收到中断时,监测程序3330的中断处理程序3332识别该中断,并且确定该指令与高速缓冲存储器或存储器的热点区域相关联。确定该指令所在的例程/方法为热点。结果,识别被确定为热点的例程/方法的指令的高速缓冲存储器或存储器地址。
中断处理程序3332将与位于该例程/方法的高速缓冲存储器/存储器地址的这些指令相关联的元数据拷贝到被指定以由分析引擎3350使用的存储位置3340,从而分析元数据以确定该例程/方法的优化方案。例如,元数据可被存储到跟踪文件中以用于以后的跟踪分析。在计算机程序的概略期间可以继续以这种方式检测热点。如果相同区域被再次检测为热点区域,则可以用该热点指令/数据区域的元数据的新版本更新存储区域中的信息。
然后,例如在对在概略计算机程序执行期间所获得的跟踪数据进行后处理的期间,可以分析热点的元数据,以确定可以用来提高计算机程序性能的性能改善方法。例如,热点内的特定指令可被识别为与其它指令相比被执行更频繁。然后,可以修改例程/方法的代码,使得优化这些指令的执行。
例如,如果与其它指令相比被执行更多的热点例程/方法内的指令与特定分支相关联,则可以通过重新组织这些指令以实现代码流的连续执行来优化代码。也就是,可以通过减少推测性处理量来节省计算周期,这是通过重新组织例程的指令,使得更频繁地采用分支的代码被重新装配成以与热点例程/方法的其它指令更连续的方式执行的一组指令,从而减少代码流分支和高速缓冲存储器未中的数量。
在本发明的另一个实施例中,确定与热点相关联的高速缓冲存储器或存储器地址的范围,并且将与这些高速缓冲存储器或存储器地址相关联的指令/数据拷贝到热点影象数据结构3360。生成高速缓冲存储器3320或存储器中的旧地址到热点影象数据结构3360中的新地址的映射。该映射可以通过与旧存储器地址位置相关联的指针、映射表3370等实现。然后,当尝试对旧地址的访问时,将访问尝试映射到新数据结构。或者,可修改代码本身,使得将访问旧地址的指令改变成访问热点数据结构中的新地址。
通过将高速缓冲存储器的热点安置在影象数据结构3360中,热点数据被集中安置。这允许减少否则将需要的高速缓冲存储器刷新和提取。结果,节省了机器周期。如果多个处理器为不同数据共享相同高速缓冲存储器线,则处理器访问可以分离出数据。这将再次防止频繁的高速缓冲存储器刷新,从而节省机器周期。而且,在某个点,所有地址都将被映射到高速缓冲存储器或影象高速缓冲存储器数据结构。这将导致更快的存储器访问。
其它根据热点检测优化代码的方法在本技术领域内一般是公知的。本发明可利用任何公知的热点优化技术。公知的热点优化技术与本发明的主要区别之一是本发明根据前述性能指示符和计数器识别热点。
图34是概述当识别高速缓冲存储器或存储器中的指令/数据热点时,本发明实施例的示例性操作的流程图。如图34所示,该操作以采用前述方式监测计算机程序的执行(步骤3400)开始。该监测涉及递增采用性能指示符检测的指令/数据地址的硬件计数器。在监测计算机程序执行期间的某个时间,指令被执行或者数据地址被访问多于阈值次数,并且发送中断到性能监测应用程序。由性能监测应用程序接收该中断(步骤3410),并且根据计数器和设定阈值识别热点(步骤3420)。
也就是,根据存储在与这些指令/数据地址相关联的计数器中的值,识别以前述方式采用性能指示符检测且被访问多于阈值次数的高速缓冲存储器或存储器的那些指令地址/数据地址。根据计算机程序代码识别与其计数器值超过预定阈值的这些被检测指令相关联的例程/方法。然后,识别高速缓冲存储器或存储器中这些例程/方法的指令/数据地址。
将与识别出的热点的这些指令/数据地址相关联的元数据拷贝到由性能监测应用程序指定的存储位置,如跟踪数据文件(步骤3430)。确定是否要执行对计算机程序执行的继续监测(步骤3440)。如果是,则该操作返回到步骤3400。如果否,则执行对在性能监测期间获得的数据的后处理(步骤3450)。
作为该后处理的一部分,分析存储在指定存储位置中的热点元数据,以确定可以如何优化热点元数据的处理(步骤3460)。也就是,可以识别该元数据的特征,并且将其与不同优化技术相关联的优化标准进行比较。然后,可以选择最佳优化技术,并且可以修改代码/数据存储,以实现所选优化技术(步骤3470)。然后,该操作终止。
如上所述,代码/数据存储的优化可以采取很多不同形式。在一些情况下,代码优化可以包括重新装配代码中的指令,以提供热点与计算机程序中的其它指令的连续执行。图35示出该方法。如图35所示,识别与热点相对应的高速缓冲存储器地址范围(步骤3500)。然后,重新装配这些指令,以提供热点的连续执行(步骤3510)。可以重新装配指令和数据以提供热点的连续访问的方法的例子参见名称为“Method for Optimizing Computer Code to ProvideMore Efficient Execution on Computers Having Cache Memories(优化计算机代码以提供具有高速缓冲存储器的计算机的更有效执行的方法)”的美国专利No.5,212,794、以及名称为“Profile-Based Optimizing Post-Processors for DataReferences(用于数据引用的基于概略的优化后处理器)”的美国专利No.5,689,712,在此将其全都引作参考。
图36示出优化代码执行的可替换方法。如图36所示,通过将热点移动到专用影象数据结构并且映射对旧高速缓冲存储器或存储器地址的访问、以进入影象数据结构中的新地址,可以优化代码。
如图36所示,该操作以识别对应于热点的高速缓冲存储器地址范围(指令或数据)(步骤3600)开始。然后,创建热点影象数据结构(步骤3610)。然后,将来自识别出的高速缓冲存储器或存储器地址的指令/数据拷贝到热点影象数据结构中的新地址(步骤3620)。建立从当前高速缓冲存储器或存储器地址到影象数据结构中的新地址的映射(步骤3630),并且该操作终止。然后,当存在对已被映射到新影象数据结构的高速缓冲存储器或存储器地址的访问时,将该访问重定向到新影象数据结构中的新地址。该映射可以通过每当访问旧数据区域时产生中断来实现。然后,中断处理程序可以修改访问旧数据区域的代码,使得它现在将访问新数据区域。
因此,本发明以及前述实施例提供了可以使用性能指示符、硬件计数器和设定阈值识别高速缓冲存储器或存储器内的热点的实施例。另外,本发明提供了可以根据热点检测来优化代码和/或数据存储的实施例。
在本发明的另一实施例中,可以以更复杂的方式使用性能指示符和计数器,以确定何时要发送中断到监测应用程序的中断处理程序以作处理。也就是,本发明的先前实施例是按照计数器值单独地用作确定是否发送中断到监测应用程序的中断处理程序的基础来描述的。因此,例如,当与特定指令、指令范围、数据地址或数据地址范围相关联的一个计数器超过给定阈值时,可以发送中断到监测应用程序的中断处理程序,从而如前所述执行热点检测处理。
在本发明的另一实施例中,可以利用计数器值的算术组合来确定是否要发送中断到监测应用程序的中断处理程序。性能监测器单元可以周期性地检查预定计数器组的计数器值,并且以在性能监测器单元的微代码中指定的算术方式组合它们,以确定是否存在需要发送中断到监测应用程序的条件。
图37是示出当执行计数器值的算术组合以确定是否发送中断到监测应用程序时本发明的示例性实施例的示例图。如图37所示,在执行其执行正被监测的程序的计算装置的处理器的硬件3700,如图2的性能监测器单元240的计数器241和242中,提供计数器3720和3740以及寄存器3710、3730和3750。寄存器3710维持与由性能监测应用程序传送到性能监测单元的值相对应的寄存器值X。计数器3720维持与在性能监测期间遇到的第一性能指示符相对应的计数A。寄存器3730维持与由性能监测应用程序传送到性能监测器单元的另一值相对应的另一个寄存器值Y,并且计数器3740维持在性能监测期间的第二性能指示符的计数B。
寄存器3750存储为了确定是否发送中断而将值X、Y、A和B的算术组合与其比较的阈值Z。在本发明中,性能指示符可以与指令或部分数据相关联。例如,性能指示符可以与指令高速缓冲存储器、数据高速缓冲存储器或存储器中的地址,即指令地址或数据地址相关联。
周期性地,或者当发生事件例如计数器3720或3740中的一个增1时,性能监测器单元的微代码3760对照寄存器3750的阈值Z检查计数器3720、3740和寄存器3710、3730的当前值X、Y、A和B。根据由监测应用程序传给性能监测器单元的信息,识别为了确定是否产生中断而要组合其值的特定计数器3720、3740和寄存器3710、3730。也就是,监测应用程序在初始化时可以向性能监测器单元通知要随同特定寄存器值一起组合与特定类型的指令、指令范围、数据地址或数据地址范围相关联的计数器,并且将其与特定阈值进行比较。另外,监测应用程序可以向性能监测器单元指示要组合计数器和寄存器值的方式。然后,可以将该信息存储在性能监测器单元中,以在组合计数器值以确定是否要产生中断时使用。或者,性能监测器单元可以用总是将被检查的计数器和寄存器的特定组合来硬编码。
例如,性能监测应用程序可以与初始化硬件中的计数器的设备驱动程序接口。性能监测应用程序可以向设备驱动程序通知要对什么进行计数,例如指令、高速缓冲存储器未中、存储器访问等,要使用什么阈值,当满足或超过阈值时要执行的代码部分的向量,例如指针,以及其它各种控制信息。另外,通过设备驱动程序,性能监测应用程序可以为原始计数器值设置乘数,即寄存器值,以便放缩由每个计数器计数的事件等。然后,设备驱动程序可以在硬件中设置适当的位和寄存器值,以表示要组合哪些计数器以及要与哪些寄存器值比较。例如,可以使用位掩码等来识别要组合哪些计数器和寄存器以及要组合这些计数器的方式。
一旦设备驱动程序初始化了基本事件计数器和组合事件计数器,就启动计算机程序的执行。每次递增基本计数器时,硬件将根据基本计数器值和乘数,即寄存器值来更新组合计数器,并且检查是否达到或超过阈值。当达到或者超过任何阈值时,硬件可以启动中断,并且将控制传送到性能监测应用程序的中断处理程序。此时,中断处理程序执行,以执行期望操作。例如,可以将事件记录到性能监测应用程序缓冲器或日志中,可以向日志守护进程通知发生了事件等。
微代码3760通过首先产生计数器值的算术组合以产生组合计数器值来执行指定计数器的检查。可以将组合计数器值存储在组合计数器或寄存器中,然后可以将其与存储在寄存器3750中的值进行比较,以确定是否存在预定关系。
在所示例子中,将寄存器3710的值X乘以计数器3720的值A,并且将寄存器3730的值Y乘以计数器3740的值B。然后,相加这些操作的乘积以产生等于X*A+Y*B的组合计数器值。然后,将组合计数器值与寄存器值Z进行比较,以确定其是否大于Z。如果否,则继续性能监测而不产生中断。如果组合计数器值大于Z,则发送中断到监测应用程序以作处理。
因此,例如,性能监测应用程序可以向处理器通知对特定例程感兴趣,并且要监测该例程中的每个指令的周期数,并且将其用作确定是否要产生中断的基础。例如,可以确定当每个指令的周期数大于3时,应产生和发送中断。
在本例中,当确定是否发送中断时,可以将计数器值与用于对指令数和处理器周期数进行计数的例程相关联。3的乘数值可以存储在第一寄存器中,并且-1的乘数值可以存储在第二寄存器中。可以将阈值指定为零,并且将其存储在阈值寄存器中。通过组合寄存器值和计数器而获得的结果方程式可以为以下类型3*指令数-1*周期数>0当满足该关系时,每个指令的周期数大于3,因此产生并发送中断。例如,每当递增指令计数器的数值或者递增周期计数器的数值时,可以检查该关系。因此,不是仅仅检查以查看指令数是否大于预定数或者周期数是否大于预定数,根据本实施例的计数器值组合允许更复杂的条件,其中经过放缩的被执行指令数和经过放缩的周期数的组合用作确定是否产生中断的基础。
虽然图37示出了与单个寄存器值比较的两个计数器值和两个寄存器值的特定示例性组合,但是本发明不限于此。相反,通过在性能监测器单元的微代码3760内建立适当的组合,可以进行计数器和寄存器值的任何组合。而且,可以比较计数器和寄存器值的各种组合与各种寄存器值,而不脱离本发明的精神和范围。本发明的此实施例的主要概念是本发明能够以任何适合方式组合多个性能监测器计数器和寄存器值以确定是否产生中断。
图38是概述当组合计数器和寄存器的值以确定是否应产生中断时本发明的示例性操作的流程图。如图38所示,该操作以接收阈值、乘数值以及要评测的指令/数据地址的范围的标识(步骤3800)开始。将阈值和乘数值存储在寄存器中,并且初始化指令/数据地址的计数器(步骤3810)。根据性能指示符监测指令执行/数据地址访问并且必要时递增关联计数器(步骤3820)。然后,确定是否要检查计数器值(步骤3830)。如果否,则该操作返回到步骤3820,并且继续监测计算机程序的执行。
如果要检查计数器值,则随同阈值和乘数值一起检索指定范围的指令/数据地址的计数器值(步骤3840)。然后,算术组合计数器值和寄存器值,并且将结果与阈值进行比较(步骤3850)。然后,确定是否满足或超过阈值(步骤3860)。如果否,则该操作返回到步骤3820以继续监测计算机程序的执行。如果满足或超过阈值,则产生中断并将其发送到监测应用程序以作处理(步骤3870)。然后,该操作终止。可以重复步骤3810-3870,直到对计算机程序执行的监测完成为止。
因此,在本发明的此另外实施例中,可以使用计数器值和寄存器值的算术组合来确定何时发送中断到监测应用程序。这样,可以选择更复杂的条件作为确定何时要产生中断的基础。
在本发明的另外实施例中,在性能监测应用程序中提供用于根据主要度量的计数器值启动关于所识别的指令、数据地址、所识别指令的范围、或者所识别数据地址的范围的次级度量的测量的功能性。因此,例如,当初级度量计数器或初级度量计数器的组合满足或超过预定阈值时,可以产生中断。响应于接收到该中断,可以启动与测量一定范围的指令/数据地址的次级度量相关联的计数器。这样,可以使用初级度量性能计数器识别特定感兴趣的区域,并且通过使用涉及测量与特定感兴趣区域相关联的度量的次级度量性能计数器获得更详细的信息。
采用该示例性实施例,以前述方式利用性能指示符和计数器检测存储器、高速缓冲存储器等中的指令/数据地址,并且对其进行初始化。以前面关于遇到性能指示符并且递增计数器值讨论过的方式,监测计算机程序的性能。利用性能指示符和关联计数器监测的度量被认为是初级度量,即起初为进行监测而检测计算机程序的度量。如前所述,可以将这些计数器值与阈值进行比较,以确定是否发生了特定状态,例如,对例程的进入多于预定次数。
当计数器值与阈值的比较导致满足或超过阈值时,产生中断。性能监测应用程序的中断处理程序接收该中断,并根据所接收的中断执行适当的处理。
在本发明的本实施例中,该处理可以包括利用性能指示符检测相同或其它指令/数据地址,并且初始化用于对次级度量进行计数的计数器。对指令/数据地址的检测包括以例如用来对上述初级度量检测指令/数据地址的方式、与所识别的指令/数据地址相关联地存储性能指示符。在一个示例性实施例中,如上所述,这可以包括例如将性能指示符存储在影象高速缓冲存储器数据结构中。
根据具体实现,可以确定为监测次级度量而要检测的其它指令/数据地址。例如,性能监测应用程序的中断处理程序可被编程,使得当响应于超过阈值而接收中断时,在与其计数器值超过阈值的指令相关联的例程内,可以通过与指令地址相关联地存储性能指示符来检测特定类别的指令。然后,当性能监测通过从中断处理程序返回而继续时,该例程内最新检测类别的指令将以前面关于初级度量计数器所述的方式,开始累积对这些指令执行的计数。
例如,如前所述,已利用性能指示符检测的指令/数据地址的计数器值可以用作识别正被监测的计算机程序内的“热点”的机制。也就是,例如,进入例程的次数可以用作确定该例程是否是“热点”的手段,即该例程是否相对于其它代码部分使用更多计算周期。在确定例程是否是热点时,可以将进入例程的次数计数的计数器值与为了识别热点而设定的阈值进行比较。如果满足或超过该阈值,则认为该例程为热点。
采用本发明的本实施例,还可以在例程内检测该热点,以确定哪些感兴趣的指令是“热点”例程内的“热点”。或者,次级度量可以是这样的测量,即在计算机程序的执行期间例程被识别为热点多少次,即在计算机程序的执行期间与例程相关联的计数器值超过为热点定义的阈值多少次。可以以类似的方式启动其它次级度量,而不脱离本发明的精神和范围。
因此,根据本发明的此实施例,可以利用第一组计数器测量初级度量并且利用第二组计数器测量次级度量来进行不同粒度级别的度量测量。当然,根据前面度量测量超过阈值启动测量新度量的能力可以扩展到甚至进一步的迭代,而不仅仅止于初级度量集和次级度量集。
图39是概述根据本发明此实施例的、当根据初级度量的性能计数器值启动次级度量的监测时,本发明的示例性操作的流程图。如图39所示,该操作以接收中断(步骤3900)开始。例如,可以响应于根据初级度量的计数器超过阈值产生中断而接收中断。例如,所接收的中断可以是在图13的步骤1308、图29的步骤2906、图38的步骤3870等产生的。
响应于接收到中断,确定是否已经启动指令/数据地址或相关指令/数据地址的次级度量(步骤3910)。如果否,则启动次级度量的监测(步骤3920)。该步骤包括确定要利用性能指示符检测哪些与激发了中断的指令/数据地址相关联的指令/数据地址,并且与识别出的指令/数据地址一起存储性能指示符。如前所述,确定哪些指令/数据地址与激发了中断的指令/数据地址相关联是特定于具体实现的,并且可以以任何适合方式执行。可以以与前面关于为初级度量存储的性能指示符所述类似的方式,执行识别出的指令/数据地址的实际检测。
然后,启动与次级度量的性能指示符相关联的计数器(步骤3930)。然后,或者如果对于激发了中断的指令/数据地址已经启动了次级度量的监测(步骤3910),则根据计算机程序的执行递增次级度量的计数器(步骤3940)。前面已作过与性能指示符相关联递增计数器的描述。
然后,确定次级度量的计数器值是否超过阈值(步骤3950)。如果是,则可以发送中断到性能监测应用程序的中断处理程序(步骤3960)。这可导致重复图39所示的操作,在此情况下,初级度量现在是次级度量,并且次级度量将是第三级度量等。然后,该操作终止。
因此,采用本发明的此实施例,起初可以以第一粒度执行计算机程序执行的性能监测,以识别感兴趣的区域。一旦根据初级度量的监测识别出这些感兴趣的区域,就可在计算机程序的执行期间、对于识别出的感兴趣区域动态检测计算机程序。该动态检测包括检测与识别出的感兴趣区域相关联的指令/数据地址,并且在这些感兴趣区域内启动次级度量的监测。因此,通过利用根据本发明的性能指示符、基于硬件的计数器和阈值,采用可以以其监测计算机程序的粒度的动态修改是可实现的。
在本发明的另外实施例中,性能指示符和计数器值可以用作识别高速缓冲存储器命中和高速缓冲存储器未中的机制。采用该实施例,性能指示符与计算机程序中选定例程或感兴趣代码部分的指令相关联。例如,如上面关于图17、24和26所述,性能指示符可以与指令/数据地址相关联,并且可以存储在指令/数据、性能指示符影象高速缓冲存储器404或其它类型的元数据数据结构内。
每当执行利用性能指示符检测的例程或代码部分的指令时,递增性能计数器。也就是,如前所述,当指令被执行或者数据地址被访问,并且它具有关联性能指示符时,性能监测器单元递增影象高速缓冲存储器、性能监测器单元等中的计数器。另外,如上面关于图8所述,当发生高速缓冲存储器未中、并且必须将指令或指令块重载到高速缓冲存储器中时,可以发送信号到性能监测器单元。当性能监测器单元接收到信号时,可以使用影象高速缓冲存储器、性能监测器单元等中的计数递增表示在指令或代码部分上发生高速缓冲存储器未中的次数的计数器。根据表示执行指令的次数和发生高速缓冲存储器未中的次数的这些计数器的值,可以确定高速缓冲存储器命中-未中率。
高速缓冲存储器命中-未中率可以存储在与高速缓冲存储器相关联的元数据数据结构中。当高速缓冲存储器命中-未中率变得小于预定阈值时,即高速缓冲存储器未中次数大于高速缓冲存储器命中次数时,可以发送中断到性能监测应用程序,从而表示出现了问题状态。然后,与性能监测应用程序相关联的中断处理程序可以通过启动用来处理中断的适当支持来处理中断。或者,可以周期性地通过采样方法检查该信息来确定该状态。
如上所述,对该小高速缓冲存储器命中-未中率的一个贡献者可以是“追尾”状态。当指令/数据块必须被装载到高速缓冲存储器中、但是在高速缓冲存储器中没有足够可用空间来存储整个指令/数据块时,发生“追尾”状态。在这种情况下,将指令/数据写入到高速缓冲存储器中的可用空间,并且在高速缓冲存储器的最近最少使用部分上写入任何溢出。这可导致被覆写的指令/数据上的高速缓冲存储器未中(miss),从而增多高速缓冲存储器未中的次数,导致更多的高速缓冲存储器重载以及更多的对高速缓冲存储器中的指令/数据的覆写。
为了避免该“追尾”状态,本发明采用响应于确定出高速缓冲存储器命中-未中率降在阈值之下而激发的支持,其存储指令/数据,使得在高速缓冲存储器中将被覆写的指令/数据保持在高速缓冲存储器中,并且正被重载的指令/数据存储在高速缓冲存储器的专用或保留部分中。在一个示例性实施例中,该支持可以包括在模式寄存器,如模式寄存器1510中设置表示处理器要遵循“追尾”操作的模式位。
该“追尾”操作可以包括在高速缓冲存储器上处理重载操作时,确定高速缓冲存储器是否有足够的可用空间来存储要被重载到高速缓冲存储器中的指令/数据块。如果在高速缓冲存储器中存在可用空间,则以正常方式将指令/数据块存储在高速缓冲存储器中。然而,如果在高速缓冲存储器中没有足够的空间来存储要被重载的指令/数据块,则将指令/数据块或指令/数据块的至少溢出部分装载到高速缓冲存储器的保留部分中,而不是将指令/数据重载到高速缓冲存储器的非保留区域中、并且覆写已经存在于高速缓冲存储器的非保留区域中的指令/数据。
另外,可以将性能指示符与指令块相关联,从而表示当再次执行该指令块中的指令时,或者当再次访问数据地址块中的数据地址时,处理器应当在高速缓冲存储器的保留区域中查找该指令/数据。如同上述其它性能指示符一样,这些性能指示符可以在性能指示符影象高速缓冲存储器中、与指令或代码部分本身等一起存储。
写入指令/数据块或者指令/数据块的至少溢出部分的高速缓冲存储器专用或保留部分本身可以通过本发明的随后操作而被覆写。然而,可以利用单独的算法来确定如何覆写高速缓冲存储器保留部分中的指令/数据。例如,可以对高速缓冲存储器的保留部分采用最近最少使用的算法来确定要覆写高速缓冲存储器保留部分中的哪些指令/数据。该方案允许推测性地向高速缓冲存储器的保留部分装载新数据,并且仍然允许访问最近装载到高速缓冲存储器保留区域中的数据。
或者,当要覆写高速缓冲存储器保留区域的一部分时,在确定如何处理指令/数据的重载时可以利用更复杂的算法,其中比较高速缓冲存储器保留区域和高速缓冲存储器非保留区域中的指令/数据。例如,当确定重载操作将导致高速缓冲存储器保留区域中的指令/数据被覆写时,可以比较高速缓冲存储器保留区域和高速缓冲存储器非保留区域中最近最少使用的指令/数据。高速缓冲存储器中的哪个部分有最近未被使用的最旧指令/数据,就可确定该部分为重载操作将装载指令/数据的区域。其它类似类型的确定可以通过对覆写高速缓冲存储器的非保留和保留区域中的指令/数据的影响进行加权来进行。
因此,通过当高速缓冲存储器命中-未中率低于预定阈值时调用本实施例的“追尾”操作,本发明通过使不能被高速缓冲存储器非保留部分中的可用空间容纳的指令/数据的任何重载存储在高速缓冲存储器的保留部分中、而不是覆写高速缓冲存储器非保留部分中的现有高速缓冲存储器条目,避免了“追尾”情形。这样,可以避免关于因覆写高速缓冲存储器非保留部分中最近最少使用的条目而引起的覆写和重载的多米诺效应。而且,由于指令/数据块被保证存储在高速缓冲存储器的保留区域中,因此高速缓冲存储器命中-未中率将升高至阈值之上。
图40是概述当用来调用处理器的“追尾”操作时本发明的示例性操作的流程图。图40中的流程图可以在指令高速缓冲存储器中实现,然而本领域的技术人员通过下面描述应当清楚,对于数据高速缓冲存储器,也可执行类似的操作。
如图40所示,该操作以接收对要从高速缓冲存储器或存储器检索的指令块的请求(步骤4010)开始。确定指令块中的指令是否具有关联性能指示符(步骤4020)。如果是,则递增与具有性能指示符的指令相关联的计数器(步骤4030)。
确定指令块是否存在于指令高速缓冲存储器中(步骤4040)。如果否,则执行将指令块重载到高速缓冲存储器中,并且执行这些指令(步骤4050)。
另外,响应于重载操作,递增指令高速缓冲存储器的重载计数器(步骤4060)。使用指令计数器的值和重载计数器的值来确定高速缓冲存储器命中-未中率(步骤4070)。然后,将高速缓冲存储器命中-未中率与由性能监测应用程序设定的阈值进行比较(步骤4080)。
然后,确定高速缓冲存储器命中-未中率是否满足或低于阈值(步骤4090)。如果是,则发送中断到性能监测应用程序的中断处理程序,以便启动处理器的“追尾”操作(步骤4095)。如果否,或者如果指令块不包括具有性能指示符的指令,则该操作终止。该操作可以针对每个从高速缓冲存储器请求的指令块而重复。
图41是概述根据本发明的、当在处理器内执行“追尾”操作时本发明的示例性操作的流程图。同样,该流程图是按照指令高速缓冲存储器来描述的,然而,本领域的普通技术人员应当容易地理解图41的操作也适用于数据高速缓冲存储器。
如图41所示,该操作以接收表示指令高速缓冲存储器的高速缓冲存储器命中-未中率满足或降到设定阈值之下的中断(步骤4110)开始。然后,设置处理器的模式寄存器中的模式位(步骤4120)。然后,该操作等待处理器执行重载操作(步骤4130)。
确定处理器是否执行重载操作(步骤4140)。如果否,则该操作返回到步骤4130,并且继续等待重载指令。如果处理器执行重载操作,则确定指令高速缓冲存储器是否有足够的可用空间来装载指令块,而无需覆写已经存在于高速缓冲存储器中的指令(步骤4150)。如果是,则以正常方式执行重载操作(步骤4160)。如果否,则将指令块存储在高速缓冲存储器的保留部分中(步骤4170)。然后,将性能指示符与指令块相关联,从而表示在随后执行指令块中的指令时,应当从高速缓冲存储器的保留部分中检索指令(步骤4180)。然后,该操作结束。
因此,采用本发明的此实施例,可以使用性能指示符和计数器来确定高速缓冲存储器命中-未中率何时降至或低于预定阈值,从而表示计算机程序执行的问题。另外,本发明的此实施例包括处理器在操作的“追尾”操作模式下工作的能力,其中处理器的微代码确定是否可以执行高速缓冲存储器的随后重载,而不覆写高速缓冲存储器非保留部分中的现有条目。如果否,则可以向高速缓冲存储器的保留部分写入需要写入高速缓冲存储器的条目,并且可以将性能指示符与这些条目的指令/数据相关联,从而表示处理器应当在专用高速缓冲存储器中查找这些指令/数据。
应当注意,虽然上面实施例是按照向专用存储器或高速缓冲存储器区域写入整个指令/数据块来描述的,但是本发明不限于此。相反,在一些示例性实施例中,可以向高速缓冲存储器非保留部分写入与高速缓冲存储器非保留部分中的可用空间相同大小的指令/数据块的一部分,同时向高速缓冲存储器保留部分写入剩余部分,即溢出。在该实施例中,引导处理器至高速缓冲存储器保留部分的性能指示符将仅与写入到高速缓冲存储器保留部分的指令/数据块内的那些指令/数据相关联。
作为本发明的优点的例子,考虑数据的重复顺序读取。如果正被读取的块长得足以使高速缓冲存储器溢出,则在该读取的第二迭代中,有可能已从高速缓冲存储器逐出块首数据,并且必须重载它。高速缓冲存储器数据的这一重载将从高速缓冲存储器逐出更多数据(可能就紧邻在读取其之前)。这样,该重复读取有可能根本未从高速缓冲存储器获得好处。
采用在此描述的本发明,数据的某部分占用高速缓冲存储器的稳定部分,并且块的其余部分溢出到较不稳定的溢出区域中。因而,在随后读取时,块首数据仍然可用于高速缓冲存储器的稳定部分中而无需重载。只有超出高速缓冲存储器范围的块部分才必须在随后读取时被重载。
对于四个处理器在四个独立代码块上工作、其中高速缓冲存储器仅大得足够支持这些块中的三个块的情况,可以获得类似的优点。本发明允许系统识别该状态,并且将这些指令块中的(例如)两个块分裂成高速缓冲存储器的(易失的)溢出区域,而保留这些块中的两个块在高速缓冲存储器的稳定部分中不受干扰。
在本发明的另外实施例中,可以利用本发明的性能指示符来获得关于指令或数据高速缓冲存储器内的高速缓冲存储器命中和高速缓冲存储器线重载的性质的信息。例如,本发明的这些实施例可以用来确定多处理器系统,如对称多处理器(SMP)系统的处理器是否真正共享高速缓冲存储器线,或者是否存在假高速缓冲存储器线共享。然后,可以使用该确定作为用于确定如何更佳存储高速缓冲存储器线的指令/数据、以防止高速缓冲存储器线的假共享的手段。
假高速缓冲存储器共享是高速缓冲存储器以比系统处理器大的粒度工作的结果。也就是,处理器在高速缓冲存储器线内的单独指令/数据区域例如指令/数据块上工作。然而,高速缓冲存储器在高速缓冲存储器线粒度上工作。因此,如果存在对高速缓冲存储器线的任何部分的任何改变,并且接收到对高速缓冲存储器线的另一部分的访问请求,则在允许访问请求之前必须重载高速缓冲存储器线。
这可导致这样的情况,其中系统的一个处理器向高速缓冲存储器线的第一区域写入,而第二处理器从高速缓冲存储器线的第二区域读取数据,其中高速缓冲存储器线的第二区域未被向高速缓冲存储器线第一区域的写入修改,但是在允许访问第二区域之前,作为整体的高速缓冲存储器线必须被重载。因此,即使第二区域内的数据或指令尚未被向第一区域的写入修改,从而读取可被完成,而不必重载高速缓冲存储器线,但是由于高速缓冲存储器的工作粒度,因此高速缓冲存储器线被重载。这导致由于必须处理高速缓冲存储器线的重载而造成的性能下降。
这经常称作假高速缓冲存储器线共享或“脏”高速缓冲存储器命中。能够识别何时在高速缓冲存储器中存在这种情形将是有益的。本发明的实施例提供了用于识别这种情形的机制。
采用本发明的这些实施例,利用性能指示符和处理器写和读标志检测高速缓冲存储器线内的各个指令/数据区域或代码部分。性能指示符和/或处理器写和读标志可以与其指令/数据区域相关联地存储在高速缓冲存储器线本身中,也可以存储在性能指示符影象高速缓冲存储器或者其它元数据数据结构中。性能指示符以与上面关于本发明的前面实施例所述类似的方式工作。
采用本发明的本实施例,当发生对指令/数据区域的访问请求时,确定是否存在与指令/数据区域相关联的性能指示符。如果是,识别发出访问请求的处理器,即多处理器系统的哪个处理器正在从高速缓冲存储器的指令/数据区域读取,或者向其写入。在优选实施例中,访问请求包括标识从其接收访问请求的处理器的首标信息或元数据。根据该信息,可以确定哪个处理器发送了访问请求。
然后,设置与高速缓冲存储器线中的指令/数据区域相关联、且与识别出的处理器相关联的处理器访问标志位。根据访问请求是读还是写,设置读处理器访问标志位或写处理器访问标志位。也就是,通过性能指示符检测的每个指令/数据区域或代码部分对于与其相关联的多处理器系统的每个处理器都具有读处理器访问标志位和写处理器访问标志位,并且将这些标志位存储在高速缓冲存储器线的对应部分中。
当指令/数据区域被写入,并且指令/数据区域具有关联性能指示符时,设置与发送了写访问请求的处理器相对应的写处理器访问标志位。类似地,当指令/数据区域被读取,并且指令/数据区域具有关联性能指示符时,设置与发送了读访问请求的处理器相对应的读处理器访问标志位。这样,可以确定哪些处理器向哪些指令/数据区域进行了写入,哪些处理器从哪些指令/数据区域进行了读取,以及高速缓冲存储器线的重载是由于处理器之间的真高速缓冲存储器线共享、还是假高速缓冲存储器线共享。
当例如由于对高速缓冲存储器线的区域的访问请求而要执行高速缓冲存储器线的重载,但是先前已执行过对高速缓冲存储器线的改变时,产生中断并将其发送到性能监测应用程序的中断处理程序。中断处理程序获得正被重载的高速缓冲存储器线的指令/数据区域的写和读处理器访问标志位值。然后,比较这些写和读处理器访问标志位的值,以确定是否发生了假高速缓冲存储器线共享。也就是,确定是否存在由至少一个处理器向同一高速缓冲存储器线中的数据区域写入、并且正在由另一个处理器访问不同的数据区域。当相同数据区域由一个处理器写入、然后由一个或多个其它处理器访问时,发生真高速缓冲存储器线共享。
图42是根据本发明示例性实施例的数据高速缓冲存储器的一部分的示例性方框图。虽然图42示出数据高速缓冲存储器4200,但是应当理解,相同机制可以应用于指令高速缓冲存储器,而不脱离本发明的精神和范围。
如图42所示,每个数据区域4210-4260具有关联写标志位4270-4280和读标志位4290-4299。虽然写标志位4270-4280和读标志位4290-4299被示出为与其相应的数据区域4210-4260相关联地存储在数据高速缓冲存储器4200中,但是本发明不限于此。相反,写标志位4270-4280和读标志位4290-4299可以存储在性能指示符影象高速缓冲存储器或数据高速缓冲存储器4200之外的其它元数据数据结构中,而不脱离本发明的精神和范围。
如前所述,可以向数据区域4210-4260中的全部或特定区域提供根据本发明的性能指示符。这些性能指示符可以存储在数据区域4210-4260、写标志位区域4270-4280、读标志位区域4290-4299、独立的性能指示符影象高速缓冲存储器或其它元数据数据结构中。
当处理器处理对数据区域的访问请求时,处理器确定是否存在与数据区域相关联的性能指示符。如果是,则发送中断到中断单元,其使性能单元工作以确定哪个处理器发送了访问请求。然后,确定访问请求是读访问请求还是写访问请求,并且设置与数据区域相关联的读或写标志位区域中的适当读或写标志位,以表示处理器向数据区域进行了写入。因此,例如,如果访问请求是对数据区域4210的写入,并且数据区域4210具有关联性能指示符,则可以针对发送了访问请求的处理器设置写标志位区域4270中的写标志位。
图43是根据本发明一个示例性实施例的写标志位区域的示例性方框图。虽然图43示出写标志位区域,但是应当理解,对于每个指令/数据区域,也可存在类似的读标志位区域。
如图43所示,写标志位区域4300包括用于多处理器系统的每个处理器的写标志位4310-4340。因此,例如,写标志位4310用于第一处理器P1,写标志位4320用于第二处理器P2,写标志位4330用于第三处理器P3,并且写标志位4340用于处理器Pn。这些写标志位4310-4340可以与其关联数据/指令相关联地存在于高速缓冲存储器线的一部分中,也可以存在于影象高速缓冲存储器数据结构或其它元数据数据结构中。这些写标志位4310-4340可以响应于确定出对应处理器P1-Pn向与写标志位区域4300相关联的数据区域进行了写入而设置。在响应于高速缓冲存储器线的重载而执行本发明的处理之后,可以对这些写标志位4310-4340进行复位、页面调出至存储器等。
可以为读访问请求提供类似的结构和功能性。也就是,可以提供在结构上与写标志位区域4300类似的读标志位区域,其中响应于为特定处理器处理读访问请求而设置读标志位。在根据本发明处理高速缓冲存储器线的重载操作之后,可以对这些读标志位区域进行复位、页面调出等。
图44是概述当处理对高速缓冲存储器线区域的访问请求时本发明一个示例性实施例的示例性操作的流程图。如图44所示,该操作以识别要监测的感兴趣高速缓冲存储器的区域(步骤4400)开始。为识别出的要监测的高速缓冲存储器区域中的每一个设置性能指示符(步骤4410)。然后,对每个感兴趣的高速缓冲存储器区域启动(initiate)写和读标志位(步骤4420)。也就是,在关联写标志位区域和读标志位区域中,向每个感兴趣的高速缓冲存储器区域提供写标志位和读标志位,其中多处理器系统的每个处理器对应于一个写标志位和读标志位。
然后,处理器监测对高速缓冲存储器的访问(步骤4430)。对于每个高速缓冲存储器访问请求,确定对高速缓冲存储器的访问是否引用以性能指示符检测的高速缓冲存储器区域(步骤4440)。如果否,则该操作以正常方式处理访问请求,然后进入步骤4480,以确定是否通过返回步骤4430来继续监测对高速缓冲存储器的访问。
如果访问请求引用具有关联性能指示符的高速缓冲存储器区域,则识别发出了该访问请求的处理器(步骤4450)。然后,确定访问请求是否是写访问请求(步骤4460)。如果访问请求是写访问请求,则设置高速缓冲存储器区域和所识别处理器的适当写标志位(步骤4470)。如果访问请求不是写访问请求,则它必定是读访问请求。结果,设置高速缓冲存储器区域和所识别处理器的适当读标志位(步骤4475)。然后,确定是否要执行高速缓冲存储器访问请求的继续监测(步骤4480)。如果是,则该操作返回到步骤4430。如果否,则该操作终止。
图45是概述当处理高速缓冲存储器线的重载时、本发明示例性实施例的示例性操作的流程图。如图45所示,该操作以检测高速缓冲存储器线的重载(步骤4500)开始。该检测可以例如通过处理器检测高速缓冲存储器线重载中断正由中断处理程序处理来执行。然后,启动高速缓冲存储器线的重载(步骤4510)。然后,该操作终止。
图46是概述当处理例如在图45的操作中产生的高速缓冲存储器线重载中断时,本发明示例性实施例的示例性操作的流程图。如图46所示,该操作以启动高速缓冲存储器线的重载(步骤4600)开始。然后获得正被重载的高速缓冲存储器线的区域的写位标志和读位标志值(步骤4610)。
然后,确定对于正被当前访问请求访问的高速缓冲存储器区域、其它处理器(即不同于发送了启动高速缓冲存储器线重载的访问请求的处理器的处理器)是否设置了写标志位和/或读标志位(步骤4620)。该确定基本上是确定重载是否可能是由于另一个处理器先前已经向正被访问的相同数据区域进行了写入,这是真高速缓冲存储器线共享的指示。如果是,则确定重载是由于不同处理器向正被访问的高速缓冲存储器区域进行了写入,因此高速缓冲存储器线由系统的处理器真正共享(步骤4630)。
如果其它处理器先前未向正被当前访问请求访问的高速缓冲存储器区域写入,则确定是否为高速缓冲存储器线的其它数据区域设置了任何其它处理器的写标志位或读标志位(步骤4640)。如果是,则确定多处理器系统的其它处理器访问了高速缓冲存储器线的其它区域,但是未访问正被当前处理器访问的高速缓冲存储器线的区域。这是假高速缓冲存储器线共享的指示。结果,确定重载是由于假高速缓冲存储器线共享(步骤4650)。如果没有为高速缓冲存储器线的任何其它区域设置其它处理器的写入或读标志位,则确定高速缓冲存储器线的重载是由于真高速缓冲存储器线共享(步骤4630)。
可以输出高速缓冲存储器线重载的确定基础的指示,以用于性能分析(步骤4660)。然后,重载高速缓冲存储器线,并且可以复位写标志位和读标志位(步骤4670)。然后,该操作终止。
虽然上述实施例示出了本发明对高速缓冲存储器线的每次重载执行假高速缓冲存储器线共享的检查,但是本发明不限于此。相反,在可替换实施例中,可以周期性地执行假高速缓冲存储器线共享的检查。也就是,在计算机程序运行了预定时间量之后,可以执行检查,以查看是否存在假高速缓冲存储器线共享。该检查的周期性可以与自从前次对假高速缓冲存储器线共享的检查以来的预定执行时间量、诸如确定出特定一个或多个线程不再活动的事件的发生等相关联。
另外,虽然本发明是按照当重载操作的处理完成时、复位读和写标志位来描述的,但是本发明不限于此。作为复位读和写标志位的替代或补充,本发明可以将读和写标志位的值页面调出(page out)到存储器,以便保存读和写标志位状态的副本,以作以后处理。
因此,本发明的机制提供了监测高速缓冲存储器线内的性能的能力。更具体地说,本发明的机制允许识别高速缓冲存储器线的重载是由于多处理器系统的处理器之间的真或假高速缓冲存储器线共享。
真或假高速缓冲存储器线共享的确定可以有益于确定数据和指令存储在高速缓冲存储器中的方式。也就是,如果确定高速缓冲存储器线被假共享,因此经常由于第一处理器向未由第二处理器访问的高速缓冲存储器线区域写入而执行高速缓冲存储器线重载,则可采取适当的措施以最小化假高速缓冲存储器线共享的数量。
例如,在本发明的另外实施例中,当使用上述机制确定出高速缓冲存储器线被假共享时,则可产生中断,并且将其发送到性能监测应用程序。性能监测应用程序的中断处理程序将识别该中断是表示假高速缓冲存储器线共享。不是以正常方式重载高速缓冲存储器线,而是可以将正被访问的数据或指令写入到专用于避免假高速缓冲存储器线共享的独立存储器区域。
然后,可以通过插入指向该高速缓冲存储器或存储器的新区域的指针来修改代码。因此,当代码再次试图访问该高速缓冲存储器区域时,将该访问重定向到此存储器区域、而非遭受假共享的先前高速缓冲存储器区域。这样,可以避免高速缓冲存储器线的重载。
图47是概述本发明示例性实施例的示例性操作的流程图,其中移动被识别为假共享的高速缓冲存储器区域以避免假共享。如图47所示,该操作以接收例如可以根据图46的操作而产生的中断(步骤4600)开始。为遭受假共享的高速缓冲存储器区域分配专用高速缓冲存储器或存储器区域的一部分(步骤4710)。然后,向新的专用高速缓冲存储器或存储器区域写入高速缓冲存储器区域中的数据/指令(步骤4720)。然后,在正被监测的计算机程序的代码中存储指向该新专用高速缓冲存储器或存储器区域的指针(步骤4730)。然后,该操作结束。
因此,通过在图46和47中概述的机制的操作,可以修改高速缓冲存储器中的指令/数据的存储,以避免假高速缓冲存储器线共享,从而最小化在计算机程序执行期间所执行的高速缓冲存储器线重载的数量。这样,可以提高计算机程序的性能。
上面对本发明各个实施例的描述集中于使用性能指示符、计数器、标志等,以提供有关执行指令、访问数据区域等的方式的信息。可以使用有关计数器值、根据计数器值和标志值所作的确定等来注解在计算机程序执行的跟踪期间由性能监测应用程序获得的性能概略(简档)数据。该带注解的性能概略数据在下面简称作性能概略数据,它可以被存储到性能概略数据存储区域,以用于分析计算机程序的性能。
在本发明的另外实施例中,编译器可以随同计算机程序的指令/数据一起获得该性能概略数据,并且使用该信息来优化执行计算机程序、存储指令/数据等的方式。也就是,编译器可以优化应用程序和指令/数据存储,以便优化应用程序的运行时间组件。
编译器优化计算机程序的运行时间方面的方式可以根据所获得的特定性能概略数据而不同,其中特定性能概略数据通过使用前述性能指示符、计数器、标志等而获得的输出来注解。该优化可以是优化指令路径、优化在初始应用程序装载中所花的时间、利用高速缓冲存储器和存储器的方式等。下面只是可以根据通过性能指示符、计数器、标志等而获得的信息优化计算机程序的运行时间方面的示例方式,并且并不旨在以任何方式限制本发明的应用。
作为编译器可以根据性能概略数据而优化计算机程序的运行时间组件的方式的第一例子,首先将描述对高速缓冲存储器中的指令/数据存储的优化。例如,本发明的机制已被描述为包括可以检测假高速缓冲存储器线共享的实施例。如上所述,可以识别该假高速缓冲存储器线共享,并且可以输出假高速缓冲存储器线共享的指示以作以后的分析。可以输出该指示并将其存储在性能概略数据中,并且该指示可以由编译器用来确定是否需要在高速缓冲存储器中存储数据/指令的可替换方案。
也就是,在一个示例性实施例中,编译器可以根据性能概略数据确定在计算机程序的执行中存在假高速缓冲存储器线共享的问题,因此应当以最少化高速缓冲存储器线共享的方式在存储器中安排指令/数据。例如,编译器可以确定相互隔开64字节写入指令/数据块。这样,向每个指令/数据块分配64字节的高速缓冲存储器区域,并且保证指令/数据块位于64字节高速缓冲存储器中的独立高速缓冲存储器线上。因此,每条高速缓冲存储器线仅被系统的一个处理器访问,并且消除了假高速缓冲存储器线共享。
在编译器可以如何优化计算机程序的运行时间组件的另外例子中,性能概略数据可能指示与其它执行路径相比更频繁地遵循特定执行路径。也就是,在分支指令处,采取相同的执行路径往往大于50%的时间。这可以例如根据如前所述的热点检测等来确定。根据所获得的性能概略数据,编译器可以在将计算机程序代码编译成可执行代码时,确定以使更频繁地被执行的路径处于与分支指令邻接的分支处。也就是,分支检查可被重新排序,使得它们更连续。
或者,可以向编程人员提供关于可以如何优化代码的信息,使得编程人员可以离线执行这些优化。因此,不是实际上修改代码或者数据或指令在高速缓冲存储器中的存储,而是可以向编程人员提供关于可以优化计算机程序的运行时间组件的方式的建议,以用于修改代码或者计算系统的操作。然后,编程人员可以决定是否实现所建议的优化。
在根据性能概略数据检测出可能的优化时,可以自动完成可由编译器执行或者由编译器建议的优化。或者,编译器可以向编程人员提供表示识别出的可执行的优化的告警,并且允许编程人员选择要执行的优化。例如,可以提供图形用户界面,其包括采用复选框和虚拟按钮的优化列表,通过这些复选框和虚拟按钮允许编程人员选择要执行的特定优化,然后通过编译器启动这些优化。或者,优化可以完全取决于编程人员,这样,本发明仅向编程人员提供可能优化的告警,并且将其留给编程人员来决定是否实际上实现这些优化。
图48是概述当优化应用程序执行时本发明示例性实施例的示例性操作的流程图。如图48所示,该操作以获得应用程序的带注解性能概略数据(步骤4800)开始。该性能概略数据使用本发明的性能指示符、计数器、标志等从计算机程序执行的跟踪中获得。
然后,获得计算机程序的代码(步骤4810),并且确定可以根据性能概略数据执行代码编译以优化计算机程序执行的方式(步骤4820)。然后,可以通过一个或多个图形用户界面向编程人员呈现这些优化(步骤4830)。然后,接收由系统编程人员选择的优化(步骤4840),并且使用所选优化来编译代码(步骤4850)。然后,该操作结束。当然,如上所述,可以自动执行优化而无需联系编程人员。
虽然上述实施例是按照单个性能概略数据源来描述的,但是本发明不限于此。相反,可以将来自多个源的性能概略数据编译成可用来优化计算机程序编译的单个性能概略数据集。例如,可以将来自多个客户的计算机程序执行的各个跟踪编译成单个性能概略数据集,以便在一次计算机程序编译优化中就解决在不同客户平台上执行计算机程序的各种问题。
因此,利用本发明的机制,使用本发明各个实施例的性能指示符、计数器、标志等的结果可以用来优化计算机程序的编译,以便获得计算机程序的最佳运行时间执行。
本发明的上述实施例是按照性能指示符存储在指令本身、性能指示符影象高速缓冲存储器中等来描述的。而且,上述实施例是按照计数器是硬件计数器来描述的。本发明不限于这些实施例。在本发明的另外实施例中,可以使用页表元素来存储性能指示符和/或事件计数。
页表是存储器中的数据结构,其提供将虚拟存储器地址映射到物理存储器地址、从而允许程序存储器的虚拟化的手段。页是可以将属性(例如,只读、读/写,可高速缓存)与其相关联的存储器块。当要从存储器检索指令或数据时,处理器使用存储在页表中的值,以将由程序指定的地址(例如,由装载指令算出的地址或下一顺序指令的地址)转换成物理存储器中期望位置的物理地址。由于必须参考页表来将每个程序地址转换成物理地址,因此页表是存储性能指示符和/或事件计数的理想地方。
图49示出根据本发明示例性实施例的、使用页表将由程序指定的存储器地址转换成物理地址的数据流的示例性方框图。如图49所示,使用指定活动地址空间的各种手段之一,通过地址空间寄存器4920将(数据或指令的)程序地址4910转换成虚拟地址。处理器使用所得到的虚拟地址在页表4930中搜索页表4930中匹配虚拟地址的页描述符。匹配页描述符的内容共同包含与虚拟页相关联的物理地址和属性。这些内容用来将虚拟地址转换成物理地址,并且确定页的属性(例如,访问权限)。
在本发明的另外实施例中,扩展页表以包括每个条目的附加字段,用于存储性能监测结构,如性能指示符、事件计数、阈值、对应感兴趣页内的地址范围等。当进程访问页表以执行虚拟到物理页地址映射时,可以查询这些附加字段,检索来自这些字段的值,并且根据导致访问页表的特定事件更新这些字段中的值。
或者,为了避免任何性能下降,可以在类似于转换后备缓冲器(TLB)或有效到真实地址转换缓冲器(ERAT)的处理器资源中,高速缓存这些字段中的性能指示符信息。例如,可以提供性能指示符后备缓冲器(PILAB),其中可以高速缓存在页表的上面字段中提供的虚拟到真实地址转换信息和性能指示符信息。当接收到指令或数据地址访问请求时,可以在PILAB中执行程序或虚拟地址的查找,以获得地址转换信息和性能指示符信息。如果在PILAB中不存在程序或虚拟地址,则可参考页表,以获得该信息。
图50示出根据本发明示例性实施例的示例性页表条目。如图50所示,页表条目5000包括用于存储虚拟页地址的字段5010,用于存储物理页地址的字段5020、以及用于存储性能监测结构的附加字段5030-5060。这些性能监测结构是由性能监测应用程序用于确定跟踪下的计算机应用的性能的结构。这些性能监测结构可以包括例如性能指示符、事件计数器、阈值、感兴趣页内的地址范围等。这些附加字段5030-5060的值可以根据由性能监测应用程序提供给性能监测单元的信息、由性能监测单元设置。
例如,以如上所述性能指示符与指令和/或部分数据相关联的类似方式,性能指示符可以与页表内的这些指令和/或数据部分相关联。因此,当确定指令或数据部分是否具有关联性能指示符时,可以使用指令或数据部分的虚拟地址来识别页表中的条目,并且可以检查存储在附加字段5030和5040中的值,以查看性能指示符是否与物理页或物理页的一部分相关联。也就是,如果与虚拟地址相关联的偏移落在字段5040中标识的偏移范围内,并且字段5030中存储有性能指示符,则与虚拟地址相对应的指令具有关联性能指示符。
类似于上述硬件计数器,字段5050可以用来存储事件计数,并且当发生特定事件时可被递增。例如,在高速缓冲存储器未中导致计数器递增的上述实施例中,作为物理计数器的替代或补充,计数字段5050可以用来存储该计数。因此,例如,当必须从物理存储中检索指令或数据的部分时,参考页表以识别指令或数据的部分的物理存储位置。同时,可以查询字段5030-5060,并且可以递增字段5050中的计数器值,其表示必须从物理存储中提取页、并且将其装载到存储器或高速缓冲存储器中的次数。
字段5060可以用来存储用于确定何时发送中断到性能监测应用程序的中断处理程序的阈值信息。如上所述,当发生导致在页表中被访问字段5030-5060的事件时,可以将计数字段5050或多个计数字段5050中的值与存储在字段5060中的阈值进行比较,以确定是否满足或超过阈值。如果是,则可产生中断,并且将其发送到性能监测应用程序的中断处理程序。
应当理解,虽然图50仅示出单个用于存储性能指示符的字段、单个用于存储计数的字段、单个用于存储阈值的字段、以及单个用于将偏移范围存储到页内的字段,但是本发明不限于此。相反,可以使用任何数目的、与物理页相关联的、用于存储多个性能指示符、阈值、事件计数、偏移范围等的字段,而不脱离本发明的精神和范围。
图51是概述当使用扩增式页表来存储性能监测结构时本发明的示例性操作的流程图。如图51所示,该操作以通过对与性能监测应用程序感兴趣的指令/数据相对应的条目设置页表的性能指示符字段中的值,来初始化页表(步骤5110)开始。另外,可以初始化与页表条目的各个字段中的阈值和计数器值相关联的阈值、偏移范围(步骤5120)。然后,开始计算机程序的执行和执行的监测(步骤5130)。
确定是否发生需要访问物理存储的事件(步骤5140)。如果是,则确定是否设置了用于虚拟地址的页表条目中的性能指示符字段(步骤5150)。如果是,则对于虚拟地址偏移落在其内的偏移范围,递增一个或多个计数器字段值(步骤5160)。
然后,可以将该一个或多个计数器字段值与页表条目的阈值字段中的对应阈值进行比较(步骤5170)。然后,可以确定该一个或多个计数器字段值是否满足或超过阈值(步骤5180)。如果满足或超过任一个阈值,则可产生中断,并且将其发送到性能监测应用程序的中断处理程序(步骤5190)。
当然,与此操作并行,执行从物理存储地址位置检索指令/数据。然后,确定是否要终止该操作(步骤5195)。如果否,则该操作返回到步骤5140;否则,该操作终止。
因此,在本发明的此另外实施例中,不是需要独立的数据结构或硬件装置,而是本实施例允许扩展已经存在的页表,以包括用于存储性能监测结构的附加字段。由于要由性能监测应用程序监测的很多事件与物理存储的访问有紧密的联系,因此使用页表存储这些性能监测结构提供了侵入性更小的解决方案,以帮助性能监测应用程序确定计算机程序的执行性能。
因此,本发明提供了一种用于在监测程序执行并使用通过监测程序的执行而获得的信息来优化程序执行时提供协助的改进方法、设备和计算机指令。本发明的机制包括采用由处理器识别以使得能够对与指示符关联的指令的执行进行计数的指示符。通过该机制使得能够进行如上所述的各种计数。此外,采用通过利用指示符与特定指令的关联而提供的信息,本发明的机制还提供在监测和分析程序性能中对程序的各种调整。此外,如上所述,可以自动调整程序,以允许监测选定指令乃至例程和模块,而不必修改程序。
值得注意的是,虽然本发明是在全功能数据处理系统的上下文中描述的,但是本领域的普通技术人员应当理解,本发明的过程能够以指令的计算机可读介质的形式和各种形式来分发,并且本发明与实际上用来执行分发的信号承载介质的具体类型无关地同等适用。计算机可读介质的例子包括诸如软盘、硬盘驱动器、RAM、CD-ROM、DVD-ROM的可记录型介质,和诸如数字和模拟通信链路、采用各种传输形式例如射频和光波传输的有线或无线通信链路的传输型介质。计算机可读介质可以采取为在特定数据处理系统中实际使用而译码的编码格式的形式。
本发明的描述是为了示例和描述的目的而提供的,而不旨在穷尽或者将本发明限定于所公开的形式。对于本领域的普通技术人员而言,很多修改和变动将是显然的。例如,代替使用指令中或指令包中的字段,可以使用新指令或操作码来指示后续的指令,或后续的指令集是被标记指令。此外,在希望在指令的字段内包括性能指示符的情况下,如果用于性能指示符的空闲字段不可用,则可以改变处理器的架构来包括附加位。此外,虽然给出了诸如指令执行的事件、诸如时钟或处理器周期的执行指令所需的时间、访问数据、进入到代码部分中的时间的例子,但是这些例子并不旨在将本发明限定于可被计数的事件的类型。可以使用本发明的机制对任何与指令的执行或对存储器位置的访问有关的事件进行计数。
选择和描述这些所示实施例是为了最佳地说明本发明的原理、实际应用,并使得本领域的其它普通技术人员能够理解本发明,从而设计出适于具体应用的带有各种修改的各种实施例。
权利要求
1.一种用于在数据处理系统中执行指令的方法,包括将计算机程序的一条或多条指令与一个或多个性能指示符相关联;在页表的一个或多个性能指示符字段中存储所述一个或多个性能指示符;与所述一个或多个性能指示符中的对应性能指示符相关联地为所述一条或多条指令启动所述页表中的一个或多个计数器字段;以及根据在页表的性能指示符字段中指令是否具有关联性能指示符,在计算机程序指令执行期间递增所述一个或多个计数器字段中的值。
2.如权利要求1所述的方法,其中在指令执行期间递增所述一个或多个计数器字段中的值包括确定是否发生了与存储在所述一个或多个性能指示符字段中的性能指示符相关联的事件;以及如果发生了所述事件,则递增所述一个或多个计数器字段中对应计数器字段中的值。
3.如权利要求1所述的方法,其中所述事件是高速缓冲存储器未中。
4.如权利要求1所述的方法,还包括与所述一个或多个性能指示符字段和所述一个或多个计数器字段相关联地在页表的一个或多个阈值字段中存储一个或多个阈值。
5.如权利要求4所述的方法,还包括当发生事件时,将所述一个或多个计数器字段中的一个或多个值与所述一个或多个阈值字段中的阈值进行比较;以及如果存在所述一个或多个计数器字段中的所述一个或多个值与所述阈值之间的预定关系,则产生中断。
6.如权利要求1所述的方法,还包括接收对代码部分或数据部分的访问请求,其中所述访问请求包括代码部分或数据部分的虚拟地址的标识符;将所述虚拟地址转换成代码部分或数据部分在存储装置中的存储位置的真实地址;通过使用所述真实地址访问代码部分或数据部分;以及在访问代码部分或数据部分期间确定是否发生了事件,其中响应于确定在访问代码部分或数据部分期间发生了事件,执行所述一个或多个计数器字段中的值的递增。
7.如权利要求1所述的方法,其中将计算机程序的一条或多条指令与一个或多个性能指示符相关联包括将所述一个或多个性能指示符与页表中所述一条或多条指令的虚拟和真实地址相关联。
8.一种计算机可读介质中的计算机程序产品,用于在数据处理系统中执行指令,包括第一指令,用于将计算机程序的一条或多条指令与一个或多个性能指示符相关联;第二指令,用于在页表的一个或多个性能指示符字段中存储所述一个或多个性能指示符;第三指令,用于与所述一个或多个性能指示符中的对应性能指示符相关联地为所述一条或多条指令启动所述页表中的一个或多个计数器字段;以及第四指令,用于根据在页表的性能指示符字段中指令是否具有关联性能指示符,在计算机程序指令执行期间递增所述一个或多个计数器字段中的值。
9.如权利要求8所述的计算机程序产品,其中用于在指令执行期间递增所述一个或多个计数器字段中的值的第四指令包括用于确定是否发生了与存储在所述一个或多个性能指示符字段中的性能指示符相关联的事件的指令;以及用于如果发生了所述事件、则递增所述一个或多个计数器字段中对应计数器字段中的值的指令。
10.如权利要求8所述的计算机程序产品,其中所述事件是高速缓冲存储器未中。
11.如权利要求8所述的计算机程序产品,还包括第五指令,用于与所述一个或多个性能指示符字段和所述一个或多个计数器字段相关联地在页表的一个或多个阈值字段中存储一个或多个阈值。
12.如权利要求11所述的计算机程序产品,还包括第六指令,用于当发生事件时,将所述一个或多个计数器字段中的一个或多个值与所述一个或多个阈值字段中的阈值进行比较;以及第七指令,用于如果存在所述一个或多个计数器字段中的所述一个或多个值与所述阈值之间的预定关系,则产生中断。
13.如权利要求8所述的计算机程序产品,还包括第五指令,用于接收对代码部分或数据部分的访问请求,其中所述访问请求包括代码部分或数据部分的虚拟地址的标识符;第六指令,用于将所述虚拟地址转换成代码部分或数据部分在存储装置中的存储位置的真实地址;第七指令,用于通过使用所述真实地址访问代码部分或数据部分;以及第八指令,用于在访问代码部分或数据部分的期间确定是否发生了事件,其中响应于确定在访问代码部分或数据部分期间发生了事件,执行所述一个或多个计数器字段中的值的递增。
14.如权利要求8所述的计算机程序产品,其中用于将计算机程序的一条或多条指令与一个或多个性能指示符相关联的第一指令包括将所述一个或多个性能指示符与页表中所述一条或多条指令的虚拟和真实地址相关联。
15.一种用于在数据处理系统中执行指令的设备,包括用于将计算机程序的一条或多条指令与一个或多个性能指示符相关联的装置;用于在页表的一个或多个性能指示符字段中存储所述一个或多个性能指示符的装置;用于与所述一个或多个性能指示符中的对应性能指示符相关联地为所述一条或多条指令启动所述页表中的一个或多个计数器字段的装置;以及用于根据在页表的性能指示符字段中指令是否具有关联性能指示符,在计算机程序指令执行期间递增所述一个或多个计数器字段中的值的装置。
16.如权利要求15所述的设备,其中用于在指令执行期间递增所述一个或多个计数器字段中的值的装置包括用于确定是否发生了与存储在所述一个或多个性能指示符字段中的性能指示符相关联的事件的装置;以及用于如果发生了所述事件则递增所述一个或多个计数器字段中对应计数器字段中的值的装置。
17.如权利要求15所述的设备,其中所述事件是高速缓冲存储器未中。
18.如权利要求15所述的设备,还包括用于与所述一个或多个性能指示符字段和所述一个或多个计数器字段相关联地在页表的一个或多个阈值字段中存储一个或多个阈值的装置。
19.如权利要求18所述的设备,还包括用于当发生事件时将所述一个或多个计数器字段中的一个或多个值与所述一个或多个阈值字段中的阈值进行比较的装置;以及用于如果存在所述一个或多个计数器字段中的所述一个或多个值与所述阈值之间的预定关系则产生中断的装置。
20.如权利要求15所述的设备,还包括用于接收对代码部分或数据部分的访问请求的装置,其中所述访问请求包括代码部分或数据部分的虚拟地址的标识符;用于将所述虚拟地址转换成代码部分或数据部分在存储装置中的存储位置的真实地址的装置;用于通过使用所述真实地址访问代码部分或数据部分的装置;以及用于在访问代码部分或数据部分的期间确定是否发生了事件的装置,其中响应于确定在访问代码部分或数据部分期间发生了事件,执行所述一个或多个计数器字段中的值的递增。
全文摘要
提供了一种用于测量与指令执行相关联的事件的数据处理系统中的方法和设备。在数据处理系统中的处理器处接收指令。如果选定指示符与该指令相关联,则使得能够对与该指令的执行相关联的每个事件进行计数。在一些实施例中,性能指示符、计数器、阈值和其它性能监测结构可以存储在用来将虚拟地址转换成物理存储地址的页表中。标准页表以用于存储性能监测结构的附加字段扩增。当发生需要访问物理存储的事件时,可以由性能监测应用程序设置这些结构,并且可以对其进行查询和修改。
文档编号G06F12/10GK1641607SQ200510004619
公开日2005年7月20日 申请日期2005年1月14日 优先权日2004年1月14日
发明者弗兰克·E·莱文, 克里斯托弗·M·理查森, 爱德华·J·西尔哈 申请人:国际商业机器公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1