多线程管道中的可编程延迟分派的制作方法

文档序号:6554390阅读:131来源:国知局
专利名称:多线程管道中的可编程延迟分派的制作方法
技术领域
本发明涉及在一个或多个执行线程中处理指令。
背景技术
处理器使用执行管道、分派单元、指令解码单元和其它单元来执行处理器指令。处理器指令是由取指令单元从存储器设备中检索的。分派单元从一个或多个线程取出一个或多个处理器指令,并将这(些)指令分派到具有开放执行槽的一个或多个执行管道。执行管道接收并执行一个或多个指令。一旦在各执行管道中的一个中有另一个执行槽可用,则为一线程取出其它处理器指令并将其分派到适当的执行管道。
一经分派,每个处理器指令即由一个或多个执行管道处理,直至该指令停顿、被刷新或完成。在一些系统中,当一指令在一执行管道内停顿时,等待在该执行管道中处理的所有指令都被延迟。由此,尽管只有一个线程正在等待引起了停顿的指令的结果,有指令在该停顿的执行管道内的其它线程实际上也停顿。此外,在一些系统中,当一执行管道停顿时,其它执行管道也停顿。
一些停顿条件可在处理器指令被编译时被检测到。例如,执行管道可能需要10个处理周期,或时钟周期来执行一次乘法操作。线程A的第一指令可能要求一次乘法操作。线程A的第二指令可能使用该次乘法操作的结果。在此情形中,第二指令将停顿9个处理周期,直至第一指令的结果可用。
以上所讨论的停顿条件可在编译时被检测到。如果被检测到,编译器可通过在第一指令以后分派总共要求至少9个处理周期的指令来避免停顿。如果在第一指令以后无法调度其它指令,则编译器可在前两个指令之间插入多达9个无操作指令(nop)。nop和任何其它指令一样被分派并由执行管道执行。使用nop的缺点是,指令映像变得更大并要求更多的存储器,并且nop占用执行管道中宝贵的执行槽。为一执行槽分派nop延迟了本该为此执行槽分派的其它处理器指令的执行。这包括本该为其它线程分派的指令。此外,由驻留在不同线程中的处理器指令引起的停顿条件不能被编译器程序和指令处理系统检测到。
因此,需要更好地处理潜在的停顿条件。

发明内容
粗略地讲,本文中的技术涉及检测处理器指令中的停顿条件,以及生成不分派条件并基于该不分派条件来防止对指定指令的分派。停顿条件可由硬件和/或软件在处理器指令执行以前和/或期间检测到。一旦检测到停顿条件,即生成不分派条件。不分派条件可在执行以前被嵌入到指令映像中,或在指令执行期间被生成。在一个实施例中,不分派条件指示对一个或多个线程的指令的分派应被延迟。可将不分派条件与处理周期个数以及与一指令或与数个指令的组合相关联。生成不分派条件的结果是,来自其它线程的处理器指令可被调度到可用执行管道的执行槽中。
在一个实施例中,一种用于处理指令集中潜在的停顿的过程包括处理检测与所访问的处理器指令集相关联的停顿条件的硬件和软件的指令。在停顿条件被检测到以后,生成不分派条件。
在一个实施例中,揭示了一种系统,它用于处理执行管道中的不分派条件。该系统包括存储设备以及一个或多个执行管道。该存储设备上存储有计算机可读指令。这些计算机可读指令中的至少一个包括不分派信息。该系统包括与该存储设备通信的一个或多个执行管道,它们被配置成执行这些计算机可读指令。


图1示出适于配合本发明使用的计算系统的一个实施例。
图2A示出指令处理系统的一个实施例。
图2B示出取指令单元的一个实施例。
图3示出用于生成不分派条件的方法的一个实施例。
图4示出用于在执行处理器指令以前检测停顿条件并生成不分派条件的方法的一个实施例。
图5示出用于检查处理器指令集的方法的一个实施例。
图6A示出用于在执行处理器指令以前配置不分派条件的方法的一个实施例。
图6B示出具有不分派处理器指令的处理器指令集的一个示例。
图6C示出具有不分派处理器指令的处理器指令集的另一个示例。
图6D示出具有不分派处理器指令的处理器指令集的又一个示例。
图6E示出具有不分派处理器指令的处理器指令集的再一个示例。
图7示出用于使用硬件来检查指令以检测停顿条件的方法的一个实施例。
图8A示出分派单元的一个实施例。
图8B示出用于由指令解码和分派仲裁来处理处理器指令的方法的一个实施例。
图9示出用于由不分派历史来处理指令集的方法的一个实施例。
具体实施例方式
在一个实施例中,揭示了一种系统和方法,用于检测与处理器指令相关联的停顿条件。停顿条件可由硬件和/或软件在处理器指令执行以前和/或期间检测到。在一个实施例中,可使用软件在编译时检测停顿条件,而硬件可在指令执行期间或就在其执行以前检测停顿条件。
一旦检测到停顿条件,即生成不分派条件。不分派条件指示在指定的等待时段里,与一线程相关联的一个或多个指令不应被分派。该指定的等待时段可以是在一被竞争或被产生的资源对稍后引起停顿的指令可用以前所需的例如若干个处理周期等时段。生成不分派条件的结果是,来自其它线程的处理器指令可被分派到可用的执行管道的执行槽中。在指定的等待时段过去以后,与停顿相关联的指令可被分派。
在由软件生成不分派条件的一个实施例中,该软件用不分派信息来配置不分派指令。不分派指令可仅包含不分派信息,或可包括添加了不分派信息的其它类型的指令。一旦不分派指令被配置并被包括在代码映像中,指令处理系统即可认出该不分派指令,并将来自其它线程的指令分派到可用的执行槽中。这提供了更高效的指令处理。这将在以下更详细地讨论。
在一个实施例中,不分派条件是由指令处理系统内的硬件生成。在此实施例中,要被执行的指令首先由指令处理系统检查。当在所检查的指令中检测到停顿条件时,指令处理系统为特定线程生成不分派信息。随即在与该不分派信息相关联的若干处理周期内,来自其它线程的指令可被分派到可用的执行槽中。这将在以下更加详细地讨论。
图1示出可在其中实现本发明的计算设备100的一个实施例。这一计算设备的一个例子可以是用于提供多媒体体验和进行包括音频和视频的视频游戏的游戏设备。音频和视频数据在到达数模接口以前通常是确定性的、流式传输的和数字的。在计算设备100内,音频和视频处理电路在内部将数据作为数字数据处理,但在模拟信号上输出数据。
计算设备100包括中央处理单元(CPU)102、图形处理器/北桥(Northbridge)104、存储器110、视频逻辑112、音频数模转换器126、南桥(Southbridge)106、输入/输出设备120、HDD和DVD设备122以及闪存124。北桥104经由地址控制线(Addr/cntl)和数据线(Data)与存储器110通信。在一个实施例中,北桥104提供处理功能、存储器功能、并起到CPU 102和南桥106之间的中介的作用。北桥104经由后端总线(BSB)与南桥106通信。南桥106执行各种I/O功能、信号处理以及其它功能。南桥106与I/O设备120、硬盘驱动器和DVD驱动器122、以及闪存124通信。北桥104经由数字视频输出总线(DVO)与视频逻辑112通信。
北桥104经由后端总线(BSB)与南桥106通信。南桥106执行各种I/O功能、音频处理和测试功能。南桥106与I/O设备120、硬盘驱动器和DVD驱动器122、以及闪存124通信。系统100还包括视频逻辑112。北桥104经由数字视频输出总线(DVO)与视频逻辑112通信。视频逻辑112还包括向CPU 102、北桥104和南桥106提供时钟的时钟生成电路。
如以上所讨论,南桥106提供各种音频处理。南桥经由I2S总线与数模转换器126通信。I2S是标准数字音频芯片到芯片单向接口。在其基本形式中,它包括采样时钟(SCLK)、主时钟(MCLK)、左/右指示器(LRSEL)以及串行数据线。接口130被包括以用于将系统100连接到该系统外的组件。南桥106被直接连接到接口130。此外,数模转换器126和视频逻辑112也被连接到接口130。
图2A示出用于处理停顿条件以及处理并生成不分派条件的指令处理系统200的一个实施例。系统200可被实现在图1的CPU 102内部。系统200也可被实现在处理指令的任何CPU内部。系统200包括取指令单元210、212和214,分派预解码单元220,分派单元230,执行管道240、242、244和246、共享资源250以及管道间通信260。尽管图示出三个取指令单元,但是可以使用三个以上或以下的取指令单元。取指令单元210-214为与特定线程相关联的指令提供指令信息。例如,可将取指令单元(IFU)210与线程0相关联,将IFU 212与线程1相关联,并将IFU 214与线程m相关联。IFU将在以下参考图2B更详细地讨论。指令信息可包括指向指令的指针、指令本身、或关于指令的其它信息。指令信息将在以下更详细地讨论。
分派预解码单元220可在由指令处理系统200执行处理器指令期间检测停顿条件并生成不分派条件。在一个实施例中,分派预解码单元220几乎在指令信息被分派单元230接收的同时接收并处理来自每个取指令单元的指令信息。如果分派预解码单元220检测到停顿条件,则分派预解码单元220向分派单元230发送与该停顿相关联的不分派信息。可将不分派信息与一个或多个取指令单元或者一个或多个线程相关联。这将在以下更详细地讨论。
分派单元230从取指令单元接收指令信息,向执行管道提供指令信息,并确定从哪个线程检索指令信息。分派单元230还可直接从分派预解码单元220接收不分派信息。分派单元230可认出与从取指令单元接收的处理器指令相关联的不分派信息。在一个实施例中,不分派信息被编码到指令或指令信息中。分派单元230将在以下参考图8A-B更详细地讨论。
执行管道240-246执行由分派单元230分派到特定管道的指令。在一个实施例中,执行管道240-244可以是不同类型的管道。例如,执行管道可包括整数执行管道、浮点执行管道、以及分支管道。整数执行管道可处理诸如加法和减法操作等涉及整数变量的操作。浮点执行管道可处理诸如乘法操作等涉及浮点变量的操作。分支管道可确定哪个执行管道具有可用的执行槽,并将此信息提供给分派单元230。每个执行管道都可通过管道间通信260相互通信和交换信息。
共享资源250包括可由一个或多个执行管道访问或者使用的诸如寄存器文件等一个或多个资源。管道间通信260表示执行管道240-244之间的通信线。管道之间的通信可包括对操作状态的请求、对操作结果的请求、对管道状态的请求、或者其它信息请求。关于系统200的组件之间的交互的更多细节将在以下提供。
诸如图2A的IFU 210、212和214等多个IFU的一个实施例在图2B的系统265中更加详细地示出。尽管系统265示出两个IFU,但是可以使用任意个数的IFU。系统265包括取指令单元276和286,分别用于处理来自线程A和线程B的指令。取指令单元276包括线程A指令地址控制270、取指令地址寄存器(IFAR)272和线程A指令缓冲器(IBuf)274。取指令单元276有权从指令高速缓存273加载和接收指令。取指令单元286包括线程B指令地址控制280、取指令地址寄存器(IFAR)282和线程B指令缓冲器(IBuf)284。取指令单元286有权从指令高速缓存273加载和接收指令。在一个实施例中,与来自特定线程的指令相关联的指令存储器地址从线程指令地址控制被加载到与该线程相关联的IFAR。该指令存储器地址随即从IFAR被加载到指令高速缓存。在一些实施例中,一个指令高速缓存可为诸如IFAR A 272和IFAR B 282等一个以上IFAR加载指令存储器地址。在一些实施例中,一个指令高速缓存可为一个IFAR加载多个指令。与特定线程相关联的IBuf随即从指令高速缓存为该线程加载指令。由此,IBuf 274为线程A指令地址控制270加载指令。指令信息随即由分派单元230和/或分派预解码220从IBuf加载。来自每个IFU的指令信息被提供给分派单元230。分派单元230在以下参考图8A-B更加详细地讨论。
图3示出用于检测停顿条件并生成不分派条件的方法300的一个实施例。方法300以在步骤310访问处理器指令为开始。处理器指令可按以下更详细描述的许多方式被访问。接下来,在步骤320,在处理指令中停顿条件被检测到。然后在步骤330,与该停顿条件相关联的不分派条件被生成。一般化的步骤310、320和330可在由本文中所描述的软件或硬件生成或执行处理器指令的同时被执行。这些实施例的示例将在以下更加详细地讨论。
图4示出用于在处理器指令的生成期间检测停顿条件并生成不分派条件的方法400的一个实施例。首先,在步骤410源代码被访问。接下来,在步骤420从该源代码生成处理器指令。在一些实施例中,编译器程序可执行步骤410和420。例如,在此情形中,源代码可以是C、C++或某种其它源语言,而处理器指令将是汇编代码或目标代码。在一些实施例中,汇编器程序可执行步骤410到420。在此情形中,源代码是汇编代码,而从源代码生成的处理器指令是目标代码。在一些实施例中,一个或多个编译器程序、一个或多个汇编器程序、或者其它处理器指令生成程序的组合可执行步骤410-420。对于以下讨论,从源代码生成的指令在本文中将被称为处理器指令。
在步骤430,处理器指令集被检查并按需更新。可使用编译器程序、汇编器程序或其它软件程序来检查处理器指令。在一个实施例中,检查指令可包括访问并对处理器指令集进行语法分析。在检查期间,软件程序确定指令集内是否存在任何停顿条件。该软件随即用不分派信息来更新该指令集。不分派信息描述诸如图2A的分派单元230等分派器应如何处理停顿条件。对处理器指令集的检查将在以下参考图5更加详细地讨论。
在一个实施例中,步骤420-430可由编译器、优化软件、指令分派软件或其它软件同时执行。当被同时执行时,停顿条件可在软件程序生成处理器指令的同时被检测到。在另一实施例中,检查和更新的步骤可由单独的软件分别执行。
在指令集已被检查和更新以后,在步骤450该软件确定是否有其它处理器指令集应被检查。在一个实施例中,如果要由指令处理系统执行的一个或多个处理器指令集尚未被检查,则要求进行其它检查。如果要求进行其它检查,则操作前进至步骤430。如果不要求其它对处理器指令集的检查,则操作前进至步骤460。在一个实施例中,单个指令可被包括在要就停顿条件被检查的多个处理器指令集中。在此情形中,该指令可被检查一次或多次。在步骤470生成指令映像。如果在步骤430-440有任何停顿条件被检测到,则指令映像将把不分派信息结合到一个或多个处理器指令中。
在一个实施例中,步骤430-460可在执行处理器指令以前的任何时候被执行。由此,停顿条件的检测及不分派条件的生成并不被局限于执行处理器指令的时候。
图5示出用于如以上在方法400的步骤430中所讨论地检查和更新指令集的方法500的一个实施例。在一些实施例中,方法500可由编译器程序、汇编器程序或某个其它软件程序实现。还可将执行方法500的软件与优化技术、指令分派技术、以及其它软件相结合。方法500在步骤510以从处理器指令集中选择第一处理器指令作为接受求值的指令为开始。接下来,在步骤520确定停顿条件中是否潜在涉及接受求值的处理器指令。如果一处理器指令的执行可能引起后续指令停顿,则停顿中可能涉及该处理器指令。停顿中可能涉及的指令的类型将在以下参考图5进行讨论。如果该软件确定停顿中不可能涉及接受求值的处理器指令,则操作前进至步骤560。如果该软件确定停顿中可能涉及接受求值的处理器指令,则操作从步骤520前进至步骤530。
在步骤530,指令集被检查以确定在该指令流被执行时是否会发生停顿条件。停顿条件一般涉及停顿中可能涉及的接受求值的第一发生指令,以及第二发生停顿引起指令。步骤520和530将在以下更加详细地讨论。如果没有检测到任何停顿条件,则操作前进至步骤560。如果在处理器指令集中检测到停顿条件,则操作前进至步骤540。
在步骤540确定与停顿条件相关联的不分派计数。不分派计数可使用数种方法来确定。这些方法的示例将在以下更加详细地讨论。接下来,在步骤545从不分派计数推导出不分派信息。不分派信息被用来更新指令集中的指令。
随即在步骤550,指令集被更新以包括所生成的不分派信息。操作随即返回步骤530,在该处接受求值的指令被再次与已更新的指令集相比较。在一个实施例中,这将防止将不分派信息添加到指令流中会改变停顿的本质、从而在该指令流被执行时发生或引起新的停顿这样的情况。当在步骤530没有检测到更多新的停顿条件时,操作前进至步骤560。在步骤560该系统确定集中是否有其它指令应被检查。如果集中有其它指令尚未被选择,则在步骤570下一个指令被选择作为接受求值的指令,且操作前进至步骤520。如果不剩任何其它指令要被选择,则方法500在步骤580结束。
现在将更加详细地讨论图5的方法500的步骤。在步骤520,检查一指令以确定停顿中是否可能潜在地涉及该指令。在一个实施例中,停顿中可能潜在涉及的指令的类型被存储在存储器中。例如,停顿中可能涉及的处理器指令的列表可被包含在存储在存储器中的查找表中。在此情形中,在步骤520,该软件确定接受求值的指令是否是查找表中的处理器指令中的一个。操作前进至步骤530。否则,对于接受求值的指令不要求任何处理,而操作前进至步骤560。
在一个实施例中,在步骤520所有指令都被视为停顿中潜在涉及的。在另一实施例中,不可能引起停顿的指令子集不被认为是停顿中潜在涉及的。例如,无操作指令(NOP)不消耗或产生任何资源。由此,如果将NOP与潜在地引起停顿的指令相比较,则处理将会前进至步骤560。停顿中可能涉及的指令的例子包括写单端口RAM、更新寄存器、更新资源、更新前一指令的结果或向另一线程发送信息等指令。
在一个实施例中,所有指令的一个子集被视为停顿中潜在涉及的。可使用不同的准则来确定哪些指令在该子集中。例如,一子集可包括写寄存器文件的指令。又如,该子集可包括根据对要由CPU执行的程序的分析所确定的在停顿中最可能涉及的被共同执行的指令。将那些被视为停顿中潜在涉及的指令限制到所有指令的一个子集是有好处的,因为方法500的处理时间可能减少。如果以此方式适当地选择该子集,则处理方法500的时间的减少会使性能只受到适度损失。
在一个实施例中,在步骤530接受求值的指令被与指令集中所有其它指令相比较。确定两个指令的组合及其在指令流中的位置是否会导致停顿。编译和优化领域中已知的技术可被用来确定在两个相比较的指令之间是否会发生停顿。这些技术包括使用由指令索引的表。它们还包括使用依存关系图来标识指令之间避免停顿所需的最小间隔。在一个实施例中,步骤420和430可如前所述地被结合在一起,以同时采用各种方法来将指令重新排序、消除停顿以及确定哪些停顿(若有)是不能避免的。
不分派计数在方法500的步骤540被确定。不分派计数可用各种方法来确定。在一个实施例中,分派器230可处理不分派计数值的有限集合。例如,可被处理的不分派计数可以被限制于值3、8、12。在此情形中,不分派计数被转换为不分派信息,它从该不分派计数的有限集合中选择一个大于等于不分派计数的值。在一个实施例中,在步骤550,对不分派计数的有限集合中的值的引用被包括在指令映像中。分派器随即使用该引用来确定实际的不分派计数。例如,三个不分派计数3、8、12可被存储在寄存器中。寄存器地址可被包括在被添加到指令映像的不分派信息中。不分派计数的有限集合可直接从被包括在指令映像中的不分派信息解码。在一个实施例中,可将原始的不分派计数与分派器可处理的不分派计数的有限集合相比较。大于等于原始的不分派计数的最小的不分派计数被选择以创建不分派信息。
在另一个实施例中,不分派计数可被确定为执行接受求值的指令所需的处理周期的个数与分派该接受求值的指令和分派引起停顿的指令之间的指令的最少个数之间的差。例如,接受求值的指令可能需要10个周期来完成执行。引起停顿的后续指令可被调度成在接受求值的指令的分派以后的四个周期被分派。此情形中的不分派计数是6个处理周期完成接受求值的指令的执行所需的10个周期减去引起停顿的指令的分派之间的4个周期。
在另一个实施例中,不分派计数可被确定为以下两项之差,1)在接受求值的指令产生或释放潜在地引起停顿的资源以前执行中所需的处理周期的个数,以及2)在引起停顿的指令要求该资源以前该指令的执行期间所需的处理周期的个数。例如,接受求值的指令可能需要10个周期来完成写寄存器文件。后续指令可在3个处理器周期的执行以后读寄存器。不分派计数因而将是7个周期(10-3=7)。
在另一个实施例中,不分派计数可以从以下3个值推导1)第一个是在接受求值的指令产生或释放资源以前执行期间的处理周期的个数,2)在引起停顿的指令要求该资源以前执行中所需的处理周期的个数,以及3)在接受求值的指令的分派和潜在停顿的指令的分派之间的处理器周期的最少个数。不分派计数是从第一个值(资源的产生)减去第二个值(资源的使用)和第三个值(分派中的延迟所产生的等待)而推导出的。例如,接受求值的指令可能需要10个周期来完成写寄存器文件。后续的引起停顿的指令可在3个处理器周期的执行以后读寄存器。该后续指令可能在接受求值的指令的分派以后的四个周期被分派。因此不分派计数将会是3个周期,这是通过从与寄存器写相关联的10个周期减去由于寄存器读而产生的3个周期以及由于分派时段距离而产生的4个周期而推导出的。
在另一个实施例中,不分派计数包括两个值而不是一个值。第一个值是一等待时间,它等于由步骤545的产生单个等待时间值的任何其它实施例,包括在前面段落中所描述的那些实施例所产生的不分派计数。此值表示分派接受求值的指令和引起停顿的指令之间避免停顿所需的最少时间。第二个值是对引起停顿的指令的引用。与引起停顿的指令相关联的值可以是接受求值的指令和引起停顿的指令在指令映像中的距离。在一个实施例中,这两个指令之间的距离是分派这两个指令之间的最少时间、指令的地址、或区分引起停顿的指令的某个其它值。在此实施例中,在步骤550,由这两个值组成的不分派计数被用来更新指令集。
在一个实施例中,不分派计数包括三个值而不是一个值。第一和第二个值描述在其间不应分派引起停顿的指令的时段。第三个值是对引起停顿的指令的引用。与引起停顿的指令相关联的值可以是指令映像中接受求值的指令和引起停顿的指令之间的距离。在一个实施例中,这两个指令之间的距离是分派这两个指令之间的最少时间、指令的地址、或区分引起停顿的指令的某个其它值。在此实施例中,在步骤550,由这两个值组成的不分派计数被用来更新指令集。
前两个值可用以下两项来计算,a)在资源被要求时接受求值的指令的执行期间的时段,以及b)在引起停顿的指令要求使用该资源时执行期间的时段。例如,假定接受求值的指令需要4个周期来访问单端口寄存器文件,且该访问在该指令被分派7个周期以后开始。此外,假定引起停顿的指令需要2个周期来访问寄存器文件,且该访问在引起停顿的指令被分派3个周期以后开始。如果引起停顿的指令在接受求值的指令以后3到10个周期之间(含3个和10个周期)被分派,则将会发生停顿。在此例中,第三个值引用引起停顿的指令,而第一个值被设为3,第二个值被设为10。
尽管已经描述了用于推导不分派计数的若干实施例,但是用于检查指令集并检测一个或多个停顿条件的其它方法可被用来推导不分派计数。此外,可使用其它形式的不分派计数和从不分派计数推导出的不分派信息,它们被添加到指令流中,并由分派单元230解释以延迟指令的分派。
图6A示出用于如以上方法500的步骤550中所讨论地用不分派信息来更新指令集的方法600的一个实施例。如果尚未被检索,则在步骤610不分派信息被检索。接下来,在步骤620确定引起停顿条件的指令是否能用不分派信息来标记。如以上所讨论,不分派信息可包括处理器周期信息,例如,等于或大于一资源由于潜在涉及的指令的原因而不可用的周期个数的处理器周期数。如果指令不能被标记,则操作前进至步骤650。如果指令可用不分派信息来标记,则操作前进至步骤630。
回到方法600,一旦在步骤630用不分派信息标记了指令,则在步骤640被标记的指令即被包括在指令集中。如果在对引起停顿的指令的编码中有可用的位,则不分派信息被添加或“标记”到该指令中。如果处理器指令中的位可被设为表示不分派信息,则该处理器指令有空间容纳另一个字段。在一个实施例中,可通过设置一个位值来指示该指令包括不分派信息,并对不分派信息设置一个或多个位来添加不分派信息。
在一个实施例中,在处理器指令的一个子集中总是出现不分派信息字段。如果没有任何停顿条件,则该字段被设为指定的值(例如,0)。否则该字段包含不分派信息。使用指令中的附加字段是有好处的,因为不需要生成其它不分派指令。在一个实施例中,在处理使用超长指令字的机器中可使用对指令添加附加的不分派信息的方式。
在步骤650,用不分派信息生成新的不分派指令。然后在步骤660,此新指令被添加到指令集中。这是有好处的,因为在现有指令的指令编码中不需要附加位。
图6B示出两个处理器指令集的一个实施例,该例示出如以上方法600的步骤630所讨论地将不分派信息添加到处理器指令。图6B包括第一指令集672和第二指令集674。第一指令集672包括LD A,LD B,USE A和OR A,1。当LD A在步骤510或步骤570被选择作为接受求值的指令,并且在步骤520确定停顿中潜在涉及以后,在步骤530,USE A指令被标识为引起停顿条件的指令。不分派计数被转换为不分派信息,在此例中,该信息为值‘i’。处理器指令集674示出不分派信息“ND i”被添加到指令集672的USE A处理器指令中。处理器指令676指示,当USE A指令被读取时,分派单元230在i个周期内不应分派来自对应线程的指令USE A。
i的值可由包括编译器和优化器当前所采用的技术在内的任何方法来确定。在一些实施例中,在处理器指令676的位中实现处理器指令676的不分派信息。将指令从文本指令676转换为实际的机器编码的过程在本领域中是公知的。
图6C示出两个处理器指令集,它们示出以上就方法600的步骤650所讨论的不分派指令的生成。指令集682包括LD A,LD B,USE A和OR A,1处理器指令。当LD A在步骤510或步骤570被选择作为接受求值的指令,并在步骤520被确定为停顿中潜在涉及以后,在步骤530,USE A指令被标识为引起停顿的指令。不分派计数被转换为不分派信息,在此例中,该信息为值‘i’。处理器指令集684包括指令LD A,LD B,ND i处理器指令686,USE A和OR A,1处理器指令。不分派指令686被插入到指令集684中正在引起停顿的USE A指令之前的位置。不分派指令686指示在其间来自当前线程的处理器指令不应被分派的若干个周期。周期个数i与不分派计数相关联,并可按如上述所确定地被检索或推导。在用不分派信息构造指令686以后,在步骤640,指令686被包括在指令映像中。
在一个实施例中,不分派信息包括被添加到指令流中的多个值。在图6D中示出两个处理器指令集的示例,该示例示出将不分派信息添加到处理器指令中。不分派信息包括处理周期和后续指令引用信息。图6D包括第一指令集691和第二指令集692。类似于图6B的指令集672,第一指令集691包括LD A,LD B,USE A和OR A,1。如以上参考指令集672所讨论,USE A指令通过试图在LD A指令更新了寄存器A以前访问寄存器A来引起停顿。
第二处理器指令集692包括LD A ND i,j,LD B,处理器指令USE A 693、以及OR A,1。处理器指令集692示出不分派信息“ND i,j”被添加到指令集691的LD A处理器指令中。在此情形中,不分派信息中被引用的指令j是USE A指令。处理器指令693指示,当USE A指令被读取时,分派单元230在指令LD A被分派后的i个周期内不应分派来自对应线程的被引用的指令USE A。i的值可被设为如以上所讨论地从查找表或其它源确定的不分派计数。这是有好处的,因为来自其它线程的指令可能在“LD A”和“USE A”的分派之间出于其它原因被分派。分派器可对照由值“i”所指定的计数所需间隔来对为其它线程使用的这些分派槽进行计数。
图6E示出两个处理器指令集的一个实施例,该例示出不分派指令的生成。不分派指令包括处理周期和后续指令引用不分派信息。类似于图6C的指令集682,指令集696包括LD A,LD B,USE A和OR A,1处理器指令。如以上参考指令集682所讨论,当USE A处理器指令试图在LD A处理器指令更新了‘A’以前对其进行引用时,它将引起停顿。指令集697包括LD A,ND i,j处理器指令698,LD B,USEA和OR A,1处理器指令。不分派指令698被插入到指令集697中LD A指令以后、引起停顿的USE A指令以前的位置。不分派指令698的j参数引用USE A指令。
处理器指令693指示,当USE A指令被读取时,分派单元230在指令LD A被分派以后的i个周期内不应分派来自对应线程的被引用的指令USE A。如图所示,被引用的引起停顿的指令不一定要是就在特定线程中包含不分派信息的指令后面的指令。周期个数i与不分派计数相关联,并可按如上述所确定地被检索和推导。
尽管图6B-E示出将具有一个或两个值(i或i,j)的不分派信息添加到指令流中,但是可用类似方式将其它格式的不分派信息插入到指令流中。例如,包括三个值(i,j,k)的不分派信息可如本文中所讨论地被添加到指令流中。
尽管图6B-E示出不分派信息被添加到USE A指令处或恰好该指令以前,但是不分派信息可被插入到指令流中的其它地方。例如,在图6B中,ND信息可被添加到LD B指令中。因为LD B和USE A之间有一个指令,所以‘i’的值可被降为‘i-1’。由此,改变了的指令将是‘LD B ND i-1’。在接受求值的指令和引起停顿的指令之间的指令中的一个指令有空间添加不分派信息,而其它指令没有的情况下,这可能是特别有好处的。在不能容纳不分派信息的指令由于包括优化以避免停顿等其它原因必须出现在指令流中的特定位置的情况下,这也可能是有好处的。
在一个实施例中,不分派信息可取代现有的nop指令。例如,假定图6B中的指令序列本来是‘LD A,NOP,LD B,USE A’,且‘USE A’不能容纳不分派信息‘ND i’。那么,不是添加另一个指令,而是用ND i-1来替换NOP可能是有好处的。
在一些实施例中,该软件可在添加不分派信息以后重新检查指令集或指令映像。因为不分派信息会以已知方式改变指令执行顺序,所以其它优化是可能的。例如,假定在指令流中出现了数个NOP以延迟引起停顿的指令的分派。在添加了不分派信息以后,可能不再需要这些NOP,因为被添加到引起停顿的指令或该引起停顿的指令以前出现的另一个指令中的不分派信息将会延迟该引起停顿的指令的分派。由此,这些NOP不再被需要,并且可以被移除以缩小代码映像。在另一个实施例中,指令可被重新排序。在又一个实施例中,优化代码可确定指令现在可被重新排序以获得较优的性能。应用于指令集或指令映像的优化技术还可与检测停顿条件和插入不分派信息的技术相结合。
图7示出用于在由硬件在执行处理器指令期间检测停顿条件并生成不分派条件的方法700的一个实施例。在一个实施例中,方法700的步骤可由分派预解码单元220执行。在步骤710指令信息被接收。在一个实施例中,指令信息由分派预解码单元220从一个或多个取指令单元接收。指令信息可包括指令本身、指令存储器地址或其它指令信息。接下来,在步骤720,分派预解码单元220确定线程内是否存在停顿条件。在一个实施例中,确定是否存在停顿条件包括访问与取指令单元相关联的指令,并确定任意两个或多个指令是否会引起停顿条件。此过程类似于以上参考图5所讨论的过程。
如果确定在特定线程内不存在任何停顿条件,则操作前进至步骤750。如果确定在线程内存在停顿条件,则操作前进至步骤730。在步骤730,从停顿条件查找表或某个其它源检索不分派计数。在一些实施例中,不分派计数可以从存储在存储器中的停顿条件查找表中检索,或者由停顿中所涉及的指令推导出。在步骤730确定的不分派计数以及线程标识信息随即在步骤740被发送到分派单元230。分派单元230约在分派预解码单元220接收引起停顿的指令的同时从其接收针对特定线程的不分派计数。分派单元230在与不分派计数相关联的时段内避免分派来自该特定线程的引起停顿的指令。操作从步骤740前进至步骤750。
在步骤750,分派预解码单元220确定在两个或多个线程之间是否存在停顿条件。在一个实施例中,分派预解码单元220可检测到多线程之间现有的分析指令的系统和软件原先不能检测到的停顿。在一个实施例中,为确定来自不同线程的指令之间是否存在停顿,分派预解码单元220访问或接收来自两个或多个线程的指令信息流。分派预解码单元随即确定来自一个线程的指令是否引起来自另一线程的指令的停顿。除了来自多个线程的处理器指令被访问和比较以外,此过程类似于以上参考图5所描述的过程。一个以上线程之间存在停顿条件的例子包括线程之间的紧密编排的信息共享。
如果两个或多个线程之间不存在停顿条件,则操作前进至步骤780。如果两个或多个线程之间的确存在停顿条件,则在步骤760从停顿条件查找表或其它源检索不分派计数。这是以和在步骤730检索不分派计数相同的方式执行的。在一个实施例中,不分派计数包括三个值。第一个是指向引起停顿的指令的指针(包括线程标识符),而第二个和第三个定义其间不应分派引起停顿的指令的时段。此方法在上文已更加详细地讨论,并且在试图避免引起停顿的指令被不同线程执行的时候特别有用。
接下来,在步骤770,不分派信息和线程标识信息被发送到对应于特定线程的分派单元230。与不分派计数相关联的线程是包含该指令的线程。分派单元230在与不分派计数相关联的时段内避免分派来自特定线程的引起停顿的指令。在不分派信息被发送以后,操作前进至步骤780。
在一个实施例中,方法600和方法700被合并。在指令映像的生成期间,软件可确定停顿条件中很可能涉及哪些指令。该软件随即将不分派预解码信息添加到这些指令中,或添加到标识停顿条件中很可能涉及的指令的新指令中。在执行期间,分派预解码230检查对应于此不分派预解码信息的指令。分派预解码230随即实现方法700,以将停顿条件中很可能涉及的指令视为被不分派预解码信息标识为接受求值的指令。
在步骤780,分派预解码单元220确定线程分派单元230是否有其它指令信息要被处理。如果存在其它指令信息,则操作前进至步骤710。如果没有任何其它指令信息需要被处理,则操作在步骤790结束。
分派单元230处理来自IFU 210-214的指令,以及由分派预解码220如以上在方法700中所讨论地生成的不分派信息。图8A示出分派单元230的一个实施例。分派单元230包括指令解码和分派仲裁(IDDA)882和不分派历史(NDH)884。NDH 884从分派预解码220接收不分派信息。IDDA 882从一个或多个取指令单元接收指令,并被连通地耦合到NDH 884和执行管道240-246。分派单元230的操作将在以下参考图8B的方法800进行描述。
图8B示出用于由图8A的指令解码和分派仲裁882处理包括不分派信息的指令集的方法800的一个实施例。在一个实施例中,处理器指令是由图4、5和6A的方法生成,并根据方法800的步骤被处理。方法800在步骤810以由IDDA 882从IFU接收处理器指令开始。处理器指令可从IFU 210-214接收。
接下来,在步骤820确定处理器指令是否包括不分派信息。如果处理器指令不包含不分派信息,则操作前进至步骤840。如果在步骤810接收的处理器指令包含不分派信息,则操作前进至步骤830。在步骤830,指令中所包含的不分派信息被检索并发送到NDH 884。将不分派信息与特定指令或特定线程相关联所需的任何信息被包括在发送到NDH的信息中。操作随即前进至步骤835,在该处IDDA向NDH发送指令ID信息。此指令ID信息指示从IFU接收并且未被丢弃的指令的标识信息。在一些实施例中,指令可仅包含不分派信息。在此类实施例中,可向NDH标识那些指令,以使NDH知道该指令将不会被分派。从NDH传回的关于指令的任何信息将包括该指令的ID。操作随即前进至步骤840。
接下来,在步骤840,IDDA 882从NDH 884接收与已在步骤810从IFU接收但尚未被分派到执行单元的每个指令相关联的不分派状态。在一个实施例中,dispatch_prohibited(分派禁止)的不分派状态指示相关联的指令不应被分派,而dispatch_ok(分派允许)的不分派状态设置指示相关联的指令应被分派。在一些实施例中,在步骤840接收的不分派状态完全是从在步骤830中发送到NDH的不分派信息推导出的。在一些实施例中,不分派状态完全是从由分派预解码220发送到NDH的其它不分派信息推导出的。在一些实施例中,不分派状态是从在步骤830发送到NDH的不分派信息和从由分派预解码220发送到NDH的不分派信息推导出的。操作随即前进至步骤850。
接下来,IDDA创建未分派指令集,它包括其在步骤810中所接收的、但未在步骤850被分派的每一条指令。IDDA检查未分派指令集中每一条指令的不分派状态,以创建未分派指令的一个子集。如果对应于一指令的不分派状态指示它不应被分派,则它将不被包括在该子集中。操作随即前进至步骤860,在该处IDDA确定步骤850中所标识的指令子集中的哪些指令被预定发往可用的执行管道。此指令集被称为可分派指令集。
操作随即前进至步骤870,在该处IDDA在可分派指令集中的指令之间进行仲裁,并基于优先级从该可分派指令集中选择一个或多个指令。在一个实施例中,指令仲裁和选择可按本领域中的已知方式来执行。在一个实施例中,线程之间的仲裁包括从具有最高优先级的一个或多个取指令单元选择一个或多个可用指令。在一个实施例中,较高的优先级被给予来自具有较高优先级的线程的指令。在一些实施例中,取决于可用的执行单元,较低优先级的线程可能被分派。在执行管道中间选择的指令可由本领域中所公知的一种或多种算法来确定。接下来,在步骤880,IDDA发送对应于将被分派到NDH的每个指令的指令ID。操作前进至步骤890,在该处IDDA将所选择的指令分派到适当的执行管道。
图9示出用于由图8A的不分派历史(NDH)884处理包括不分派信息的指令集的方法900的一个实施例。首先,在步骤910,NDH从分派预解码220接收不分派信息。此信息按以上参考方法700所讨论地、或由分派预解码220生成。接下来,在步骤920,NDH从IDDA接收不分派信息。该不分派信息如以上参考方法800中的步骤830所描述。然后,在步骤930,NDH从IDDA接收指令ID信息。所接收的指令ID信息是如以上参考方法800的步骤835所述地由IDDA发送的信息。
在步骤950,NDH使用在步骤910、920、930和940中所获得的信息来保持对应于每个指令的不分派状态。保持对应于指令的不分派信息可用数种方式来执行。在一个实施例中,NDH接收周期计数i、线程标识符以及指令ID。NDH随即将所标识的线程中在由指令ID所标识的指令以后的每一个指令的不分派状态设为dispatch_prohibited的设置。保持此状态,直至NDH在步骤940被通知该指令ID所标识的指令被分派的i个周期的计数以后。然后,不分派状态将被设为dispatch_ok。
在另一个实施例中,NDH 884接收包括两个值‘i’和‘j’的不分派计数以及相关联的第一指令ID和线程。值j被NDH用来标识第二指令ID。NDH随即将与第二指令ID相关联的不分派状态设为dispatch_prohibited,直至它观察到由第一指令ID所引用的指令的分派的i个周期以后。
在另一个实施例中,NDH接收周期计数i和j、第一指令ID、值‘k’以及线程标识符。值k被NDH用来推导第二指令ID。NDH随即将与第二指令ID相关联的不分派状态设为dispatch_ok的设置,直至在与第一指令ID相关联的指令已被分派以后i个周期的计数已经过去。然后,NDH将与第二指令ID相关联的不分派状态设为dispatch_prohibited,直至j个周期的计数已经过去。在j个周期已经过去以后,与第二指令ID相关联的不分派状态被设为dispatch_ok。
回到方法900,在步骤950以后,NDH在步骤960标识与在步骤930所接收的指令ID相关联、但未在步骤940接收到的所有指令,并向IDDA传送这些指令中的每一个的不分派状态。这表示由IDDA接收的、但未由IDDA分派的指令集。
图7和图8分别示出的方法700和800可被同时应用于处理器指令。这使指令处理系统能够通过在为停顿条件分析处理器指令的同时认出处理器指令中的不分派信息来避免停顿。同时执行这两个方法能够捕捉更多停顿条件,并提供更稳定的处理环境。
以上对本发明的详细描述是出于说明和描述的目的而给出的。它并不试图进行穷举,或将本发明局限于所揭示的精确形式。根据以上教导,许多修改和变体都是可能的。选择所描述的这些实施例是为了最好地解释本发明的原理及其实际应用,以由此使本领域其它技术人员能够根据适用于所构想的特定用途,以各种实施例并用各种修改来最好地利用本发明。本发明的范围旨在由所附权利要求书定义。
权利要求
1.一种用于将不分派信息添加到指令流中的方法,包括访问指令集;检测所述指令集中的停顿条件以及将不分派信息插入到所述指令集中,其中所述不分派信息是从所述停顿条件推导出的。
2.如权利要求1所述的方法,其特征在于,所述插入不分派信息包括在所述指令集的编译期间将不分派信息插入到所述指令集中。
3.如权利要求1所述的方法,其特征在于,所述插入不分派信息包括在所述指令集的执行期间将不分派信息插入到所述指令集中。
4.如权利要求3所述的方法,其特征在于,所述检测停顿条件包括检测两个或多个线程的指令之间的停顿条件。
5.如权利要求1所述的方法,其特征在于,所述插入不分派信息包括将带有不分派信息的新指令添加到所述指令集中,将不分派信息添加到所述指令集内的现有指令中,或者用带有不分派信息的新指令替换所述指令集中的现有指令。
6.如权利要求1所述的方法,其特征在于,所述不分派信息包括周期数,周期数和对引起停顿的指令的引用,或者最小周期数和最大周期数以及对所述引起停顿的指令的引用。
7.如权利要求6所述的方法,其特征在于,所述不分派信息是从一组有限的值中选择的。
8.如权利要求1所述的方法,其特征在于,还包括对带有所述不分派信息的指令集进行优化。
9.如权利要求8所述的方法,其特征在于,所述优化包括分析带有所述不分派信息的所述指令集,以找出第二停顿条件。
10.如权利要求8所述的方法,其特征在于优化包括添加其它不分派信息。
11.一种用于处理指令的系统,包括能够提供指令集的一个或多个取指令单元;被配置成从所述一个或多个取指令单元接收所述指令集的分派单元;以及被配置成从所述分派单元接收指令的一个或多个执行管道,所述分派单元能够响应于接收所述指令集中的不分派信息而延迟指令到所述一个或多个执行管道的分派。
12.如权利要求11所述的系统,其特征在于,所述不分派信息包括周期数,周期数和对引起停顿的指令的引用,或者第一指令需要资源的周期数、在其后第二指令将会需要使用所述资源的周期数、以及对所述第二指令的引用。
13.如权利要求12所述的系统,其特征在于,所述不分派信息是从一组有限的值中选择的。
14.如权利要求11所述的系统,其特征在于,一个或多个指令包含所述不分派信息,所述分派单元能够丢弃包含所述不分派信息的所述一个或多个指令。
15.如权利要求11所述的系统,其特征在于,所述不分派信息与取指令单元的一个或多个指令相关联,所述分派单元能够从不与所述不分派信息相关联的取指令单元分派指令,而与此同时与所述不分派信息相关联的指令不被分派。
16.一种用于处理指令的系统,包括能够提供指令集的一个或多个取指令单元;被配置成从所述一个或多个取指令单元接收所述指令集的分派单元;能够从所述一个或多个取指令单元接收所述指令集并生成不分派信息的分派预解码;以及被配置成从所述分派单元接收指令的一个或多个执行管道,所述分派单元能够响应于接收来自所述分派预解码的不分派信息而延迟指令到所述一个或多个执行管道的分派。
17.如权利要求16所述的系统,其特征在于,所述不分派信息包括周期数,周期数和对引起停顿的指令的引用,或者最小周期数和最大周期数以及对所述引起停顿的指令的引用。
18.如权利要求17所述的系统,其特征在于,所述不分派信息是从一组有限的值中选择的。
19.如权利要求16所述的系统,其特征在于,一个或多个指令包含补充的不分派信息,所述分派单元能够丢弃包含所述补充的不分派信息的所述一个或多个指令。
20.如权利要求16所述的系统,其特征在于,所述指令集包括实际指令和不分派指令,所述系统能够同时处理所述实际指令和所述不分派指令。
全文摘要
检测与一个或多个线程内的处理器指令相关联的停顿条件并生成不分派条件。停顿条件可由硬件和/或软件在处理器指令执行以前和/或期间检测到。可将不分派条件与处理周期的个数以及来自特定线程的指令相关联。生成不分派条件的结果是,来自其它线程的处理器指令可被分派到可用的执行管道的执行槽中。在一段时间以后,与停顿相关联的指令可被取出并被执行。
文档编号G06F9/38GK1825276SQ20061000467
公开日2006年8月30日 申请日期2006年1月24日 优先权日2005年2月24日
发明者S·E·卡丽 申请人:微软公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1