用于降低软件应用中的存储器延迟的方法和装置的制作方法

文档序号:6501671阅读:189来源:国知局
专利名称:用于降低软件应用中的存储器延迟的方法和装置的制作方法
技术领域
本公开涉及助手线程(helper thread),并且更具体地,涉及用于降低软件应用中的存储器延迟的方法和装置。
背景消费者不断要求更快的计算机。例如并发多线程(SMT)的多线程技术是对处理器管芯(die)面积影响有限的提升吞吐量性能的有效方法。SMT通过并行执行多个处理线程来提高处理器的吞吐量。但是很多软件应用并未受益于SMT,因为它们是单线程的,并因此没有利用多线程技术。
此外,处理器和存储器速度之间的差距不断加大,处理器速度超过了存储器速度。结果,计算机性能日益由处理器缓存层次结构的有效性来确定。预取(Prefetching)是公知的且有效地改善缓存层次结构有效性的技术,预取是一种过程,通过预取过程将指令从系统存储器转移到缓存存储器。但是,只有预取不能确保软件应用能够受益于缓存存储器的速度。此外,需要某种努力来防止在软件应用已经能够使用被预取的变量之前,所述被预取的变量从高速缓存中被去除。
附图简要说明

图1是示出被公开系统的使用环境的示例性计算机系统的框图。
图2是示出被公开系统的使用环境的另一个示例性计算机系统的框图。
图3是代表示例性机器可读指令的流程图,所述机器可读指令可以被设备执行以实现降低软件应用中的存储器延迟的示例性方法。
图4是代表示例性机器可读指令的流程图,所述机器可读指令可以被设备执行以实现管理与助手线程相关的主线程的执行的示例性方法。
图5是代表示例性机器可读指令的流程图,所述机器可读指令可以被设备执行以实现管理与主线程相关的助手线程的执行的示例性方法。
详细描述总的来说,所述被公开系统使用助手线程来预取软件应用的主线程内的变量和/或指令,以便降低存储器延迟。针对缓存未命中和长存储器延迟时间来分析软件应用,并且将编译器运行时指令添加到软件应用中,以生成助手线程并管理所述助手线程和主线程。从主线程产生助手线程,用于预取变量和/或指令并缓存被预取的变量和/或指令供主线程访问。为了防止被缓存的变量和/或指令在主线程能够访问缓存之前从缓存中被去除,添加计数机制到主线程和助手线程中,以协调主线程和助手线程的执行。
图1是示出被公开系统的使用环境的示例性计算机系统的框图。计算机系统100可以是个人计算机(PC)或者任何其他的计算设备。在所示实施例中,计算机系统100包括由电源104供电的主处理单元102。主处理单元102可以包括处理器106,所述处理器106在电气上通过系统互连108耦合到主存储器设备110、闪存存储器设备112,以及一个或更多个接口电路114。在实施例中,系统互连108是地址/数据总线。当然,本领域的普通技术人员将很容易理解,可以使用除了总线以外的其他互连将处理器106连接到其他的设备110、112和114。例如,可以使用一条或更多条专用线路和/或纵横结构(crossbar)将处理器106连接到其他设备110、112和114。
处理器106可以是任何类型的公知处理器,例如来自Intel Pentium微处理器系列、IntelItanium微处理器系列、Intel Centrino微处理器系列,和/或Intel Xscale微处理器系列的处理器。此外,处理器106可以包括任何类型的公知缓存存储器,例如静态随机访问存储器(SRAM)。主存储器设备110可以包括动态随机访问存储器(DRAM)和/或任何其他形式的随机访问存储器。例如,主存储器设备110可以包括双数据率随机访问存储器(DDRAM)。主存储器设备110还可以包括非易失性存储器。在实施例中,主存储器设备110以公知的方式储存由处理器106执行的软件程序。闪存存储器设备112可以是任何类型的闪存存储器设备。闪存存储器设备112可以储存用来引导计算机系统100的固件。
可以使用任何类型的公知接口标准来实现接口电路114,接口标准例如以太网接口和/或通用串行总线(USB)接口。一个或更多个输入设备116可以连接到接口电路114,用于将数据和命令输入主处理单元102。例如,输入设备116可以是键盘、鼠标、触摸屏、跟踪板(track pad)、跟踪球、指向柱(isopoint)和/或语音识别系统。
一个或更多个显示器、打印机、扬声器,和/或其他输出设备118也可以通过接口电路114中的一个或更多个连接到主处理单元102。显示器118可以是阴极射线管(CRT)、液晶显示器(LCD),或任何其他类型的显示器。显示器118可以产生在主处理单元102工作期间所产生的数据的可见指示。所述可见指示可以包括操作人员输入提示(prompt)、计算出的值、检测到的数据,等等。
计算机系统100还可以包括一个或更多个储存设备120。例如,计算机系统100可以包括一个或更多个硬盘驱动器、致密盘(CD)驱动器、数字多功能盘驱动器(DVD),和/或其他的计算机媒体输入/输出(I/O)设备。
计算机系统100还可以通过到网络124的连接与其他设备122交换数据。所述网络连接可以是任何类型的网络连接,例如以太网连接、数字用户线(DSL)、电话线、同轴电缆等。网络124可以是任何类型的网络,例如国际互联网、电话网络、有线网络(cablenetwork)、和/或无线网络。网络设备122可以是任何类型的网络设备122。例如,网络设备122可以是客户(client)、服务器、硬盘驱动器等。
可以使用计算机系统100来执行软件应用。在计算机系统100上可以使用各种类型的软件应用,例如字处理器、计算机游戏,和/或工程开发工具。此外,计算机系统100可以执行软件评测工具(profiler)和/或软件性能分析,以确定软件应用执行的良好程度。计算机系统100还可以执行已经在计算机系统100被优化以改善性能的软件应用。
图2是示出被公开系统的使用环境的另一个示例性计算机系统的框图。在该实施例中,计算机系统200包括处理器202、编译器204、主存储器206、性能分析工具208,以及软件应用210。
再次重申,处理器202可以是任何类型的公知处理器,例如来自Intel Pentium微处理器系列、Intel Itanium微处理器系列、Intel Centrino微处理器系列,和/或Intel Xscale微处理器系列的处理器。主存储器设备206可以包括动态随机访问存储器(DRAM)和/或任何其他形式的随机访问存储器。主存储器设备206还可以包括用于缓存层次结构的存储器。缓存层次结构可以由单个缓存组成,或者可以是几个层次的具有不同尺寸和/或访问速度的缓存。例如,缓存层次结构可以由三个层次的板载(on-board)缓存存储器组成。第一层次的缓存可以是最小的缓存,具有最快的访问时间。其他层次的缓存在尺寸和访问时间上渐进地增加。
通常,编译器204可以是任何类型的用于解释例如C、C++、Java或Basic的任意类型编程语言的编译器。编译器204通过读取软件应用的代码列表并产生处理器202和/或计算机系统200能够解释和执行的指令,从软件应用的代码列表产生软件应用210。
性能分析工具208是提供关于软件应用的运行时性能的反馈的工具。当处理器202和/或计算机系统200正在执行软件应用210时,性能分析工具208监视计算机系统的使用(例如处理器使用、存储器使用、定时器、数据总线等)。性能分析工具208提供关于软件应用的性能瓶颈和/或资源使用的反馈。例如,反馈可以包括缓存命中(hit)率、缓存未命中(miss)率、处理器使用、存储器延迟时间、存储器使用,以及花在软件应用210的每一段上的时间。
图3是代表示例性机器可读指令的流程图,所述机器可读指令可以被设备执行以实现降低软件应用中的存储器延迟的示例性方法。优选地,所示过程300被具体实施在一个或更多个软件程序中,所述一个或更多个软件程序储存在一个或更多个存储器(例如闪存存储器112和/或硬盘120)中,并由一个或更多个处理器(例如处理器106和/或202)以公知的方式执行。但是,过程300的框中的一些或者全部可以人工地执行和/或由某个其他设备执行。尽管参考图3中所示流程图来描述过程300,本领域的普通技术人员将很容易理解,可以使用很多其他的执行过程300的方法。例如,这些框中很多的顺序可以被更改,一个或更多个框的操作可以被改变,框可以被组合和/或框可以被去掉。
总的来说,示例性过程300使用性能分析工具208来确定软件应用210的因存储器访问时间和/或高速缓存未命中而具有性能瓶颈的区域。使用这种性能信息,编译器204产生编译器运行时指令,并将所述指令插入软件应用210。编译器运行时指令产生助手线程,用于通过预取被性能分析工具208标识为造成瓶颈的变量来帮助缓和性能瓶颈。编译器204还将一部分计数机制插入助手线程,并将一部分计数机制插入主线程,以防止助手线程的执行点(execution point)过于领先或过于落后于主线程的执行点。
示例性过程300通过分析软件应用210开始(框302)。使用性能分析工具208来标识软件应用210的因高速缓存未命中和/或存储器延迟时间而遭遇性能瓶颈的区域。示例性的性能分析工具208是VtuneTM性能分析工具。VtuneTM性能分析工具给用户提供例如多少时间花费在软件的区域上、软件应用210中软件函数(function)之间的关系、资源使用(例如软件应用210正在使用多少RAM或者软件应用210正使用的CPU时间百分比)的信息,以及关于大的多线程应用中各个线程的性能的信息。
性能分析工具208完成分析软件应用210以后,评测信息(profiling information)被发送到编译器204(框304)。编译器204处理来自性能分析工具208的评测信息,并确定编译器204将修改软件应用210的哪些区域来帮助缓和性能瓶颈。在示例性实现中,编译器204可以接收列表,所述列表标识软件应用的因缓存未命中和/或存储器延迟而经历性能瓶颈的区域。然后,编译器204确定代码的具有最高缓存未命中率和/或最大存储器访问时间的区域,并修改软件应用210的这些区域。
编译器204尝试通过产生编译器运行时指令并将所述指令插入主线程以生成和管理助手线程来缓和性能瓶颈(框306),生成和管理所述助手线程是为了预取软件应用210的被性能分析工具208标识的区域中的变量。一种实现生成助手线程的示例性方法是产生指令_ssp_begin,并将所述指令插入主线程。这个指令生成线程组(thread team)(例如线程及由线程派生的助手线程),所述线程组最初仅由主线程组成。第二编译器运行时指令_ssp_spawn_helper也被产生并被插入主线程,以便从由计算机系统200维护的线程池(thread pool)产生助手线程。第三编译器运行时指令_ssp_end在软件应用210中产生,用于终止所有和主线程相关联的助手线程。
在编译器产生编译器运行时指令并将所述指令插入主线程以产生助手线程之后,产生助手线程代码(例如构成助手线程的软件指令)。一种生成助手线程代码的示例性方法是使编译器204使用从性能分析工具208接收到的评测信息,并标识软件应用的区域内引起缓存未命中的变量。在造成缓存未命中的变量被标识以后,编译器在助手线程主体(body)内产生用于访问所述变量的指令(例如将变量分配给寄存器),并缓存所述变量。
另一种生成助手线程代码的示例性方法是允许软件开发者生成助手线程代码并使用pragma语句来管理助手线程和主线程(例如产生新线程、控制主线程和/或助手线程的执行等)。可以使用线程图(thread graph)来使代码能在允许软件开发者生成助手线程代码的方法和允许编译器产生助手线程代码的方法之间重用。线程图是指令序列或代码区域的表示,并示出了线程和助手线程之间的线程派生(thread-spawning)关系。被用户插入的编译指示语句和被编译器产生的编译器运行时指令将共享线程图,并允许共享助手线程代码产生模块。
编译器204还将计数机制插入助手线程和主线程(框308)。计数机制允许助手线程和主线程的并行执行得到协调,以防止一个线程的执行过于领先或落后于另一线程的执行。主线程和助手线程的相对同步帮助防止变量被助手线程预取且缓存,并在主线程有机会访问该变量之前从缓存中被去除。因此,主线程和助手线程的相对同步降低了主线程遭遇缓存未命中的机会,为防止所述缓存未命中生成了助手线程。
作为示例性过程300的结果,产生了可以在计算机系统100上执行的经过优化的软件应用。所述已优化的软件应用被优化成利用多线程技术,并且包括产生用于预取变量的助手线程和用于协调助手线程和主线程的执行的计数机制的指令。
图4和图5示出了使用软件计数器和编译器运行时指令在助手线程和主线程中实现计数机制的示例性方法,所述计数机制响应于计数器的值来控制助手线程和主线程的执行。本领域的普通技术人员将很容易理解,可以使用很多其他的实现计数机制的方法。例如,计数器的数量可以被改变,或者可以使用邮箱系统来协调助手线程和主线程的执行。在实现所述计数机制的示例性方法中,所述计数机制包括并行工作的两半。所述计数机制的第一半用来控制主线程的执行(例如过程400),并在图4中示出。所述计数机制的第二半用来控制助手线程的执行(例如过程500),并在图5中示出。
总的来说,计数机制尝试控制主线程和助手线程的相对执行。主线程使用对计数器对来保持主线程的执行点落后于助手线程的执行点某个距离,以留出足够多的时间量供预取变量。助手线程使用第二计数器对来保持助手线程的执行点距主线程的执行点预定的距离,以允许主线程从预取中受益。
图4示出在主线程中实现的用于控制主线程的执行的计数机制的第一半400。首先,确定先行值(run-ahead value)(例如X)(框402)。先行值是预先定义的阈值,指示主线程和助手线程在执行中可以领先或落后于彼此多少地工作。可以通过分析评测信息以经验为主地确定先行值,或者可以利用编译器204中的选项设置所述先行值。两个计数器(例如mc和M)被插入主线程并被初始化(例如mc=X和M=1)(框404)。
主线程通常包括执行某些数据处理(例如计算、操作变量、排序等)的循环,所述数据处理涉及在循环内引起性能瓶颈的变量。主线程检查是否存在任何剩余的数据要被处理(框406)。如果没有数据剩余,则主线程调用编译器运行时指令(例如_ssp_end)来终止任何和主线程相关联的助手线程(框408)。
如果有数据剩余(框406),则主线程执行数据处理(框410),然后递增计数器mc(框412)。将计数器mc与计数器M被先行阈值比例缩放的值(例如M*X)进行比较,看计数器mc是否大于计数器M被缩放的值(例如mc>M*X)(框414)。
如果计数器mc大于M*X,则表明主线程的执行过于领先助手线程的执行。然后,递增计数器M(框416),并且调用编译器运行时指令(例如_ssp_post)来激活助手线程(框418)。主线程通过取回下一个数据元素(框420)并重复通过数据处理循环(框406、408、410、412、414、416、418和420)来继续执行。
如果计数器mc小于或等于M*X,则表明主线程的执行在预先定义的先行阈值以内。主线程通过取回下一个数据元素(框420)并重复通过数据处理循环(框406、408、410、412、414、416、418和420)来继续执行。
图5示出在助手线程中实现的用于控制助手线程执行的计数机制的第二半500。在计数机制的第二半500开始后,两个计数器(hc和H)被初始化(hc=0且H=1)(框502),然后,助手线程检查是否仍有数据要被预取(框504)。如果没有数据剩余,则助手线程结束。
如果数据仍要被预取(框504),则助手线程预取数据(例如读取变量并将该变量的值放入缓存的某个指令)被执行(框506)。计数器hc的值被递增,并且主线程的计数器mc的值被取回(框508)。
将计数器hc与计数器H按先行阈值X缩放的值进行比较(例如是hc>H*X),并且计数器hc与计数器mc的值进行比较(例如是hc>mc)(框510)。如果两个条件都满足,则助手线程过于领先主线程。助手线程通过递增计数器H(框512)并执行编译器运行时指令(例如_ssp_wait)以等待并允许主线程追赶(catch up)(框514)而继续。然后,助手线程继续取回下一个数据元素以便预取(框516),并继续重复通过循环。
如果两个条件(hc>H*X和hc>mc)不都满足(框510),则助手线程将计数器hc与计数器mc进行比较(例如是hc<=mc)(框518)。如果计数器hc小于计数器mc,则助手线程落后于主线程。然后,助手线程将执行编译器运行时指令(例如_ssp_catchup),以允许助手线程追赶(框520)。一种实现追赶指令的方法是使追赶指令将计数器hc、计数器H以及正被预取的数据的值设置为分别等于计数器mc、计数器M以及正在主线程中被处理的数据的值。通过如此修改计数器值,助手线程跳过预取已经被主线程取出的变量的操作。然后取回下一个数据元素(框516),并且助手线程继续重复通过循环(框504、506、508、510、512、514以及516)。
尽管上面公开了包括除其他以外在硬件上执行的软件的示例性系统,但是应该注意,这些系统仅仅是说明性的,并且不应该被视为限制性的。例如,可以预期,所公开的硬件和软件组件(component)的全部或一些能够被排他地具体实施在专用硬件中、专门地具体实施在软件中、专门地具体实施在固件中或硬件、固件和/或软件的某种组合中。
此外,尽管这里已经描述了某些方法、装置和制品,但是本专利的覆盖范围不限于此。相反,本专利覆盖了所有在字面上或在等同原则之下明确地落入所附权利要求书范围内的方法、装置和制品。
权利要求
1.一种降低软件应用中的存储器延迟的方法,所述方法包括分析所述软件应用并确定遭遇缓存未命中的第一软件指令区域;产生助手线程;产生第一组编译器运行时指令,并将所述第一组编译器运行时指令插入主线程;产生第二组编译器运行时指令,并将所述第二组编译器运行时指令插入所述助手线程;以及在所述主线程和所述助手线程中插入计数机制,所述计数机制被构造成协调所述主线程和所述助手线程的相对执行点。
2.如权利要求1所述的方法,还包括分析所述软件应用并确定遭遇存储器装载延迟的第二软件指令区域。
3.如权利要求2所述的方法,其中,所述第一软件指令区域和所述第二软件指令区域不同。
4.如权利要求2所述的方法,其中,所述第一软件指令区域包括所述第二软件指令区域。
5.如权利要求2所述的方法,其中,分析所述软件应用的操作包括使用性能分析工具测量与所述软件应用相关联的缓存未命中率;使用所述性能分析工具测量和所述软件应用相关联的存储器装载延迟;向编译器报告遭遇所述缓存未命中的所述第一软件指令区域;以及报告遭遇所述存储器装载延迟的所述第二软件指令区域。
6.如权利要求1所述的方法,其中,产生助手线程的操作包括产生线程图。
7.如权利要求6所述的方法,其中,所述线程图显现代表所述主线程和所述助手线程之间的关系的数据结构。
8.如权利要求6所述的方法,其中,所述线程图辅助代码重用。
9.如权利要求1所述的方法,其中,所述第一组编译器运行时指令的至少一部分包括所述第二组编译器运行时指令的至少一部分。
10.如权利要求1所述的方法,其中,被插入所述主线程的所述第一组编译器运行时指令包括用于派生所述助手线程、终止所述助手线程和协调所述助手线程和所述主线程的执行的指令。
11.如权利要求1所述的方法,其中,被插入所述助手线程的所述第二组编译器运行时指令包括用于协调所述助手线程和所述主线程的执行的指令。
12.如权利要求1所述的方法,其中,所述计数机制包括软件计数器。
13.如权利要求12所述的方法,其中,所述第一组编译器运行时指令和所述第二组编译器运行时指令中的至少一个包括基于与所述软件计数器相关联的值来控制所述助手线程的执行速率的指令。
14.如权利要求12所述的方法,其中,所述第一组编译器运行时指令和所述第二组编译器运行时指令中的至少一个包括基于与所述软件计数器相关联的值来控制所述主线程的执行速率的指令。
15.如权利要求14所述的方法,其中,所述用于控制执行速率的编译器运行时指令包括延时指令、追赶指令,以及强制执行指令。
16.一种用于降低存储器延迟的系统,所述系统包括处理器;可操作地耦合到所述处理器的存储器所述存储器储存被构造成标识应用程序中遭遇数据缓存未命中的代码区域;可操作地耦合到所述软件工具的编译器,所述编译器被构造成从所述软件工具接收信息和产生助手线程;一组要被产生并被插入所述应用程序的编译器运行时指令,所述编译器运行时指令用于管理所述助手线程和管理主线程;以及供插入所述主线程和所述助手线程的计数机制,所述计数机制用于辅助与所述助手线程和所述主线程相关联的执行点的协调。
17.如权利要求16所述的系统,其中,所述软件工具包括VtuneTM性能分析器。
18.如权利要求16所述的系统,其中,所述编译器从所述软件工具接收到的所述信息包括与所述被标识的代码区域相关联的数据缓存未命中率。
19.如权利要求16所述的系统,其中,所述编译器从所述软件工具接收到的所述信息包括与所述被标识的代码区域相关联的存储器装载延迟时间。
20.如权利要求16所述的系统,其中,所述助手线程被构造成预取被包括在所述被标识的代码区域中的变量。
21.如权利要求16所述的系统,其中,所述编译器运行时指令组包括用于生成所述助手线程、终止所述助手线程、推迟所述助手线程的执行,以及激活所述助手线程的指令。
22.如权利要求16所述的系统,其中,所述编译器运行时指令组包括用于协调所述助手线程和所述主线程的执行的指令。
23.一种储存指令的机器可读介质,所述指令引起机器分析包括主线程的软件应用;标识所述软件应用中的代码区域;产生助手线程;产生第一组编译器运行时指令并将其插入所述主线程,以管理所述助手线程和所述主线程;产生第二组编译器运行时指令并将其插入所述助手线程,以管理所述助手线程和所述主线程;以及管理所述助手线程和所述主线程的执行点。
24.如权利要求22所述的机器可读指令,其中,所述被储存的指令被构造成引起所述机器基于缓存未命中率来标识所述代码区域。
25.如权利要求22所述的机器可读指令,其中,所述被储存的指令被构造成引起所述机器基于存储器装载延迟来标识所述代码区域。
26.如权利要求22所述的机器可读指令,其中,所述被储存的指令被构造成引起所述机器产生所述助手线程,以用于预取所述被标识的代码区域内的指令。
27.如权利要求22所述的机器可读指令,其中,所述被储存的指令被构造成引起所述机器产生用于派生所述助手线程、终止所述助手线程、协调所述助手线程和所述主线程的执行的编译器运行时指令。
28.如权利要求22所述的机器可读指令,其中,所述被储存的指令被构造成引起所述机器通过将计数机制的第一部分插入所述主线程并将计数机制的第二部分插入所述助手线程来管理所述主线程和所述助手线程的执行。
29.一种用于降低存储器延迟的装置,所述装置包括被构造成标识应用程序中的遭遇数据缓存未命中的代码区域的软件工具;可操作地耦合到所述软件工具的编译器,所述编译器被构造成从所述软件工具接收信息和产生助手线程;一组要被产生并被插入所述应用程序中的编译器运行时指令,所述编译器运行时指令用于管理所述助手线程和管理主线程;以及供插入所述主线程和所述助手线程的计数机制,所述计数机制用于辅助与所述助手线程和所述主线程相关联的执行点的协调。
30.如权利要求29所述的装置,其中所述编译器从所述软件工具接收到的所述信息包括与所述被标识的代码区域相关联的数据缓存未命中率。
31.如权利要求29所述的装置,其中所述编译器从所述软件工具接收到的所述信息包括与所述被标识的代码区域相关联的存储器装载延迟时间。
32.如权利要求29所述的装置,其中所述助手线程被构造成预取包含在所述被标识的代码区域中的变量。
33.如权利要求29所述的装置,其中所述编译器运行时指令组包括用于生成所述助手线程、终止所述助手线程、推迟所述助手线程的执行,以及激活所述助手线程的指令。
34.如权利要求29所述的装置,其中,所述编译器运行时指令组包括用于协调所述助手线程和所述主线程的执行的指令。
全文摘要
公开了用于降低软件应用中的存储器延迟的方法和装置。被公开的系统使用一个或更多个助手线程为主线程预取变量,以便降低因存储器延迟和/或缓存未命中所致的性能瓶颈。使用性能分析工具对软件应用的资源使用进行评测,并标识软件应用中经历性能瓶颈的区域。在软件应用中产生编译器运行时指令,用于生成和管理助手线程。助手线程预取被标识的软件应用的经历性能瓶颈的区域中的数据。计数机制被插入助手线程并且计数机制被插入主线程,以便利用主线程协调助手线程的执行,并帮助确保在主线程能够利用被预取的数据之前所述被预取的数据没有从缓存中被去除。
文档编号G06F9/48GK1890635SQ200480035709
公开日2007年1月3日 申请日期2004年9月29日 优先权日2003年10月2日
发明者田新民, S-W·廖, 王红, 米林德·吉尔卡, 约翰·申, 佩里·王, 格兰特·哈伯, 盖罗尔夫·霍夫莱纳, 丹尼尔·莱弗里, H·斋藤, 桑吉夫·沙阿, D·金 申请人:英特尔公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1