会员体验
专利管家(专利管理)
工作空间(专利管理)
风险监控(情报监控)
数据分析(专利分析)
侵权分析(诉讼无效)
联系我们
交流群
官方交流:
QQ群: 891211   
微信请扫码    >>>
现在联系顾问~
首页 / 专利库 / 软件 / 数据处理 / 数据处理

数据处理

阅读:585发布:2020-05-13

IPRDB可以提供数据处理专利检索,专利查询,专利分析的服务。并且公开了一种数据处理装置,数据处理方法,方法和计算机程序产品。数据处理装置包括:处理器核心,能够操作用于执行多个程序线程的指令序列,所述处理器核心具有多个流水线级,所述流水线级之一是具有调度逻辑的指令调度级,所述调度逻辑能够操作用于:响应于程序线程内的线程暂停指令,阻止调度来自所述程序线程的在所述线程暂停指令之后的指令,而是调度来自另一个程序线程的指令以在所述多个流水线级内执行。以这种方式,数据处理装置不需要确定指令之间是否存在依赖性,而是可以简单地继续发出指令,直到接收到暂停指令。这显著简化了处理器核心的操作。,下面是数据处理专利的具体信息内容。

1.一种数据处理装置,包括:

处理器核心,能够操作用于执行多个程序线程的指令序列,所述处理器核心具有:多个流水线级,所述流水线级中的一个是具有调度逻辑的指令调度级,所述调度逻辑能够操作用于:响应于程序线程内的线程暂停指令,阻止调度来自所述程序线程的在所述线程暂停指令之后的指令,而是调度来自另一程序线程的指令以在所述多个流水线级内执行;以及待完成单元,能够操作用于识别来自程序线程的执行指令,所述执行指令来自被分类为不可能及时执行以使其结果可供所述程序线程内的后续指令使用的指令组,并且所述调度逻辑能够操作用于当所述待完成单元指示来自程序线程的在所述线程暂停指令之前的执行指令来自所述指令组时阻止对所述程序线程的重新调度。

2.根据权利要求1所述的数据处理装置,其中,所述调度逻辑能够操作用于在所述待完成单元指示程序线程内的在所述线程暂停指令之前的执行指令将及时使其结果可供后续指令使用时,允许重新调度所述程序线程。

3.根据权利要求2所述的数据处理装置,其中,当要执行的指令来自所述指令组时,所述调度逻辑能够操作用于向所述待完成单元提供指示。

4.根据前述权利要求中任一项所述的数据处理装置,其中,当要执行的指令来自所述指令组时,所述指令调度级能够操作用于指示处理单元执行所述指令。

5.根据权利要求4所述的数据处理装置,其中,当要执行的指令来自所述指令组时,所述调度逻辑能够操作用于通过提供对要执行的指令的指示以及在所述处理单元执行之后要更新的任何寄存器来指示所述处理单元执行所述指令。

6.根据权利要求4或5所述的数据处理装置,其中,当执行指令完成执行时,所述处理单元能够操作用于提供对所述执行指令的指示和所述要更新的寄存器。

7.根据权利要求4-6中任一项所述的数据处理装置,其中,当确定执行指令将完成时,所述处理单元能够操作用于在所述执行指令完成执行之前向所述待完成单元指示所述执行指令将完成执行。

8.根据前述权利要求中任一项所述的数据处理装置,其中,所述调度逻辑能够操作用于:响应于所述程序线程内的线程暂停指令,当所述待完成单元指示所述程序线程内的在所述线程暂停指令之前的任何执行指令来自所述指令组时,阻止调度所述程序线程内的在所述线程暂停指令之后的所有指令,而是调度来自另一程序线程的指令以供执行。

9.一种数据处理方法,包括:

使用具有多个流水线级的处理器核心执行多个程序线程的指令序列;

响应于程序线程内的线程暂停指令,阻止调度来自所述程序线程的在所述线程暂停指令之后的指令,而是调度来自另一程序线程的指令以在所述多个流水线级内执行;以及识别来自程序线程的执行指令,所述执行指令来自被分类为不可能及时执行以使其结果可供所述程序线程内的后续指令使用的指令组,并且当指示来自程序线程的在所述线程暂停指令之前的执行指令来自所述指令组时,阻止对所述程序线程的重新调度。

10.一种数据处理装置,包括:

处理器核心,能够操作用于执行程序线程的指令序列,所述处理器核心具有:多个流水线级,以及

待完成单元,能够操作用于识别来自正在由所述处理器核心执行的所述程序线程的指令,所述指令被分类为不可能及时执行以使其结果可供后续指令使用,所述流水线级之一是具有调度逻辑的指令调度级,所述调度逻辑能够操作用于响应于所述程序线程内的线程暂停指令,当所述待完成单元指示正在由所述处理器核心执行的所述程序线程内的先前指令不能保证及时使其结果可供所述程序线程内的后续指令使用时,暂停调度所述后续指令。

11.一种数据处理方法,包括:

使用具有多个流水线级的处理器核心执行程序线程的指令序列;

识别来自正在由所述处理器核心执行的所述程序线程的指令,所述指令被分类为不可能及时执行以使其结果可供后续指令使用;

响应于所述程序线程内的线程暂停指令,当指示正在由所述处理器核心执行的所述程序线程内的先前指令不能保证及时使其结果可供所述程序线程内的后续指令使用时,暂停调度所述后续指令。

12.一种编译指令序列的方法,所述指令序列由具有多个流水线级的处理器核心执行,所述方法包括:将所述指令分组成片段,每个片段包括被分类为不可能及时执行以使其结果可供所述片段内的后续指令使用的至少一个指令;以及用线程暂停指令终止每个片段。

13.根据权利要求12所述的方法,其中,至少一个片段包括被分类为不可能及时执行以使其结果可供所述片段内的后续指令使用的多个指令。

14.根据权利要求12或13所述的方法,其中,被分类为不可能及时执行以使其结果可供所述片段内的后续指令使用的所述多个指令中的每一个指令互相间没有任何依赖性。

15.根据权利要求12-14中任一项所述的方法,其中,至少一个片段包括能够及时执行以使其结果可供所述片段内的后续指令使用的至少一个指令。

16.根据权利要求12-15中任一项所述的方法,其中,至少一个片段包括能够及时执行以使其结果可供所述片段内的后续指令使用的多个指令。

17.根据权利要求12-16中任一项所述的方法,其中,能够及时执行以使其结果可供所述片段内的后续指令使用的所述多个指令中的每一个指令互相间具有依赖性。

18.根据权利要求12-17中任意一项所述的方法,其中,所述分组包括:基于所述指令之间的依赖性,使用有向图从起始节点对所述指令排序;

对于所述有向图内的每条指令,确定所述指令与所述起始节点之间的被分类为不可能及时执行以使其结果可供后续指令使用的指令的数量;

将具有相同数量的指令的每条指令分配给针对于所述数量的存储桶,所述相同数量的指令被分类为不可能及时执行以使其结果可供所述指令之间的后续指令使用;

对每个存储桶中的指令进行排序以创建每个片段,且用所述线程暂停指令终止每个片段,其中,依赖于较早指令的指令在列表中被排序为出现在所述较早指令之后;

将每个片段级联在一起以形成编译的指令序列,所述指令序列从与具有最少数量的被分类为不可能及时执行以使其结果可供后续指令使用的指令的存储桶相关联的片段开始。

19.一种计算机程序产品,当在计算机上执行时,所述计算机程序产品能够操作用于执行根据权利要求9和11至18中任一项所述的方法步骤。

说明书全文

数据处理

技术领域

[0001] 本发明涉及数据处理装置、数据处理方法、方法和计算机程序产品。

背景技术

[0002] 传统的微处理器一个接一个地发布和执行单个指令。这些指令通常对两个标量值执行单个操作,产生结果。单发布变体每个时钟周期发出一个指令,然后由执行单元之一处理。执行单元通常至少包括加法器、乘法器、加载/存储单元和分支单元。尽管操作系统可能会通过配置处理器以一定的时间间隔在线程之间切换来创建多个并发线程的错觉,但是像这样的处理器一次只运行一个程序线程,属于一组单线程处理器。尽管这些类型的处理器性能低下,但它们的硅面积也很小,因此每硅面积的性能都合理。
[0003] 一些处理器变体可以同时发布和执行多个指令。这些多发布变体在指令流中向前遍历,以查找可由不同执行单元并行处理的指令。为了提高性能,处理器也可能有多个选定执行单元的实例。这导致每个程序线程的快速执行。但是,线程中指令之间的依赖性限制了可以并行执行的指令数量,使执行单元不被使用,并且提取并行指令所需的逻辑需要大量的硅面积和功率。用于路由往返于执行单元的值的路由逻辑也很重要。结果是以每硅面积的性能和每瓦性能来衡量,效率差。
[0004] 一种能够实现每硅面积更高性能的处理器被称为单指令多数据(SIMD处理器)。这种类型的处理器在固定宽度的矢量而不是标量值上运行。使用矢量化执行单元,每个指令一次对多个标量执行操作,这些执行单元由排列在不同通道中的标量单元阵列构成。SIMD处理器可以是单发布处理器或多发布处理器。然而,编程器或源语言编译器通常不能使用矢量表达要执行的操作,在许多情况下仅利用矢量化执行单元的一个通道。
[0005] 另一种可以实现每硅面积更高性能的处理器称为超长指令字处理器(VLIW处理器),其中每条指令描述处理器中所有执行单元的操作。这样,所有的执行单元都可以在每个周期内运行,而不需要多发布硬件。
[0006] 最简单的多发布SIMD和VLIW处理器一次只运行一个线程,因此可以称为单线程处理器。
[0007] 尽管这些处理器提供了有用的数据处理功能,但它们各有其缺点。因此,希望提供改进的数据处理技术。

发明内容

[0008] 根据第一方面,提供了一种数据处理装置,包括:处理器核心,能够操作用于执行多个程序线程的指令序列,所述处理器核心具有多个流水线级,所述流水线级之一是具有调度逻辑的指令调度级,所述调度逻辑能够操作用于:响应于程序线程内的线程暂停指令,阻止调度来自所述程序线程的在所述线程暂停指令之后的指令,而是调度来自另一程序线程的指令以在所述多个流水线级内执行。
[0009] 该第一方面认识到一些指令比其他指令更快执行。也就是说,与其他指令相比,某些指令会更早使指令的结果可供后续指令使用。特别是,有些指令的执行需要第一数量的周期,而另一些指令的执行则需要大于第一数量的周期。所采用的周期数的差异可能出于各种原因,但对于那些必须从存储器或其他存储装置访问数据或者需要由不属于处理器核心的一部分的硬件来执行的指令而言,这是特别成问题的。执行时间的这种差异导致流水线处理器的常见性能限制因素,即它们必须停止并等待(拖延)指令完成的时间量。也就是说,如果后续指令在先前指令的结果可用之前需要该结果,则需要拖延后续指令直到结果可用。
[0010] 已经开发了各种技术来尝试减少该性能限制因素。如上所述,典型的程序涉及一些需要执行的执行速度较快以及执行速度较慢的指令,并且如果需要,使那些指令的结果可供后续指令使用。提高性能的一种方法是尝试尽可能以重叠的方式执行那些执行较慢的指令。然而,这可以被实现的程度取决于处理器检测指令之间的依赖性(或缺乏依赖性)的能力,以便它可以确定哪些指令可以重叠(因为这些指令之间不存在依赖性),以及哪些必须一个接一个地顺序运行(因为这些指令之间存在依赖性)。运行单个(或在某些情况下,两个)线程的常规高端处理器在复杂方案上牺牲很多硅面积、复杂性和功耗,这些复杂方案旨在尽可能地发出重叠的执行速度慢的指令。这些技术包括推测性执行和错序(out-of-order)执行(使用指令依赖性分析和指令重新排序)。多线程处理器发出来自不同线程的重叠指令,因为它们之间没有依赖性。即使单个线程正在等待某些指令完成,其他线程仍然可以执行。但是,硅面积的使用量会随着处理器所支持的线程数量的增加而增长,这就限制了可以通过这种方式实现的性能。上述用于实现具有一个或两个线程的高端处理器中的指令的重叠执行的技术很少在深度多线程处理器中实现,这是由于必须同时维持用于大量线程的这些算法所需的复杂状态的开销。
[0011] 因此,可以提供一种数据处理装置。数据处理装置可包括处理器核心。处理器核心可以是可操作,可配置或适用于执行指令序列。那些指令序列可以来自多个不同的程序线程。也就是说,处理器核心可以用于执行多个程序线程。那些程序线程可以来自单个程序线程库,或者可以来自可独立调度的不同程序线程库。处理器核心可具有多个流水线级。流水线级之一可以是指令调度级。指令调度级可具有调度逻辑。当在程序线程内遇到线程暂停指令时,调度逻辑可以阻止从该程序线程调度指令。也就是说,处理器核心可以用于在任何一个时间调度单个程序线程。调度逻辑可以阻止来自该程序线程的调度指令,并且调度逻辑可以替代地调度来自不同程序的指令以在流水线级内执行。以这种方式,数据处理装置本身不需要确定指令之间是否存在依赖性,而是可以简单地继续从线程调度指令直到接收到暂停指令。当发生这种情况时,数据处理装置可以简单地在该程序线程库内切换线程,改为开始从该程序线程库内的另一个可调度程序线程发出指令。这显著简化了处理器核心的操作。
[0012] 在一个实施例中,所述调度逻辑能够操作用于调度来自程序线程的不同于所述线程暂停指令的指令,而不管这些指令之间的任何依赖性。因此,调度逻辑可以被配置为简单地调度指令而不考虑那些指令之间是否存在任何依赖性。备选地,可以对例如低延迟指令进行简单的依赖性检查。
[0013] 在一个实施例中,数据处理装置包括待完成单元,用于识别来自程序线程的执行指令,所述执行指令来自被分类为不可能及时执行以使其结果可供该程序线程内的后续指令使用的指令组,所述调度逻辑能够操作用于当所述待完成单元指示来自程序线程的在所述线程暂停指令之前的执行指令来自所述指令组时阻止对所述程序线程的重新调度。因此,待完成单元可以识别程序线程内正在由处理器核心执行的指令。待完成单元可以识别被分类为,识别为或已知具有比后续指令可能要求该指令的结果可用的时间更长的执行时间的那些指令。换句话说,待完成单元可以识别指令应该在X个周期内使其结果可用,以便该结果可用于后续指令,但是所识别的一些指令花费长于X个周期的时间以使其结果可用。然后,当调度单元被指示来自程序线程的在线程暂停指令之前的执行指令仍在执行时,调度单元可以阻止对该程序线程的重新调度。换句话说,当有尚未完成执行的来自该程序线程的未完成指令时,阻止该程序线程被重新调度。待完成单元可以保持对那些可能花费大于X个周期执行并且仍在执行中的指令的指示。当这些指令仍在执行时,待完成单元会阻止那些正在执行的指令所源自的线程被重新调度。以这种方式,调度逻辑可以容易地选择不同的线程以在出现线程暂停指令时进行调度,并且确保不选择调度那些具有仍在执行的指令的线程。这显著简化了处理器核心的操作。
[0014] 在一个实施例中,调度逻辑能够操作用于在待完成单元指示程序线程内的在所述线程暂停指令之前的执行指令来自所述指令组时,阻止调度所述程序线程内的所有后续指令。相应地,程序线程内的每个后续指令可能会使其调度暂停。换句话说,这些指令将保持不被调度。
[0015] 在一个实施例中,调度逻辑能够操作用于在待完成单元指示程序线程内的在所述线程暂停指令之前的执行指令将及时使其结果可供后续指令使用时,允许重新调度所述程序线程。因此,当待完成单元指示先前指令现在将使其结果可用时,可以恢复对该线程内的指令的调度。
[0016] 在一个实施例中,调度逻辑能够操作用于在待完成单元指示程序线程内的在所述线程暂停指令之前的所有执行指令将及时使其结果可供后续指令使用时,允许重新调度所述程序线程。因此,当待完成单元指示每个指令都将使其结果可供后续指令使用时,可以恢复对该线程内的指令的调度。
[0017] 在一个实施例中,调度逻辑能够操作用于在待完成单元指示程序线程内在所述线程暂停指令之前没有执行指令不能及时使其结果可供后续指令使用时,允许重新调度所述程序线程。
[0018] 在一个实施例中,调度逻辑能够操作用于:当要执行的指令来自所述指令组时,向待完成单元提供指示。因此,当该组指令中的一个被识别出时,可以向待完成单元提供指示。
[0019] 在一个实施例中,指令调度级能够操作用于:当要执行的指令来自所述指令组时,指示处理单元执行该指令。因此,当确定指令落入不太可能及时使其结果可供后续指令使用的指令组内时,可以指示处理单元执行该指令。
[0020] 在一个实施例中,调度逻辑能够操作用于:当要执行的指令来自所述指令组时,通过提供对要执行的指令的指示以及在处理单元执行之后要更新的任何寄存器来指示处理单元执行所述指令。因此,可向处理单元提供对要执行的指令的指示以及在处理单元执行指令之后需要更新的任何寄存器。
[0021] 在一个实施例中,处理单元能够操作用于:当执行指令完成执行时,提供对执行指令的指示和要更新的寄存器。因此,处理单元可以提供对哪个指令已经完成的指示,并且可选地,提供要更新的寄存器的内容和值。
[0022] 在一个实施例中,处理单元能够操作用于:当确定执行指令将完成时,向待完成单元指示执行指令将完成执行。因此,当处理单元确定指令的执行将完成时,向待完成单元提供指示。
[0023] 在一个实施例中,处理单元能够操作用于:当确定执行指令将完成时,在执行指令完成执行之前向待完成单元指示执行指令将完成执行。因此,可以在指令实际完成之前将指示提供给待完成单元。例如,处理单元可以具有关于在后续指令可能需要处理单元正在执行指令的结果之前将花费X个周期的信息,并且处理单元然后可以在已知由处理单元正在执行的指令将完成并且在X个周期中使其结果可用时向待完成单元提供指示。这使得即使先前指令的结果尚不可用也能够调度后续指令,因为已知这些结果在后续指令可能需要它们时将会可用。
[0024] 在一个实施例中,待完成单元具有计数器,该计数器在来自程序线程的执行指令来自所述指令组时进行识别,并且调度逻辑能够操作用于每当来自程序线程的执行指令来自所述指令组时改变计数器的值。因此,可以保持对不可能及时执行以使其结果可供后续指令使用的指令的数目的简单计数。如果计数器被清除,则表明没有待处理的指令,而如果计数器被设置,则表明存在一些待处理的指令。
[0025] 在一个实施例中,处理单元能够操作用于每当确定执行指令将完成时改变计数器的值。
[0026] 在一个实施例中,计数器的值提供对来自程序线程的执行指令有多少个来自所述指令组的指示。
[0027] 在一个实施例中,调度逻辑能够操作用于:响应于程序线程内的线程暂停指令,当待完成单元指示所述程序线程内的在所述线程暂停指令之前的任何执行指令来自所述指令组时,阻止调度该程序线程内的在所述线程暂停指令之后的所有指令,而是调度来自另一程序线程的指令以供执行。相应地,多个不同的程序线程可以由相同的处理器核心执行。当遇到暂停线程指令并且待完成单元指示存在未完成的指令时,可以暂停当前线程的调度,且代之以调度不同的线程。应该理解,即使当一个特定的线程不能再被调度执行时,线程之间的切换也能够维持处理器核心的执行吞吐量。这有助于最大限度地提高处理器的性能。
[0028] 在一个实施例中,所述多个程序线程包括程序线程库,并且所述调度逻辑能够操作用于根据库调度序列在多个程序线程库之间进行调度,以阻止调度来自线程库内的程序线程的在所述线程暂停指令之后指令,而是调度来自线程库内的另一个程序线程的指令,以在多个流水线级内执行。因此,可能使它们的调度交错的每个线程库被彼此独立地处理。
[0029] 在一个实施例中,所述多个程序线程包括程序线程库,并且调度逻辑能够操作用于根据库调度序列在多个程序线程库之间进行调度,并且响应于该程序线程内的线程暂停指令,当待完成单元指示所述程序线程内的在所述线程暂停指令之前的任何执行指令来自所述指令组时,阻止调度该程序线程内的在线程暂停指令之后的所有指令,而是调度来自线程库内的另一个程序线程的指令以供执行。因此,可能使它们的调度交错的每个线程库被彼此独立地处理。
[0030] 在一个实施例中,调度逻辑能够操作用于基于最近调度(1east-recently-scheduled)和循环调度(round-robin)之一调度来自另一个程序线程的指令。应当理解,可以使用各种不同的线程选择技术。
[0031] 在一个实施例中,线程暂停指令包括离散指令和被编码到另一指令中的指示符之一。因此,线程暂停指令可以是单独的指令。备选地,每个指令可以按指示该指令之后是否跟随有线程暂停的方式进行编码。
[0032] 在一个实施例中,所述指令组包括输入/输出指令、存储器访问指令、浮点指令和与共享资源有关的指令中的至少一个。
[0033] 根据第二方面,提供了一种数据处理方法,包括:使用具有多个流水线级的处理器核心执行多个程序线程的指令序列;响应于程序线程内的线程暂停指令,阻止调度来自所述程序线程的在所述线程暂停指令之后的指令,而是调度来自另一程序线程的指令以在所述多个流水线级内执行。
[0034] 在一个实施例中,该方法包括调度来自程序线程的除了所述线程暂停指令之外的每个指令,而不管这些指令之间的任何依赖性。
[0035] 在一个实施例中,该方法包括识别来自程序线程的执行指令,所述执行指令来自被分类为不可能及时执行以使其结果可供所述程序线程内的后续指令使用的指令组,并且当指示来自程序线程的在所述线程暂停指令之前的执行指令来自所述指令组时,阻止对所述程序线程的重新调度。
[0036] 在一个实施例中,该方法包括在指示程序线程内的在所述线程暂停指令之前的执行指令来自所述指令组时,阻止调度所述程序线程内的所有后续指令。
[0037] 在一个实施例中,该方法包括在指示程序线程内的在所述线程暂停指令之前的执行指令将及时使其结果可供后续指令使用时,允许重新调度所述程序线程。
[0038] 在一个实施例中,该方法包括在指示程序线程内的在所述线程暂停指令之前的所有执行指令将及时使其结果可供后续指令使用时,允许重新调度所述程序线程。
[0039] 在一个实施例中,该方法包括在指示程序线程内的在所述线程暂停指令之前没有执行指令不能及时使其结果可供后续指令使用时,允许重新调度所述程序线程。
[0040] 在一个实施例中,该方法包括当要执行的指令来自所述指令组时提供指示。
[0041] 在一个实施例中,该方法包括当要执行的指令来自所述指令组时,指示处理单元执行所述指令。
[0042] 在一个实施例中,该方法包括当要执行的指令来自所述指令组时,通过提供对要执行的指令的指示以及在处理单元执行之后要更新的任何寄存器来指示所述处理单元执行所述指令。
[0043] 在一个实施例中,该方法包括当执行指令完成执行时,提供对所述执行指令的指示和要更新的寄存器。
[0044] 在一个实施例中,该方法包括当确定执行指令将完成时,指示所述执行指令将完成执行。
[0045] 在一个实施例中,该方法包括当确定执行指令将完成时,在所述执行指令完成执行之前指示所述执行指令将完成执行。
[0046] 在一个实施例中,该方法包括每当来自程序线程的执行指令来自所述指令组时改变计数器的值。
[0047] 在一个实施例中,该方法包括每当确定执行指令将完成时改变计数器的值。
[0048] 在一个实施例中,计数器的值提供对来自程序线程的执行指令有多少个来自所述指令组的指示。
[0049] 在一个实施例中,该方法包括:响应于程序线程内的线程暂停指令,当指示所述程序线程内的在所述线程暂停指令之前的任何执行指令来自所述指令组时,阻止调度所述程序线程内的在所述线程暂停指令之后的所有指令,而是调度来自另一程序线程的指令以供执行。
[0050] 在一个实施例中,所述多个程序线程包括程序线程库,并且该方法包括根据库调度序列在多组程序线程之间进行调度,阻止调度来自线程库内的程序线程的在所述线程暂停指令之后指令,而是调度来自线程库内的另一个程序线程的指令,以在多个流水线级内执行。
[0051] 在一个实施例中,所述多个程序线程包括程序线程库,并且该方法包括根据库调度序列在多个程序线程库之间进行调度,并且响应于所述程序线程内的线程暂停指令,当待完成单元指示所述程序线程内的在所述线程暂停指令之前的任何执行指令来自所述指令组时,阻止调度该程序线程内的在所述线程暂停指令之后的所有指令,而是调度来自线程库内的另一个程序线程的指令以供执行。
[0052] 在一个实施例中,该方法包括基于最近调度和循环调度之一调度来自另一个程序线程的指令。
[0053] 在一个实施例中,线程暂停指令包括离散指令和被编码到另一(先前)指令中的指示符之一。
[0054] 在一个实施例中,所述指令组包括输入/输出指令、存储器访问指令、浮点指令和与共享资源有关的指令中的至少一个。
[0055] 根据第三方面,提供了一种数据处理装置,包括:处理器核心,能够操作用于执行程序线程的指令序列,所述处理器核心具有多个流水线级和待完成单元,所述待完成单元能够操作用于识别正在由所述处理器核心执行的程序线程的指令,所述指令被分类为不可能及时执行以使其结果可供后续指令使用,所述流水线级之一是具有调度逻辑的指令调度级,所述调度逻辑能够操作用于响应于所述程序线程内的线程暂停指令,当所述待完成单元指示正在由所述处理器核心执行的所述程序线程内的先前指令不能保证及时使其结果可供所述程序线程内的后续指令使用时,暂停调度所述后续指令。
[0056] 该第三方面认识到一些指令比其他指令更快执行。也就是说,与其他指令相比,某些指令会更早使指令的结果可供后续指令使用。特别是,有些指令的执行需要第一数量的周期,而另一些指令的执行则需要大于第一数量的周期。所采用的周期数的差异可能出于各种原因,但对于那些必须从存储器或其他存储装置访问数据或者需要由不属于处理器核心的一部分的硬件来执行的指令而言,这是特别成问题的。执行时间的这种差异导致流水线处理器的常见性能限制因素,即它们必须停止并等待(拖延)指令完成的时间量。也就是说,如果后续指令在先前指令的结果可用之前需要该结果,则需要拖延后续指令直到结果可用。
[0057] 已经开发了各种技术来尝试减少该性能限制因素。如上所述,典型的程序涉及一些需要执行的执行速度较快以及执行速度较慢的指令,并且如果需要,使那些指令的结果可供后续指令使用。提高性能的一种方法是尝试尽可能以重叠的方式执行那些执行较慢的指令。然而,这可以被实现的程度取决于处理器检测指令之间的依赖性(或缺乏依赖性)的能力,以便它可以确定哪些指令可以重叠(因为这些指令之间不存在依赖性),以及哪些必须一个接一个地顺序运行(因为这些指令之间存在依赖性)。运行单个(或在某些情况下,两个)线程的常规高端处理器在复杂方案上牺牲很多硅面积、复杂性和功耗,这些复杂方案旨在尽可能地发出重叠的执行速度慢的指令。这些技术包括推测性执行和错序执行(使用指令依赖性分析和指令重新排序)。多线程处理器发出来自不同线程的重叠指令,因为它们之间没有依赖性。即使单个线程正在等待某些指令完成,其他线程仍然可以执行。但是,硅面积的使用量会随着处理器所支持的线程数量的增加而增长,这就限制了可以通过这种方式实现的性能。而且,这些方法很少在多线程处理器中实现,因为必须同时为大量线程维持这些算法所需的复杂状态。
[0058] 因此,可以提供一种数据处理装置。数据处理装置可包括处理器核心。处理器核心可执行程序线程的指令序列。处理器核心可具有一个以上的流水线级。处理器核心可具有待完成单元。待完成单元可以识别程序线程内正在由处理器核心执行的指令。待完成单元可以识别被分类为,识别为或已知具有比后续指令可能要求该指令的结果可用的时间更长的执行时间的那些指令。换句话说,待完成单元可以识别指令应该在X个周期内使其结果可用,以便该结果可用于后续指令,但是一些指令被识别为花费长于X个周期的时间以使其结果可用。流水线级之一可以是指令调度级。指令调度级可以具有调度逻辑,所述调度逻辑调度程序线程内的后续指令。当在程序线程内遇到暂停指令时以及当待完成单元指示程序线程中的先前指令不会,不太可能或不能保证其结果及时供后续指令使用时,调度逻辑可以暂停后续指令的调度。换句话说,待完成单元可以保持对将要或可能会花费大于所定义数量的周期(例如,X个周期)来执行并且仍在执行中的那些指令的指示。如果遇到线程暂停指令,而待完成单元指示可能需要大于X个周期执行的先前指令仍在执行,则可暂停后续指令的调度。以这种方式,数据处理装置不需要确定指令之间是否存在依赖性,而是可以简单地继续发出指令,直到接收到暂停指令且不可能及时执行以供后续指令使用的较早指令仍未完成。这显著简化了处理器核心的操作。
[0059] 在一个实施例中,所述调度逻辑能够操作用于:响应于程序线程内的线程暂停指令,在待完成单元指示正在由处理器核心执行的程序线程内的先前指令不能保证及时使其结果可供后续指令使用时,暂停对程序线程内的所有后续指令的调度。相应地,程序线程内的每个后续指令可能会使其调度暂停。换句话说,这些指令将保持不被调度。
[0060] 在一个实施例中,调度逻辑能够操作用于:当待完成单元指示正在由处理器核心执行的程序线程内的先前指令将及时使其结果可供后续指令使用时,恢复调度程序线程内的后续指令。因此,当待完成单元指示先前指令现在将使其结果可用时,可以恢复对该线程内的指令的调度。
[0061] 在一个实施例中,调度逻辑能够操作用于:当待完成单元指示正在由处理器核心执行的程序线程内的先前指令将及时便其结果可供后续指令使用时,恢复调度程序线程内的后续指令。因此,当待完成单元指示每个指令将使其结果可供后续指令使用时,可以恢复对该线程内的指令的调度。
[0062] 在一个实施例中,调度逻辑能够操作用于:当待完成单元指示正在由处理器核心执行的程序线程内没有先前指令不能及时使其结果可供后续指令使用时,恢复调度程序线程内的后续指令。
[0063] 在一个实施例中,指令调度级能够操作用于:当要执行的指令是被分类为不可能及时执行以使其结果可供后续指令使用的一组指令之一时,指示处理单元执行该指令。因此,当确定指令落入不太可能及时使其结果可供后续指令使用的指令组内时,可以指示处理单元执行该指令。
[0064] 在一个实施例中,指令调度级能够操作用于:当要执行的指令是该组指令之一时,通过提供对要执行的指令的指示以及在处理单元执行之后要更新的任何寄存器来指示处理单元执行所述指令。因此,可向处理单元提供对要执行的指令的指示以及在处理单元执行指令之后需要更新的任何寄存器。
[0065] 在一个实施例中,多个级中的一个能够操作用于:当要执行的指令是该组指令之一时,向待完成单元提供指示。因此,当该组指令中的一个被识别出时,可以向待完成单元提供指示。
[0066] 在一个实施例中,处理单元能够操作用于:当确定指令的执行将完成时,向待完成单元指示指令将完成执行。因此,当处理单元确定指令的执行将完成时,向待完成单元提供指示。
[0067] 在一个实施例中,处理单元能够操作用于:当确定指令的执行将完成时,在所述指令完成执行之前向待完成单元指示指令将完成执行。因此,可以在指令实际完成之前将指示提供给待完成单元。例如,处理单元可以具有关于在后续指令可能需要处理单元在执行指令的结果之前将花费X个周期的信息,并且处理单元然后可以在已知由处理单元执行的指令将完成并且在X个周期中使其结果可用时向待完成单元提供指示。这使得即使先前指令的结果尚不可用也能够调度后续指令,因为已知这些结果在后续指令可能需要它们时将会可用。
[0068] 在一个实施例中,处理单元能够操作用于:当指令完成执行时,提供对执行的指令的指示和要更新的寄存器。因此,处理单元可以提供对哪个指令已经完成的指示,并且可选地,提供要更新的寄存器的内容和值。
[0069] 在一个实施例中,待完成单元具有计数器,该计数器在来自正在由处理器核心执行的程序线程的指令被分类为不可能及时执行以使其结果可供后续指令使用时进行识别,并且每当来自正在由处理器核心执行的程序线程的指令被分类为不可能及时执行以使其结果可供后续指令使用时,多个级之一能够操作用于改变计数器的值。因此,可以保持对不可能及时执行以使其结果可供后续指令使用的指令的数目的简单计数。如果计数器被清除,则表明没有待处理的指令,而如果计数器被设置,则表明存在一些待处理的指令。
[0070] 在一个实施例中,处理单元能够操作用于每当确定指令的执行将完成时改变计数器的值。
[0071] 在一个实施例中,计数器的值提供对有多少个来自正在由处理器核心执行的程序线程的指令被分类为不可能及时执行以使其结果可供后续指令使用的指示。
[0072] 在一个实施例中,所述指令组包括输入/输出指令、存储器访问指令、浮点指令和与共享资源有关的指令中的至少一个。
[0073] 在一个实施例中,处理器核心能够操作用于执行多个程序线程的指令序列,并且调度逻辑能够操作用于:响应于程序线程内的线程暂停指令,在待完成单元指示在正在由处理器核心执行的程序线程内的先前指令不能保证及时使其结果可供后续指令使用时,暂停调度所述程序线程内的所有后续指令,而是调度来自另一个程序线程的指令。相应地,多个不同的程序线程可以由相同的处理器核心执行。当遇到暂停线程指令并且待完成单元指示存在未完成的指令时,可以暂停当前线程的调度,且代之以调度不同的线程。应该理解,即使当一个特定的线程不能再被调度执行时,线程之间的切换也能够维持处理器核心的执行吞吐量。这有助于最大限度地提高处理器的性能。
[0074] 在一个实施例中,调度逻辑能够操作用于:响应于程序线程内的线程暂停指令,在待完成单元指示在执行的程序线程内的任何先前指令将不能及时使其结果可供后续指令使用时,暂停对程序线程内所有后续指令的调度,而是调度来自另一个程序线程的指令。
[0075] 在一个实施例中,调度逻辑能够操作用于:基于最近调度和循环调度之一调度来自另一个程序线程的指令。应当理解,可以使用各种不同的线程选择技术。
[0076] 在一个实施例中,线程暂停指令包括离散指令和被编码到另一指令中的指示符之一。因此,线程暂停指令可以是单独的指令。备选地,每个指令可以按指示该指令之后是否应该跟随有线程暂停的方式进行编码。
[0077] 根据第四方面,提供了一种数据处理装置,包括第一方面和第三方面的数据处理装置。因此,提供了一种数据处理装置,包括:处理器核心,能够操作用于执行多个程序线程的指令序列,所述处理器核心具有多个流水线级,所述流水线级之一是具有调度逻辑的指令调度级,所述调度逻辑能够操作用于:响应于程序线程内的线程暂停指令,阻止调度来自所述程序线程的在所述线程暂停指令之后的指令,而是调度来自另一个程序线程的指令以在所述多个流水线级内执行;待完成单元,用于识别来自正在由处理器核心执行的程序线程的指令,所述指令被分类为不可能及时执行以使其结果可供后续指令使用,所述流水线级之一是具有调度逻辑的指令调度级,所述调度逻辑能够操作用于:响应于程序线程内的线程暂停指令,当待完成单元指示正在由所述处理器核心执行的所述程序线程内的先前指令不能保证及时使其结果可供所述后续指令使用时,暂停调度所述程序线程内的后续指令。
[0078] 在实施例中,上述第一方面的任何实施例可以与上述第三方面的任何实施例组合。
[0079] 根据第五方面,提供了一种数据处理方法,包括:使用具有多个流水线级的处理器核心执行程序线程的指令序列;识别来自正在由所述处理器核心执行的程序线程的指令,所述指令被分类为不可能及时执行以使其结果可供后续指令使用;响应于程序线程内的线程暂停指令,当指示正在由处理器核心执行的程序线程内的先前指令不能保证及时使其结果可供可供所述程序线程内的后续指令使用时,暂停调度所述后续指令。
[0080] 在一个实施例中,该方法包括响应于程序线程内的线程暂停指令,当指示正在由处理器核心执行的程序线程内的先前指令不能保证及时使其结果可供后续指令使用时,暂停对程序线程内所有后续指令的调度。
[0081] 在一个实施例中,该方法包括当指示正在由处理器核心执行的程序线程内的先前指令将及时使其结果可供后续指令使用时,恢复调度程序线程内的后续指令。
[0082] 在一个实施例中,该方法包括当指示正在由处理器核心执行的程序线程内的所有先前指令都将及时使其结果可供后续指令使用时,恢复调度程序线程内的后续指令。
[0083] 在一个实施例中,该方法包括当指示正在由处理器核心执行的程序线程内没有先前指令将不能及时使其结果可供后续指令使用时,恢复调度程序线程内的后续指令。
[0084] 在一个实施例中,该方法包括当要执行的指令是被分类为不可能及时执行以使其结果可供后续指令使用的一组指令之一时,指令调度级能够操作用于指示处理单元执行该指令。
[0085] 在一个实施例中,该方法包括当要执行的指令是该组指令之一时,通过提供对要执行的指令的指示以及在处理单元执行之后要更新的任何寄存器来指示所述处理单元执行所述指令。
[0086] 在一个实施例中,该方法包括当要执行的指令是该组指令之一时提供指示。
[0087] 在一个实施例中,该方法包括当确定指令的执行将完成时,指示所述指令将完成执行。
[0088] 在一个实施例中,该方法包括当确定指令的执行将完成时,在所述指令完成执行之前指示所述指令将完成执行。
[0089] 在一个实施例中,该方法包括当指令完成执行时,提供对执行的指令的指示和要更新的寄存器。
[0090] 在一个实施例中,该方法包括当来自正在由处理器核心执行的程序线程的指令被分类为不可能及时执行以使其结果可供后续指令使用时使用计数器进行识别,并且每当来自正在由处理器核心执行的程序线程的指令被分类为不可能及时执行以使其结果可供后续指令使用时,改变所述计数器的值。
[0091] 在一个实施例中,该方法包括每当确定指令的执行将完成时改变计数器的值。
[0092] 在一个实施例中,计数器的值提供对有多少个来自正在由处理器核心执行的程序线程的指令被分类为不可能及时执行以使其结果可供后续指令使用的指示。
[0093] 在一个实施例中,所述指令组包括输入/输出指令、存储器访问指令、浮点指令和与共享资源有关的指令中的至少一个。
[0094] 在一个实施例中,该方法包括执行多个程序线程的指令序列,并且响应于程序线程内的线程暂停指令,当指示在正在由处理器核心执行的程序线程内的先前指令不能保证及时使其结果可供后续指令使用时,暂停调度所述程序线程内的所有后续指令,而是调度来自另一个程序线程的指令。
[0095] 在一个实施例中,该方法包括响应于程序线程内的线程暂停指令,当指示正在执行的程序线程内的任何先前指令将不能及时使其结果可供后续指令使用时,暂停对程序线程内所有后续指令的调度,而是调度来自另一个程序线程的指令。
[0096] 在一个实施例中,该方法包括基于最近调度和循环调度之一调度来自另一个程序线程的指令。也就是说,调度来自于不同的线程,而不是来自所述线程的指令。指令从一个线程发出,且当不再发出指令时,发生线程切换。
[0097] 在一个实施例中,线程暂停指令包括离散指令和被编码到另一指令中的指示符之一。
[0098] 根据第六方面,提供了一种数据处理装置,包括第二方面和第五方面的数据处理装置。因此,提供了一种数据处理方法,包括:使用具有多个流水线级的处理器核心执行程序线程的指令序列;识别来自正在由所述处理器核心执行的程序线程的指令,所述指令被分类为不可能及时执行以使其结果可供后续指令使用;响应于程序线程内的线程暂停指令,当指示正在由处理器核心执行的程序线程内的先前指令不能保证及时使其结果可供所述后续指令使用时,暂停调度程序线程内的后续指令;以及识别来自正在由所述处理器核心执行的程序线程的指令,所述指令被分类为不可能及时执行以使其结果可供后续指令使用;响应于程序线程内的线程暂停指令,当指示正在由处理器核心执行的程序线程内的先前指令不能保证及时使其结果可供所述后续指令使用时,暂停调度程序线程内的后续指令。
[0099] 在实施例中,上述第二方面的任何实施例可以与上述第五方面的任何实施例组合。
[0100] 根据第七方面,提供了一种编译指令序列的方法,所述指令序列由具有多个流水线级的处理器核心执行,所述方法包括:将指令分组成片段,每个片段包括被分类为不可能及时执行以使其结果可供片段内的后续指令使用的至少一个指令;以及用线程暂停指令终止每个片段。
[0101] 在一个实施例中,至少一个片段包括被分类为不可能及时执行以使其结果可供片段内的后续指令使用的多个指令。
[0102] 在一个实施例中,每个片段仅包括与被分类为不可能及时执行以使其结果可供片段内的后续指令使用的多个指令没有任何依赖性的指令。
[0103] 在一个实施例中,被分类为不可能及时执行以使其结果可供片段内的后续指令使用的多个指令中的每一个互相间没有任何依赖性。
[0104] 在一个实施例中,至少一个片段包括可及时执行以使其结果可供片段内的后续指令使用的至少一个指令。
[0105] 在一个实施例中,每个片段包括与所述片段内的其他早期指令具有依赖性的指令,所述早期指令可及时执行以使其结果可供所述指令使用。
[0106] 在一个实施例中,至少一个片段包括可及时执行以使其结果可供片段内的后续指令使用的多个指令。
[0107] 在一个实施例中,所述被分类为可及时执行以使其结果可供片段内的后续指令使用的多个指令中的每一个互相间具有依赖性。
[0108] 在一个实施例中,所述分组包括:基于所述指令之间的依赖性,使用有向图从起始节点对所述指令排序;对于所述有向图内的每条指令,确定所述指令与所述起始节点之间的被分类为不可能及时执行以使其结果可供后续指令使用的指令的数量;将具有相同数量的指令的每条指令分配给针对于所述数量的存储桶(bucket),所述相同数量的指令被分类为不可能及时执行以使其结果可供所述指令之间的后续指令使用;对每个存储桶中的指令进行排序以创建每个片段,且用所述线程暂停指令终止每个片段,其中,依赖于较早指令的指令在列表中被排序为出现在所述较早指令之后;将每个片段级联在一起以形成编译的指令序列,所述指令序列从与具有最少数量的被分类为不可能及时执行以使其结果可供后续指令使用的指令的存储桶相关联的片段开始。
[0109] 根据第八方面,提供了一种计算机程序产品,当在计算机上执行时,所述计算机程序产品能够操作用于执行第二、第五、第六或第七方面的方法步骤。
[0110] 在所附独立和从属权利要求中阐述了进一步的特定和优选方面。从属权利要求的特征可以适当地与独立权利要求的特征相组合,并且可以与权利要求中明确阐述的组合之外的组合相组合。
[0111] 在装置特征被描述为能够操作用于提供功能的情况下,应该理解的是,这包括提供该功能的装置特征或者被适配或配置为提供该功能的装置特征。

附图说明

[0112] 现在将参考附图进一步描述本发明的实施例,其中:
[0113] 图1是根据实施例的处理器核心的示意图;
[0114] 图2显示了在核心中执行程序代码的四个线程;
[0115] 图3描述了编译器在编译代码和插入适当的暂停命令时执行的主要步骤;以及[0116] 图4A到4C示出了对示例代码片段的这种编译。

具体实施方式

[0117] 在更详细地讨论实施例之前,首先将提供概述。实施例提供了处理器核心对程序代码的处理的有效调度。处理器支持的指令分为两种类型、种类或类别之一。第一类指令是较快执行指令或低延迟指令。这些低延迟指令是可以处理的指令,并且该处理的结果可以立即用于任何后续指令(换句话说,结果可以保证可用作随后指令的输入)。第二类指令是较慢执行指令或高延迟指令。这些高延迟指令的结果可能无法作为随后指令的输入,因为这些指令需要较长时间才能执行(换句话说,无法保证其结果可用作随后指令的输入)。除了这两种类型的指令外,通常在指令流被编译时,暂停(或线程暂停)命令被编码到指令流中。在实施例中,指令来自常规的,正交的RISC型指令集,它通常利用一对源寄存器和单个目标寄存器。
[0118] 如本领域所公知的,指令被安排成多个不同的线程。这些指令可以被安排为单个线程库或者多个线程库。在使用多个线程库的情况下,可以根据调度方案来调度这些线程库。例如,当使用两个八线程的线程库时,两个线程库之间交替。在实施例中,处理器核心被配置为在每个线程库内在任何一个时间仅调度该线程库内的线程之一。也就是说,不支持多线程的并发调度。一旦选择了一个线程进行调度,指令将仅从该线程调度,直到遇到暂停命令。在一个实施例中,当遇到暂停命令时,该线程库内的另一线程被调度,并且该线程库内的当前线程的调度被暂停。如果线程有任何尚待解决(尚未完成)的高延迟指令,则可能无法重新调度该线程。在一个实施例中,当遇到暂停命令时,如果线程没有尚待解决(尚未完成)的高延迟指令,则该线程可以继续被调度。应当理解,每个线程库是独立于其他线程库而被调度的。
[0119] 生成程序的编译器负责分析指令之间的依赖性,对它们重新排序并引入暂停命令,以便强制服从指令之间的依赖性,同时最大化每个暂停命令之间的长度。这允许发出大量同时运行的在线程问和线程内高延迟指令。检查线程是否可以调度的机制很简单。在一个实施例中,线程被调度,直到遇到暂停命令,然后调度另一个线程并暂停当前线程的调度。如果线程有任何尚待解决(尚未完成)的高延迟指令,则可能无法重新调度该线程。在一个实施例中,仅需要在遇到暂停命令时检查该线程是否存在任何未完成的高延迟指令,否则继续调度该线程,这节省了功率和硅面积。
[0120] 处理器核心架构
[0121] 图1是根据实施例的大体标记为10的单个多线程处理器核心的示意图。仅示出了处理器核心10的主要组件,省略了其他组件以提高清晰度。
[0122] 当前线程单元
[0123] 提供当前线程单元20,其保持对在每个线程库内调度的当前线程的指示。与当前线程单元20耦合的是指令获取级30,其获取该线程库内当前调度的线程的下一个指令。通过参考一组寄存器40内针对当前调度线程的指令指针来确定要调度的下一个指令。该组寄存器40为每个线程保存整组的寄存器。在该示例中,存在四组寄存器,线程库内的线程T1至T4中的每一个使用一组。可以理解的是,如果提供了更多的线程库,这将会被复制。与指令获取级30耦合的是交换线程单元50。交换线程单元50确定当前调度的线程是否可以继续被调度或者是否需要在该线程组内调度不同的线程,如将在下面更详细解释的那样。
[0124] 执行单元
[0125] 与交换线程单元50耦合的是低延迟执行单元60和高延迟执行单元70。被分类为低延迟指令的指令被提供给低延迟执行单元60以供执行。被分类为高延迟执行指令的指令被提供给高延迟执行单元70。应当理解,可以以各种不同方式实现分类。在这个例子中,为低延迟指令保留特定范围的指令标识符,并为高延迟指令保留另一范围的指令标识符。
[0126] 提供给低延迟执行单元60的指令是完全流水线的,使得它能够在每个时钟周期接受不同的指令,并且当后续指令到达低延迟执行单元60内的适当级时,先前指令的结果可用于随后的指令。因此,发出给低延迟执行单元60的低延迟指令可以确定其结果可用于也发出给低延迟执行单元60的任何后续指令,而不需要引入任何停顿、等待或阻塞。这是因为已知结果不会超过线程中下一条指令可能需要该指令结果的最小周期数就可用。相比之下,发出给高延迟执行单元70的指令的结果要么已知花费比线程内的下一个指令可能需要该指令的结果所花最小周期数更久,要么不能确定结果将不会超过线程中下一条指令可能需要该指令结果的最小周期数。例如,如果低延迟执行单元60可能在被发出给其执行的后续指令的三个周期内需要先前指令的结果,则高延迟执行单元70将处理任何已知需要或可能需要超过三个周期才能使其结果可用于后续指令的指令。
[0127] 回写单元
[0128] 与低延迟执行单元60和高延迟执行单元70耦合的是回写单元80,其对低延迟执行单元60或高延迟单元70接下来的指令执行进行适当的寄存器回写。特别地,回写发生在与指令所源自的线程相关联的适当寄存器中。
[0129] 待完成单元
[0130] 与高延迟执行单元70耦合的是待完成单元90。待完成单元90维护提供给高延迟执行单元70的尚未完全执行的所有指令的记录。特别是,针对每个线程来维护指示。例如,在特定时间点,线程T1可能具有当前正在由高延迟执行单元70执行的两条指令,并且线程T3可能具有当前正在由高延迟执行单元70执行的一条指令,而线程T2和线程T4都不具有正在由高延迟执行单元70执行的任何指令。通常,针对每个线程来维护计数器,并且当指令被提供给高延迟执行单元70以供执行时,该计数器递增。随着指令在高延迟执行单元70内完成其执行并且结果由回写单元80所回写,适当的计数器被减小。在一个优化中,待完成单元90内的适当计数器在结果可用之前减小特定数量的周期(例如,对于上面给出的示例为3个周期),以便后续指令可以比原本可能的情况可被更早地调度发出给低延迟执行单元60。正当正在由低延迟执行单元60执行的后续指令要求正在由高延迟执行单元70执行的指令的结果时,该结果将变得可用。从待完成单元90内针对线程T1至T4的计数器产生可调度线程掩码,该可调度线程掩码指示线程是否可以被调度。可以理解的是,如果提供了更多的线程库,这将会被复制。
[0131] 交换线程单元
[0132] 如下面将更详细解释的,每当遇到暂停命令并且两种不同的方法都可能时,交换线程单元50就采取行动。
[0133] 在一个实施例中,每当遇到暂停命令时,交换线程单元50指示该线程库内的不同线程应该被调度,然后下一个线程单元100选择不同的可调度线程用于调度。例如,当遇到暂停命令时,如果当前正在执行线程T1,则交换线程单元50将与下一个线程单元100通信以便选择要调度的新线程(T2到T4中的一个)。下一个线程单元100从可以调度的线程库内的那些线程中选择要调度的不同线程(因为它们没有未完成的高延迟指令),这将在下面更详细地说明。
[0134] 在一个实施例中,每当遇到暂停命令时,交换线程单元50询问待完成单元90以确定暂停命令是否可以被忽略(并且当前线程是否继续被调度),或者是否该线程库内的不同可调度线程需要由下一个线程单元100选择用于调度。例如,当遇到暂停命令时,如果当前正在执行线程T1,则交换线程单元50将询问待完成单元90,并确定是否为线程T1设置计数器。如果为线程T1设置了计数器,则交换单元50与下一个线程单元100通信,以便选择要调度的新线程(T2到T4中的一个)。下一个线程单元100从可以调度的那些线程中选择要调度的不同线程(因为它们没有未完成的高延迟指令),这将在下面更详细地说明。如果未为线程T1设置计数器,则暂停命令将被忽略,并且线程T1继续被调度。
[0135] 当被请求时,下一个线程单元100确定要在该线程库内调度的下一个线程。通常,线程是基于循环调度或最近调度选择的。当交换线程单元50提供对需要选择下一个线程的指示时,向下一个线程单元100提供指示。下一个线程单元100使用适当的选择机制选择不同的线程进行调度。例如,在一个实施例中,下一个线程单元100基于循环调度来选择下一个线程。在另一个实施例中,下一个线程单元100基于最近调度选择不同的线程。无论使用哪种机制,都会询问掩码以查看是否可以调度所选择的线程,如果不是,则选择另一个线程,直到选择到可以调度的线程。
[0136] 所选择的线程被指示给当前线程单元20,并且指令获取单元30获取该线程的指令指针所指示的下一个指令。
[0137] 示例核心操作
[0138] 图2显示了在核心10中执行程序代码的四个线程。在这个例子中,只有一个四线程库以帮助理解。然而,如果提供了更多的线程库,那么将根据库调度方案(例如,以循环调度方式在库之间进行调度)来调度该线程库中的每一个线程库,并且不同的线程库被彼此独立地处理。箭头表示指令获取单元30发出指令的顺序。每一行表示四个线程T1至T4中的一个及其相关程序。该程序从左至右阅读。
[0139] 线程T1以指令“增加(add)”开始。该指令由指令获取单元30获取并且被发送给低延迟执行单元60。
[0140] 在下一个周期中(因为只有一个线程库),指令获取单元30获取“存储(store)”指令,该指令被发给高延迟执行单元70,因为它被分类为高延迟指令(但是如果存在另一个线程库,则指令获取单元30将从该另一个线程库中获取下一个指令)。高延迟执行单元70向待完成单元90提供对高延迟指令待完成的指示。与线程T1相关联的计数器由待完成单元90递增。
[0141] 在下一个周期中,指令获取单元30获取“加载(load)”指令。该指令也被发送给高延迟执行单元70。高延迟执行单元70向待完成单元90指示存在用于线程T1的待完成指令。待完成单元90然后递增与线程T1相关联的计数器。
[0142] 在下一个周期中,指令获取单元30获取“暂停(pause)”指令。在一个实施例中,交换线程单元50询问待完成单元90以查看是否存在任何未完成的高延迟指令,并且在该示例中待完成单元90指示存在。如果待完成单元90已经指示线程T1没有待完成的高延迟指令,则暂停指令将被忽略。在另一个实施例中,当遇到“暂停”指令时,交换单元50将简单地指示下一个线程单元100确定将被选择的下一个线程,而不首先询问待完成单元90。在该示例中,下一个线程单元100基于循环调度来选择线程。为线程T1设置由待完成单元90提供的掩码(mask),但未对线程T2、T3和T4设置掩码。因此,下一个线程单元100选择线程T2并将指示提供给当前线程单元20。
[0143] 在下一个周期中,指令获取单元30然后获取由与线程T2相关联的寄存器组40的指令指针指示的用于线程T2的第一指令。向高延迟执行单元70发出“加载”指令。高延迟执行单元70向待完成单元90指示正在执行高延迟指令,待完成单元90递增与线程T2关联的计数器。
[0144] 在下一个周期中,指令获取单元30获取“暂停”指令。交换线程单元如上所述起作用,并且由于线程T2存在待完成指令,因此下一个线程单元选择线程T3进行调度并将指示提供给当前线程单元20。
[0145] 该过程如图2所示继续,直到在线程T4中遇到“暂停”指令。
[0146] 在这个例子中,线程T1的“存储”和“加载”指令都已完全执行并且其结果已被写回,或者在获取的指令需要它们时将使其结果可用,因此高延迟执行单元70减小待完成完成单元90中的针对线程T1的计数器,计数器现在被清除。相应地,下一个线程单元100可以重新调度线程T1,并且在下一个周期中,指令获取单元30获取发出给低延迟执行单元60的“INC”指令。
[0147] 因此,可以看出,每个周期都可以调度指令的可能性增加,而不需要任何流水线暂停或延迟。可以通过将线程数量从四个增加到例如16个或更多来减少需要等待的可能性。此外,除了询问待完成单元以查看指令是否未完成之外,不需要对依赖性进行复杂的分析,这降低了对处理器核心的调度处理要求。
[0148] 编译
[0149] 图3描述了编译器在编译代码和插入适当的暂停命令时执行的主要步骤。总的来说,每个线程都是单独编译的。每个线程由一个或多个片段(指令序列)形成。每个片段形成为仅包括不依赖于高延迟指令的指令。换句话说,片段中的指令可不依赖于相同片段中高延迟指令的结果。每个片段还被形成为包括对所述片段内的其他早期指令具有依赖性的指令,所述早期指令可及时执行以使其结果可供这些指令使用。换句话说,片段中的指令可能依赖于相同片段中低延迟指令的结果。
[0150] 图4A到4C示出了对示例代码段(例如线程)的这种编译。在步骤S1中,代码被分成基本块,如图4A所示,每个基本块以分支指令终止。
[0151] 在步骤S2中,分析基本块内的数据依赖性,以及基本块中的指令之间的其他排序依赖性。
[0152] 在步骤S3中,如图4B所示,生成有向图,其中节点表示指令并且边缘表示依赖性。提供了一个连接到所有没有依赖性的节点的起始节点。
[0153] 在步骤S3中,对于每个节点,确定沿着从起始节点到该节点的可能路径遇到的高延迟指令节点的最大数量。这些由图4B中所示指令旁边显示的数字指示。
[0154] 在步骤S5中,根据上述数量将所有指令分配给一组存储桶。例如,分支指令分配给存储桶3,而加载指令分配给存储桶2,依此类推。
[0155] 在步骤S3中,对于每个存储桶,将指令排序为列表,使得列表中的所有依赖性都是从较早的指令到较晚的指令,以便较晚的指令仅依赖于较早的指令,如图4C所示。
[0156] 在步骤S7中,在每个列表的末尾插入暂停命令,再次如图4C所示。
[0157] 在步骤S8中,将列表按顺序连接在一起,创建单个指令列表,这是已处理的一段代码或片段。
[0158] 因此,可以看出,在实施例中:
[0159] 指令分为低延迟和高延迟类型指令(简单指令(如移动、增加、异或)是低延迟指令,而更复杂的指令(如浮点和内存操作)是高延迟指令);
[0160] 暂停命令与两类指令一起被编码到指令流中;
[0161] 低延迟指令的结果立即可用(并已可在下一条指令中作为输入);
[0162] 在下一个暂停命令之后可以获得高延迟指令的结果(在下一个暂停命令之前可能不会将其作为任何指令的输入);
[0163] 一旦选择了线程进行调度,就会从该线程调度指令,直到下一个暂停命令。在遇到暂停命令时,将调度另一个线程;以及
[0164] 如果存在未完成的高延迟指令,则可能不会重新调度线程。
[0165] 图2显示了这些规则产生的一个可能序列(假设循环线程调度,并且不必由于未完成的高延迟指令而跳过任何线程)。
[0166] 生成程序的编译器负责分析指令之间的依赖性,对它们进行重新排序,并通过强制执行上述对指令间依赖性的要求的方式引入暂停命令,同时将每个暂停之间的长度最大化。
[0167] 这允许发出同时运行的大量在线程间和线程内高延迟操作。检查线程是否可以调度的机制很简单(任何未完成的高延迟指令?),这样可以节省功率和硅面积。
[0168] 在一个实施例中,具有循环线程调度的图2所示确切模式中的指令跳过具有未完成指令的线程。指令从每个线程按顺序发出,并且允许错序完成。暂停命令可以在指令格式中编码为单个比特,该指令格式在所有指令中是可用的。
[0169] 分支指令可以被实现为高延迟指令,该分支指令将指令获取到对于每个线程而言独立的特殊指令缓冲区中。
[0170] 将会理解,VLIW变体是可能的。
[0171] 一种优化是不将暂停编码为单独的指令,而是针对每条指令在指令格式中利用专用比特来指示。
[0172] 因此,在实施例中,核心由寄存器文件、线程和指令调度逻辑、指令获取和解码逻辑、用于低延迟指令的本地执行流水线以及用于高延迟指令的请求/响应接口组成。还存在待完成单元。
[0173] 在实施例中,指令被划分为高延迟指令和低延迟指令。低延迟指令在执行流水线中执行,并具有可预测的低执行时间。高延迟指令通过高延迟请求端口发送给外部单元,并且稍后在高延迟响应端口中返回响应。在存在数据高速缓存的情况下,高速缓存遗漏(必须从下一级高速缓存加载数据)也被视为高延迟操作。待完成单元计算针对每个线程在高延迟请求/响应接口上有多少个高延迟指令未完成。
[0174] 在实施例中,低延迟指令包括:整数加/减、比较、用于条件执行的指令、逐比特布尔操作,而高延迟指令包括:对共享内存的加载/存储操作(在没有数据高速缓存的情况下,或者在数据高速缓存中有遗漏(miss)的情况下)。这些指令可以是乘、除、浮点运算、分支、移位中的任一个。
[0175] 实施例中可能的优化是在特殊情况下使一些高延迟操作能够作为低延迟操作来执行。例如,如果存在本地数据高速缓存,则在操作在高速缓存中命中的情况下,加载/存储指令作为低延迟指令完成。
[0176] 在实施例中,指令编码包括用于操作码的字段,指定要执行哪个操作,目的地寄存器索引,第一源寄存器索引,以及取决于操作码的第二源寄存器索引或直接字段,以及线程暂停比特。
[0177] 在实施例中,指令中的寄存器索引指向专用于线程的固定通用寄存器集合。在流水线中执行的指令在指令编码中指向这些具有寄存器索引的寄存器。这样,每条指令都可以读取或写入属于该线程的任何寄存器,但不能访问属于另一个线程的寄存器。寄存器文件包含核心上执行的所有线程的所有寄存器。
[0178] 在实施例中,执行流水线从寄存器文件读取源值,应用操作,并将结果写回寄存器文件。如果另一条指令在写回结果之前需要结果,则特殊逻辑或者在结果已被计算出的情况下将结果转发到流水线中,或者拖延流水线的上半部分直到结果可以被转发。
[0179] 线程调度逻辑将继续执行来自单个线程的指令,直到遇到线程暂停比特。然后它将以循环方式切换到另一个没有任何未完成高延迟指令的线程。
[0180] 虽然本文已经参考附图详细公开了本发明的说明性实施例,但应该理解,本发明不限于该确切实施例,并且本领域技术人员可以在其中进行各种改变和修改,而不脱离由所附权利要求及其等同物限定的本发明的范围。
高效检索全球专利

IPRDB是专利检索,专利查询,专利分析-国家发明专利查询检索分析平台,是提供专利分析,专利查询专利检索等数据服务功能的知识产权数据服务商。

我们的产品包含105个国家的1.26亿组数据,专利查询、专利分析

电话:13651749426

侵权分析

IPRDB的侵权分析产品是IPRDB结合多位一线专利维权律师和专利侵权分析师的智慧,开发出来的一款特色产品,也是市面上唯一一款帮助企业研发人员、科研工作者、专利律师、专利分析师快速定位侵权分析的产品,极大的减少了用户重复工作量,提升工作效率,降低无效或侵权分析的准入门槛。

立即试用