掌桥专利:专业的专利平台
掌桥专利
首页

数据处理装置中的核心内并行化及方法

文献发布时间:2023-06-19 19:30:30


数据处理装置中的核心内并行化及方法

本公开涉及数据处理装置中代码的核心内并行化。

顺序指令的并行化提供了改善数据处理装置内的顺序性能的缩放的方法。现代通用CPU处理器中使用的典型乱序执行依赖于细粒度指令级并行来将顺序指令流转换成受限的数据流执行模型。然而,性能增益被限制在乱序处理器的指令窗口大小的约束内。该机制不能识别和利用在顺序指令方案内进行粗粒度任务级并行的机会。任务级并行可改善顺序代码的性能。然而,任务级并行通常需要编程器干预以基于代码的运行时性能的广泛剖析来重写代码,从而显式地暴露并行化的机会。另选地,如果编译器支持存在,则与优化的顺序代码相比,利用任务级并行化的代码可能招致显著的开销,从而需要两个不同的代码版本,一个用于当支持任务级并行化时使用,而另一个用于顺序执行。由于这些原因,依赖于对软件具有高度依赖的常规多核处理器的任务级并行化的典型方法往往表现出较差的性能缩放和较差的效率。

本公开的至少一个实施方案提供了一种数据处理装置,其包括:用于执行多个微线程的处理操作的多线程处理电路,每个微线程在限定体系结构状态的对应执行上下文中操作;用于收集指示与处理操作相关的性能度量的运行时数据的线程控制电路;以及解码器电路,其响应于在限定第一体系结构状态的第一执行上下文中执行的第一微线程指令中的分离指令,以向线程控制电路提供分离控制信号,该分离指令指定地址,其中当运行时数据满足并行化标准时,该线程控制电路响应于分离控制信号以生成在限定基于第一体系结构状态的第二体系结构状态的第二执行上下文中执行的第二微线程指令,第二微线程指令包括第一微线程指令的始于地址处的指令子集。

本公开的至少一个实施方案提供了一种数据处理方法,其包括:收集运行时数据,该运行时数据指示与多线程处理电路上限定体系结构状态的对应执行上下文中的多个微线程的处理操作相关的性能度量;响应于在限定第一体系结构状态的第一执行上下文中执行的第一微线程指令中的分离指令,生成分离控制信号,该分离指令指定地址;以及响应于分离控制信号并且当运行时数据满足并行化标准时,生成在限定基于第一体系结构状态的第二体系结构状态的第二执行上下文中执行的第二微线程指令,第二微线程指令包括第一微线程指令的始于地址处的指令子集。

本公开的至少一个实施方案提供了一种数据处理装置,其包括:用于收集运行时数据的装置,该运行时数据指示与多线程处理电路上限定体系结构状态的对应执行上下文中的多个微线程的处理操作相关的性能度量;用于响应于在限定第一体系结构状态的第一执行上下文中执行的第一微线程指令中的分离指令来生成分离控制信号的装置,该分离指令指定地址;以及用于响应于分离控制信号并且当运行时数据满足并行化标准时,生成在限定基于第一体系结构状态的第二体系结构状态的第二执行上下文中执行的第二微线程指令的装置,第二微线程指令包括第一微线程指令的始于地址处的指令子集。

将参考如附图所示的本发明的实施方案,仅以举例的方式进一步描述本技术,其中:

图1示意性地示出了可体现本技术的各种示例的数据处理装置;

图2示意性地示出了可体现本技术的各种示例的线程控制电路的操作的细节;

图3A示意性地示出了可体现本技术的各种示例的纪元标识符的分配的细节;

图3B示意性地示出了可体现本技术的各种示例的纪元标识符的分配的细节;

图4示意性地示出了可体现本技术的各种示例的微线程执行的细节;

图5示意性地示出了可体现本技术的各种示例的微线程执行的细节;

图6示意性地示出了可体现本技术的各种示例的微线程执行的细节;

图7示意性地示出了可体现本技术的各种示例的微线程执行的细节;

图8示意性地示出了可体现本技术的各种示例的微线程执行的细节;

图9示意性地示出了可体现本技术的各种示例的微线程执行的细节;并且

图10示意性地显示了由本发明的一些示例进行的步骤序列。

至少一些实施方案提供了一种数据处理装置,其包括:用于执行多个微线程的处理操作的多线程处理电路,每个微线程在限定体系结构状态的对应执行上下文中操作;用于收集指示与处理操作相关的性能度量的运行时数据的线程控制电路;以及解码器电路,其响应于在限定第一体系结构状态的第一执行上下文中执行的第一微线程指令中的分离指令,以向线程控制电路提供分离控制信号,该分离指令指定地址,其中当运行时数据满足并行化标准时,该线程控制电路响应于分离控制信号以生成在限定基于第一体系结构状态的第二体系结构状态的第二执行上下文中执行的第二微线程指令,第二微线程指令包括第一微线程指令的始于地址处的指令子集。

多线程处理电路的线程控制电路保持并控制多个微线程的执行,每个微线程具有对应的执行上下文。执行上下文限定体系结构状态,该体系结构状态包括:可被映射到可用物理寄存器的对应子组的若干架构寄存器、若干控制和状态寄存器以及指示执行上下文的当前执行指令的指令序列中的位置的程序计数器值。多线程数据处理装置可被配置为在若干并行流水线上并行执行若干多个微线程,并且也可(或相反地)采用时间交错技术,从而允许多个微线程中的不同微线程顺序地执行,例如,当一个线程正等待提取数据时,不同线程可利用数据处理装置的资源。线程控制电路被进一步配置为收集指示与微线程的处理操作相关的性能度量的运行时数据。具体地,且如下文进一步描述,性能度量提供对当前执行指令是否可受益于并行性的指示。

数据处理装置还包括解码器电路,该解码器电路可响应于用于隐式任务并行化的若干基于提示的指令。具体地,解码器电路响应于分离指令,该分离指令使得解码器电路生成被传递到线程控制电路的分离控制信号。分离指令是基于提示的指令,其可由编程器或编译器插入,向数据处理装置指示第一微线程指令中的一组指令可受益于并行执行。基于分离控制信号和性能指示符,由线程控制电路在运行时执行关于是否按基于提示的指令动作的确定。例如,解码电路可在性能度量指示并行执行该一组指令将没有益处的点处对分离指令进行解码。在此类情况下,线程控制电路可继续顺序地执行该一组指令。另一方面,如果解码电路对分离指令进行解码并且性能度量指示该一组指令将受益于并行化,则线程控制电路可生成第二微线程指令,该第二微线程指令至少部分地从第一微线程指令继承其执行上下文。分离指令还指定指示第二微线程指令的起始点的指令的地址。以这种方式,当性能度量指示此类并行化有益于指令(在没有分离指令的情况下,其将完全在第一微线程指令中执行)的执行时,第一微线程指令和第二微线程指令可被并行执行。

通过依赖于基于提示的方法,期望编程器或编译器可在其并行化可能提供有益效果的代码部分周围插入低代价提示。然而,微架构的工作是在运行时决定跨任何特定一组提示的并行化是否有益。继而,这减轻了编译器的负担,因为它不需要执行过于复杂的分析用于评估收益性,也不需要生成包含相同功能性的并行和顺序副本两者的胖二进制。即使当具有关于针对特定区域的并行化的收益性的低置信度时,编程器或编译器也可伺机插入这些提示,相信微架构将能够在运行时作出更知情决策。当基于提示的指令的插入留给编译器时,这消除了编程器重写其代码的需要,使得编译器可受益于线程级推测,因为编译器现在具有更容易处理的作业。因此,当插入并行化提示时,不再需要激进的编译器分析或编程器协助。

在至少一些实施方案中,地址是第一地址,指令子集是第一指令子集,并且分离指令还包括第二地址,并且其中当运行时数据满足并行化标准时,线程控制电路响应于分离控制信号,以使得第一微线程指令执行始于第二地址处的第二指令子集。以这种方式,基于提示的分离指令可用于使得第一指令子集和第二指令子集作为一组单独的微线程的一部分来执行,每个微线程在其自己的执行上下文中执行。第一指令子集由包括在分离指令中的第一地址限定,并且第二指令子集由包括在分离指令中的第二地址限定。第一指令子集和第二指令子集可被不同地限定。具体地,第一指令子集和第二指令子集可对应于不同指令子集。例如,如果在由编译器生成的静态二进制中第二指令子集在第一指令集之前或之后顺序地发生,并且运行时数据识别出这两个子集可有利地并行执行,则线程控制电路可基于第一微线程的执行环境生成第二执行环境,在该第二执行环境中运行第二指令子集。

在至少一些实施方案中,第一指令子集和第二指令子集是第一微线程指令的在动态执行期间不重叠的子集。虽然在由编译器产生的静态二进制中由第一微线程和第二微线程执行的指令可以对应于相同指令,但是它们在动态执行期间对应于非重叠指令。例如,第一指令子集可以对应于由取第一值的循环索引限定的循环的第一迭代,并且第二指令子集可以对应于由取第二值的循环索引限定的循环的第二迭代。以这种方式,线程控制电路能够在运行时决定循环是否将受益于并行执行,并且如果是,则生成附加的微线程以利用并行执行。

在至少一些实施方案中,当运行时数据不满足并行化标准时,线程控制电路适于将分离指令解译为以下中的一者:无条件分支指令和无操作。当线程控制电路将分离指令解译为无操作时,指令执行顺序地移动到下一指令。或者,线程控制电路可以将分离指令视为无条件分支指令,使得程序执行从分支目标顺序地继续。以这种方式,程序执行可被配置为以如同分离指令尚未发生一样继续,其中程序执行从假使分离指令未由编译器或编程器插入而将发生的指令继续。

在至少一些实施方案中,解码器电路响应于特定微线程指令中的重新附接指令,以向线程控制电路提供重新附接控制信号,并且其中线程控制电路响应于重新附接控制信号以终止该特定微线程指令。以这种方式,可通过以下来区分可通过作为特定微线程指令的一部分执行而受益于并行化的指令块:将指令块放置在用以指示特定微线程指令可以开始的点的分离指令与用以指示特定微线程指令要结束的点的重新附接指令之间。其中发生重新附接指令的特定微线程不受限制,并且可以是第一微线程指令或第二微线程指令。在重新附接指令发生在第一微线程中的情况下,执行可以在第二微线程指令中继续。或者,在重新附接指令发生在第二微线程中的情况下,执行可以在第一微线程指令中继续。

在至少一些实施方案中,线程控制电路响应于特定微线程指令与另一微线程指令之间的数据冲突的发生,以指示该特定微线程的不成功终止。由于并行化是基于基于提示的指令和来自运行时数据的对并行化可能是有益的指示的组合,因此存在可能在一个或多个线程中发生非预期数据冲突的可能性。具体地,当已经识别出并行执行将是有益的时,特定微线程推测性地执行并且可以在执行重新附接指令时成功地终止,这将指示在执行期间没有发生存储器冲突并且特定微线程可以最终提交。然而,如果检测到潜在冲突,例如存储器依赖违反(诸如写入后读取冲突),或者导致推测状态(以及潜在地与特定微线程相关联的其他微线程的推测状态)的清除的异常或中断事件的发生,则该特定微线程可能不会成功终止。以这种方式,可以避免在特定微线程的推测执行期间发生的冲突。

在至少一些实施方案中,线程控制电路响应于对不成功终止的指示来重新生成特定微线程指令。特定微线程的重新生成可能需要从已知正确、较少推测或非推测状态重新执行分离指令,直到可以确定特定微线程已成功终止为止。

在至少一些实施方案中,当运行时数据不满足并行化标准时,线程控制电路适于将重新附接指令解译为以下中的一者:无条件分支指令和无操作。当线程控制电路将重新附接指令解译为无操作时,指令执行顺序地移动到下一指令。或者,线程控制电路可以将重新附接指令视为无条件分支指令,使得程序执行从分支目标顺序地继续。以这种方式,程序执行可被配置为以如同重新附接指令尚未发生一样继续,其中程序执行从假使重新附接指令未由编译器或编程器插入而将发生的指令继续。

在至少一些实施方案中,每个微线程由纪元标识符进行识别。线程控制电路必须追踪原始程序的顺序语义。因此,在任何给定时间,使用纪元标识符来追踪微线程之间的总执行顺序。当生成新的微线程时,必须生成新的纪元标识符。为了使对纪元标识符的处理是实用的,在一些实施方案中以循环方式处理纪元标识符。当生成新的微线程时,线程控制电路将以升序分配纪元标识符,并且当达到最大支持纪元标识符值时,线程控制电路将绕回。该方案可以利用分别存储近期最少分配的纪元标识符(分配给最先推测微线程)和近期最多分配的纪元标识符(分配给最新推测微线程)的两个计数器来有效地实现。这种简化是可能的,因为按照从最先推测微线程到最新推测微线程的纪元标识符的顺序,将微线程的状态提交,即,合并到体系结构状态,以便保留顺序语义,并且因此按顺序释放纪元标识符。

在至少一些实施方案中,指令的特定微线程是第一微线程指令,并且其中响应于分离指令,线程控制电路适于将新的纪元标识符分配给第二微线程指令。以这种方式,在执行分离指令之后并且当运行时数据满足并行化标准时,第一微线程指令保持其当前纪元标识符并且执行多个指令直到达到重新附接指令。当第一微线程指令已成功地达到重新附接指令时,即,没有对任何冲突或中断的识别,第一微线程指令可以提交到体系结构状态。此外,在执行分离指令时,第二微线程指令被生成并被分配新的纪元标识符。在一些实施方案中,第二微线程指令可以包含使用上述机制引起第三微线程的进一步生成的分离指令。以这种方式,例如,可以并行循环,其中针对循环主体的每次迭代生成新的线程。在存在少量循环迭代的情况下,该方法可以为有利的,因为每个微线程可以用于循环主体中的指令的执行。

在至少一些实施方案中,特定微线程指令是第二微线程指令,并且其中在分离指令之前,第一微线程被分配第一纪元标识符,并且响应于分离指令,线程控制电路适于将新的纪元标识符分配给第一微线程指令,并且将第一纪元标识符分配给第二微线程指令。以这种方式,在执行分离指令之后并且当运行时数据满足并行化标准时,第二微线程指令被产生并且继承第一微线程指令的纪元标识符,并且新的纪元标识符被生成并被分配给第一微线程指令。当第二微线程指令已成功地达到重新附接指令时,即,没有对任何冲突或中断的识别,第二微线程指令可以提交到体系结构状态。在一些实施方案中,第一微线程指令可以包含使用上述机制引起第三微线程的进一步生成的分离指令。以这种方式,例如,可以并行循环,其中第一微线程指令生成单独的微线程指令以处理循环的每次迭代。该方法是有利的,因为多个微线程可以由第一微线程指令快速地产生,而不必等待与每个新线程顺序地生成后续线程相关联的任何生成开销。

在至少一些实施方案中,分离指令指定区域标识符,并且至少一个后续重新附接指令指定该区域标识符。以这种方式,解码电路能够生成控制信号,线程控制电路可以使用该控制信号来识别哪些重新附接-分离指令对彼此对应。具体地,这使得编程器或编译器能够插入嵌套的基于提示的重新附接-分离对,这允许线程控制电路保留程序的顺序语义。

在至少一些实施方案中,区域标识符是第一区域标识符,后续分离指令指定第二区域标识符并且后续重新附接指令指定该第二区域标识符,其中纪元标识符包括外部纪元标识符和内部纪元标识符,并且其中当后续分离指令和后续重新附接指令按程序顺序处于分离指令与重新附接指令之间时,与分离指令相关联地分配外部纪元标识符,并且与后续分离指令相关联地分配内部纪元标识符。通过将纪元标识符分成与外部重新附接和分离指令相关联的外部纪元标识符以及与内部重新附接和分离指令相关联的内部纪元标识符,可以基于纪元标识符来维持总程序顺序。对于本领域技术人员来说显而易见的是,本公开不限于外部纪元标识符和内部纪元标识符,并且可以限定任何数量的嵌套的纪元标识符并将其分配给对应数量的嵌套的分离和重新附接指令集。

在一些实施方案中,运行时数据是第一运行时数据,并且性能度量是与第一区域标识符相关联的第一性能度量,并且其中线程控制电路适于收集指示与第二区域标识符相关联的第二性能度量的第二运行时数据。以这种方式,线程控制电路能够针对特定区域标识符确定:线程控制电路生成与该区域标识符相关联的新微线程是否将是有益的或者忽略与该区域标识符相关联的基于提示的并行化指令是否将是更有益的。例如,可能的情况是,线程控制电路基于第一运行时数据和第一性能度量确定使对应于外部分离-重新附接指令集的外部循环并行化是无益的,然而基于第二运行时数据和第二性能度量,线程控制电路可以确定使对应于内部分离-重新附接指令集的内部循环并行化是有益的。或者,可以确定使外部循环而不是内部循环并行化是有益的。

在一些实施方案中,当当前活动的微线程的数量等于所支持的微线程的最大数量时,数据处理装置被配置为将分离指令视为以下中的一者:无条件分支指令和无操作。这防止数据处理装置生成不能由线程控制电路、数据处理装置中可用的物理寄存器的数量、可用存储器带宽或由于执行单元吞吐量而支持的微线程。对于本领域技术人员来说显而易见的是,这些仅仅是其中不能支持附加微线程的情况的示例,并且数据处理装置可以响应于取决于特定实施方案的硬件的任何限制将分离指令视为以下中的一者:无条件分支指令和无操作。

在一些实施方案中,解码器电路响应于具有最新纪元标识符的微线程指令中的同步指令,以暂停最新微线程指令中的后续指令的执行,直到具有较先纪元标识符和相同区域标识符的所有生成的微线程已终止为止。同步指令与特定区域标识符相关联,该特定区域标识符由编程器或编译器选择以匹配成对的分离-重新附接指令的区域标识符。同步指令的作用是作为已在特定并行区域内生成的所有微线程的同步屏障。一旦所有生成的微线程通过发出重新附接指令完成执行,发出同步指令的微线程可以作为与区域标识符相关联的唯一执行微线程继续执行。发出同步指令的微线程是将在并行区域中执行的具有最新纪元标识符的线程。保留最初预期的顺序可观察语义的所有生成的微线程的合并要求具有较先纪元标识符的所有微线程已成功地终止并通过执行它们的重新附接指令以严格的纪元标识符顺序提交到体系结构状态;并且当同步发出微线程变成具有最先未提交推测状态的微线程时,它然后可以提交到体系结构状态并且越过同步指令继续顺序执行。该方法确保在潜在并行区域之后的任何操作能够以相同的体系结构状态继续执行,就好像并行化提示已被省略,或者被视为无操作和无条件分支指令中的一者。

在至少一些实施方案中,当运行时数据不满足并行化标准时,线程控制电路适于将同步指令解译为无操作。以这种方式,程序执行可被配置为以如同同步指令尚未发生一样继续,其中程序执行从假使同步接指令未由编译器或编程器插入而将发生的指令继续。

在至少一些实施方案中,解码器电路还响应于具有最新纪元标识符的微线程指令中的同步指令,以暂停最新微线程指令中的后续指令的执行,直到具有较先纪元标识符和不同区域标识符的所有生成的微线程已终止为止。以这种方式,可以执行表现为全局同步指令的同步指令以确保在特定点处,来自所有区域标识符的所有微线程被提交,使得在全局同步指令的执行之后仅可以存在一个线程且仅存在的线程是发出同步指令的线程。

在至少一些实施方案中,基于调度因子n,线程控制电路适于将分离指令的出发生和重新附接指令的发生解译为无条件分支指令和无操作中的一者。用于并行任务的默认调度策略假设不被视为无操作和无条件分支指令中的一者的分离操作触发新微线程的产生。在一些循环的自动的基于提示的并行化的情况下,这可能是次优的,特别是当循环主体包括少量指令时。然而,在运行时循环内依赖性很少或不存在的情况下,循环仍可以受益于并行化。

在至少一些实施方案中,线程控制电路适于响应于分离指令的每第n次发生而生成第二微线程指令,并且将分离指令的所有其它发生解译为无条件分支指令和无操作中的一者,并且其中线程控制电路适于响应于重新附接指令的每第(n-1)次发生而终止特定微线程指令,并将重新附接指令的所有其它发生解译为无条件分支指令和无操作中的一者。例如,在n=2的情况下,分离指令的第一次发生将导致生成新的微线程,但是重新附接指令的第一次发生和分离指令的第二次发生将被视为无操作和无条件分支操作中的一者。以这种方式,每个微线程将运行通过代码的并行区域的两次发生,从而减少生成新线程的负担,同时仍获得并行化优点。

在一些实施方案中,调度因子n基于运行时数据。该机制允许线程控制电路基于运行时数据来定制在每个微线程内并行代码的区域被执行的次数。例如,运行时数据可以指示,基于生成微线程的开销,对于n小于3的值不能获得并行化优点,然而,也可以确定对于更大的值n,可能存在数据冲突发生的更大几率。从而,线程控制电路可以有利地选择n为3的值以获得并行化优点,同时使数据冲突发生的几率最小化。

在至少一些实施方案中,解码器电路还响应于指定替代地址的分离指令,并且其中,当n大于1时,线程控制电路被配置为从替代地址开始在第二执行上下文中的执行。当n大于1时,对应于替代地址的指令可用于将归纳变量递增量n。例如,可以插入基于提示的并行化指令以使得线程控制电路能够选择是生成具有n=1还是n=2的值的并行线程。在n=1的情况下,第一微线程指令从其继续执行的第二地址可以限定循环继续块,其中与循环相关联的归纳变量增加1。另外,替代地址可以用于n=2的情况以限定替代继续块,其中与循环相关联的归纳变量增加2。对于本领域技术人员来说显而易见的是,n=1和n=2的选择是为了进行示意性的说明,并且可以选择n的任何值。

在至少一些实施方案中,解码器电路还响应于指定替代地址的分离指令,并且其中,当n大于1时,线程控制电路被配置为使得第一微线程指令从替代地址继续执行。当n大于1时,对应于替代地址的指令可用于将归纳变量递增量n。例如,可以插入基于提示的并行化指令以使得线程控制电路能够选择是生成具有n=1还是n=2的值的并行线程。在n=1的情况下,线程控制电路可以生成第二线程,并且地址可以限定循环继续块,其中与循环相关联的归纳变量增加1。另外,替代地址可以用于n=2的情况以限定替代继续块,其中与循环相关联的归纳变量增加2。对于本领域技术人员来说显而易见的是,n=1和n=2的选择是为了进行示意性的说明,并且可以选择n的任何值。

在至少一些实施方案中,解码器电路还响应于指定附加元数据的分离指令,该附加元数据包括以下项中的至少一项:表示在运行时发生的微线程之间的动态依赖性的可能性的并行化置信水平;提供包括在第二微线程指令中的指令的估计数量的并行化价值水平;并且对预期在运行时在微线程之间发生的动态依赖性的类型的指示。可以由编程器或编译器基于例如剖析数据和/或估计的用例来指定附加元数据。所指定的附加元数据可以由线程控制电路结合运行时数据来解译以确定何时最适于推测性地生成附加微线程。例如,当编程器或编译器指示高并行化置信水平或高并行化价值水平时,线程控制电路可以要求在生成附加微线程之前由运行时数据满足更低阈值。或者,当编程器或编译器指示低并行化置信水平或低并行化价值水平时,线程控制电路可以要求在生成附加微线程之前由运行时数据满足更高阈值。

在至少一些实施方案中,性能度量包括以下中的至少一者:每周期执行的指令的平均数量;多线程处理电路中的资源的平均占用率;检测到的存储器写入后读取冲突的数量;以及每微线程指令执行的指令的数量。以这种方式,线程控制电路可以在运行时确定对于特定指令集来说,并行执行指令是否可能是有益的,或另选地,确定并行执行指令是否存在不充足的资源、数据冲突发生的可能性是否太高,或与特定指令集的并行化相关联的开销是否对于观察到的任何益处来说可能太高。在至少一些实施方案中,持续地更新运行时数据,并且因此可以确定当前并行的一组微线程提供很少的优点或没有优点。此时,线程控制电路可以确定停止并行执行或者修改被视为无操作或无条件分支指令中的一者的多个分离和重新附接对是更好的,以便改善数据处理装置的性能。

在至少一些实施方案中,数据处理装置包括:一组物理寄存器;以及用于将一组架构寄存器映射到该一组物理寄存器的子组的寄存器重命名电路,其中该寄存器重命名电路将第一组架构寄存器映射到与第一执行上下文相关联的第一组物理寄存器,并且该寄存器重命名电路将第二组架构寄存器映射到与第二执行上下文相关联的第二组物理寄存器。以这种方式,可以针对与当前执行的一组微线程相关联的执行上下文中的每一者保持完整的一组架构寄存器。

在至少一些实施方案中,第一组物理寄存器的第一子组和第二组物理寄存器的第一子组是相同的一组寄存器,并且其中第一组物理寄存器的第二子组和第二组物理寄存器的第二子组是不同的一组寄存器。以这种方式,在这样做是有益的情况下,线程控制电路可以使得多个执行上下文共享物理寄存器的第一子组并且保持对每一执行上下文唯一的物理寄存器的第二子组。换句话讲,每一执行上下文的体系结构状态可以由除对每一执行上下文唯一的多个寄存器之外的多个共享寄存器来限定。在在微线程的并行执行期间数据将不可能被修改的情况下,仅保持其中存储该数据的物理寄存器的一个副本是有益的。这增加了可用于不同执行上下文的物理寄存器的数量,并且因此可增加所支持的执行上下文的总数。

在至少一些实施方案中,存在一种数据处理方法,包括:收集运行时数据,该运行时数据指示与多线程处理电路上限定体系结构状态的对应执行上下文中的多个微线程的处理操作相关的性能度量;响应于在限定第一体系结构状态的第一执行上下文中执行的第一微线程指令中的分离指令,生成分离控制信号,该分离指令指定地址;以及响应于分离控制信号并且当运行时数据满足并行化标准时,生成在限定基于第一体系结构状态的第二体系结构状态的第二执行上下文中执行的第二微线程指令,第二微线程指令包括第一微线程指令的始于地址处的指令子集。

在至少一些实施方案中,存在一种数据处理装置,包括:用于收集运行时数据的装置,该运行时数据指示与多线程处理电路上限定体系结构状态的对应执行上下文中的多个微线程的处理操作相关的性能度量;用于响应于在限定第一体系结构状态的第一执行上下文中执行的第一微线程指令中的分离指令来生成分离控制信号的装置,该分离指令指定地址;以及用于响应于分离控制信号并且当运行时数据满足并行化标准时,生成在限定基于第一体系结构状态的第二体系结构状态的第二执行上下文中执行的第二微线程指令的装置,第二微线程指令包括第一微线程指令的始于地址处的指令子集。

现在将参考附图描述一些具体实施方案。

图1示意性地示出了可体现本技术的各种示例的数据处理装置。数据处理装置10包括多线程处理电路12和线程控制电路14。线程控制电路14适于支持多个微线程上下文16。多线程处理电路12是一组多线程执行资源并且包括多个执行流水线18、一组物理寄存器20、指令高速缓存22、1级数据高速缓存26以及2级高速缓存24。多个执行流水线中的每一者包含提取电路28,用于从指令高速缓存22提取指令。将所提取的指令传递到解码电路30并传递到重命名电路32,该解码电路生成用于包括线程控制电路14的多线程处理电路的其它组件的控制信号。重命名电路32在将经解码指令传递到发出电路43以用于发出到执行电路36之前,将多个物理寄存器20映射到与正在流水线18上执行的执行上下文相关联的对应一组架构寄存器,该执行电路可以含有任何数量的执行级,包括但不限于算术逻辑单元、浮点单元以及加载/存储单元。一旦指令已完成执行,它们就被传递到写回电路40。对于本领域技术人员来说显而易见的是,部件28、30、32、34、36和40的流水线旨在说明典型多线程数据处理装置,且任何流水线部件可以是针对每一流水线提供的专用部件,或可以在任何数量的多个流水线18之间共享。例如,每一流水线18可以具有一些专用流水线部件以及与一个或多个其它流水线18共享的一些部件。然而,未明确示出的附加结构可以被添加到数据处理装置10。对于本领域技术人员来说显而易见的是,多线程处理电路12还可以包括跨多个微线程上下文交织其资源的单个流水线18。

图2示意性地示出了可以体现本技术的各种示例的线程控制电路的操作的细节。在一些实施方案中,该线程控制电路42可以提供图1的线程控制电路14。线程控制电路42存储用于控制和追踪在数据处理装置上执行的不同微线程的多个计数器。具体地,线程控制电路使用纪元计数器44来针对对应于由分离-重新附接指令对表示的一组当前执行代码的每个区域标识符,追踪向具有该区域标识符的微线程发出的最先纪元标识符和向具有该区域标识符的微线程发出的最新纪元标识符。以这种方式,并且如将关于图3A进一步描述,可以针对每个区域标识符保持飞行中纪元标识符。此外,线程控制电路42可以保持执行上下文表46,其指示当前由多线程处理装置保持的每一执行上下文、对应的纪元标识符和对应的区域标识符。对于本领域技术人员来说显而易见的是,示出为保持在执行上下文表46中的信息不是穷尽的,并且与执行上下文相关联的任何信息也可以存储在其中。例如,执行上下文表46可以保持分配给每一执行上下文的物理寄存器与架构寄存器之间的映射。此外,线程控制电路基于与处理操作相关的性能度量的指示来保持运行时数据48。运行时数据可以基于当前执行的指令被连续地更新和/或可以针对每个区域标识符被独立地保持。以这种方式,线程控制电路可以控制和保持对于每个区域标识符是否要生成附加微线程,以及如果要生成微线程,哪些纪元标识符与哪个执行上下文和哪个区域标识符相关联。

图3A和3B示意性地示出了可以体现本技术的各种示例的纪元标识符的分配的细节。从图3A开始,以循环方式处理纪元标识符50。当生成新的微线程时,线程控制电路以升序分配纪元标识符,并且当达到最大支持的纪元标识符时,线程控制电路绕回。该方案是使用两个计数器来实现的,这两个计数器追踪最先纪元标识符52和最新纪元标识符54。当新的纪元标识符被分配时,最新纪元标识符被递增,一旦最先纪元标识符已被分配,则绕回到零。当微线程被提交(其按顺序发生)时,最先纪元标识符被递增,从而释放纪元标识符以供后续微线程使用。如图2所示,为每个区域标识符保持最新纪元计数器54和最先纪元计数器52。

如图3B所示,对于支持嵌套并行化区域的实施方案,可以分层地限定与每个微线程相关联的纪元标识符56。在所示实施方案中,纪元标识符56由以下限定:与最外侧的一对分离-重新附接指令相关联的最外侧标识符58、由嵌套在最外侧的一对分离-重新附接指令内的外部一对分离-重新附接指令所限定的外部标识符60、与嵌套在外部一对分离-重新附接指令内的内部一对分离-重新附接指令相关联的内部标识符62,以及与嵌套在内部一对重新附接指令内的最内侧一对分离-重新连接指令相关联的最内侧标识符。对于本领域技术人员来说显而易见的是,与嵌套的分离-重新附接指令对相关联的四层纪元标识符的限定仅为了说明的目的,并且基于所述机制可以支持任何数量的组的嵌套的分离-重新附接指令对。在一些实施方案中,分配给纪元标识符层中的各层的比特宽度可以在运行时由硬件动态地改变,而在其他实施方案中,分配给纪元标识符层中的各层的比特宽度可以静态地确定。类似于关于图3A所讨论的示例,最外侧标识符58、外部标识符60、内部标识符62以及最内侧标识符64中的每一者都需要保持与最先纪元标识符和最新纪元标识符相关联的一对计数器。具体地,最外侧纪元标识符58是一组可用的最外侧标识符66中的一个标识符并且与最先最外侧标识符68和最新最外侧标识符70相关联。类似地,通过对应的外部最先标识符和外部最新标识符、内部最先标识符和内部最新标识符以及最内侧最先标识符74和最内侧最新标识符76来维持外部标识符60、内部标识符62以及最内侧标识符64中的每一者的分配。

图4至图7示意性地示出了可以体现本技术的各种示例的微线程执行的示例的细节。具体地,这些图基于具有对应的优化汇编代码的以下示例性C代码;

在例示的示例中,编译器对汇编代码进行以下修改,以便利用在本发明的一些实施方案中阐述的任务级并行化。

在以上修改的汇编代码中使用的分离指令包括多个输入。loop_body和loop_cont字段分别是分离和继续指令块的地址。这可以使用用于表示此类地址的基于程序计数器的偏移来编码。如果分离块字段对应于按程序顺序跟在分离指令之后的指令,则可以省略分离块字段。region_id字段是在运行时必须是唯一的并且与特定注释区域相关联的区域标识符。在实施过程中,区域标识符仅在区域嵌套内是唯一的就足够了,这意味着相同的区域标识符可以跨不同嵌套重复使用。元数据字段可以捕获可以被传递给线程控制电路的额外信息。具体地,元数据可以用于:编码并行化置信水平,其表示在运行时实现的动态依赖性的可能性,例如基于剖析数据;编码并行化价值水平,例如通过包括关于并行路径的估计长度的附加信息,其以指令的数量进行表示,这可以包括最好情况和最坏情况指令计数;以及与区域中的预期依赖性的类型相关的其他信息,诸如写入后读取冲突的存在或不存在。类似地,重新附接指令指定loop_cont地址和区域标识符,并且同步指令指定区域标识符。

图4示意性地示出了可以体现本技术的各种示例的微线程执行的示例的细节。具体地,执行分离指令(在这种情况下为uthread 0)的线程从具有新分配的纪元标识符的继续路径(loop_cont)开始继续执行,以反映在原始串行程序中,继续路径将按程序顺序在分离路径(循环主体)之后执行的事实。所生成的微线程(uthread 1)从具有从父级微线程继承的纪元标识符的分离路径(loop_body)开始执行。在该示例性实施方案中,uthread 0在loop_cont之后执行指令,首先将x10中存储的值递增1,将x10中的值与x3进行比较,并且基于结果更新条件标记,然后分支到loop_head并且重新执行分离指令。这使得新的微线程uthread 2被生成并且从loop_body继续,其中寄存器x10中的更新值从与uthread 0相关联的执行上下文导入到与uthread 2相关联的执行上下文中。如图所示,由uthread 0生成微线程继续进行,直到与b.ne指令相关联的条件标记指示设置了零标记,即,保存在寄存器x10中的值等于x3为止。此时,发出同步指令并且暂停uthread 0的执行,直到具有较先纪元标识符的微线程全部完成,即,它们已成功地执行了重新附接指令。

图5示意性地示出了可以体现本技术的各种替代示例的微线程执行的示例的细节。具体地,执行分离指令(最初为uthread 0)的线程从loop_body继续执行,而不改变其纪元标识符。所生成的微线程(最初为uthread 1)从具有新分配的纪元标识符的loop_cont开始执行,以反映在原始串行程序中,继续路径将按程序顺序在分离路径之后执行的事实。在这种情况下,uthread 0继续(假设成功执行而没有数据冲突)直到它达到重新附接指令并且uthread 1在继续地址处开始,将寄存器x10中存储的值递增1,将x10中存储的值与x3中存储的值进行比较,并且基于结果更新条件标记,然后分支到loop_head。uthread 1的执行从loop_head继续,其中发出分离指令,其在uthread 1的执行从loop_body继续(假设成功执行而没有数据冲突)直到达到重新附接指令之前产生微线程uthread 2。如图所示,由每个先前微线程生成新的微线程继续进行,直到与b.ne指令相关联的条件标记指示设置了零标记,即,保存在寄存器x10中的值等于x3为止。此时,发出同步指令(在这种情况下为uthread n)的微线程的执行被暂停,直到具有较先纪元标识符的微线程全部完成,即,它们已成功地执行了重新附接令。

图6示意性地示出了可以体现本技术的各种示例的微线程执行的示例的细节。在例示的示例中,微线程的生成遵循图4中阐述的方案,具有已设置调度因子n>1的附加特征。因此,微线程必须通过将分离和重新附接指令的特定发生视为无操作和无条件分支指令中的一者来将它们串行省略。具体地,如果分离-重新附接指令在从i=0开始并按程序顺序上升在微线程内被索引,则在(i%n)≠0的情况下,第i个分离应当被串行省略,并且发出分离的微线程是所有生成线程的父级线程(在该示例中为uthread 0),其中这里符号i%n是指i以n取模。对于其他所生成的微线程,所有分离指令必须被串行省略,因为利用该变体,仅父级微线程能够生成新的微线程。此外,只有在(i%n)≠n-1的情况下,才应串行省略第i个重新附接指令。具体地,在该实施方案中,调度因子被设置为n=2。因此,uthread 0针对分离指令的奇数次发生生成新的微线程,并且串行省略分离指令的偶数次发生。此外,uthread0将在未被串行省略的每个分离指令之间将循环索引i递增两次。所生成的微线程各自运行通过循环主体的两次迭代,每次执行loop_cont指令块时递增循环索引i。因此,uthread 0利用索引i=0生成uthread 1,并且然后uthread 0在串行省略分离指令的第二次发生之前递增循环索引。在遇到第三分离指令之前,循环索引再次被uthread 0递增,并且生成具有循环索引i=2的uthread 2,其中,如关于图4所描述的,该过程继续进行直到uthread 0遇到同步指令。

图7示意性地示出了可以体现本技术的各种示例的微线程执行的示例的细节。在循环的迭代次数不是调度因子的整数倍的情况下,父级微线程(在所示示例中为uthread0)和最后一个生成的微线程将潜在地都执行同步指令。通过引入以下规则来处理这种情况:规定同步删除或挤压具有比发出同步指令本身的微线程的纪元标识符更新的纪元标识符的微线程。在例示的示例中,微线程uthreadn/2达到具有纪元标识符(x+(n/2)-1)%max_epochs的同步的执行,其中x是uthread 0的初始纪元标识符并且max_epoch是最高限定的纪元标识符。当达到同步指令时,微线程uthread 0的纪元标识符是(x+(n/2))%max_epochs。在该示例中,微线程uthread 0的纪元标识符比微线程uthreadn/2的纪元标识符更新,并且因此被挤压,并且顺序执行将从微线程uthread n/2的执行上下文在并行部分的末端继续。

图8和图9示意性地示出可以体现本技术的各种示例的微线程执行的示例的细节。具体地,这些图基于与图4至图7相对应的相同示例性C代码,其中由编译器对汇编代码作出以下修改,以便利用在本发明的一些实施方案中阐述的具有调度因子n>1的任务级并行化:

循环通常具有相对简单的继续路径,其中代码主要处理递增和递减归纳变量。因此,线程的生成速率可能相对高,并且可以通过提供始于替代继续路径(loop_cont_x2)处的继续块的替代版本来利用进一步优化,该替代版本将通过将归纳变量递增一次以覆盖多个循环迭代来实现更快的生成速率。在以上阐述的示例性代码中,已使用了调度因子n=2,然而本领域技术人员将认识到这仅为了说明的目的而选择的,并且可以使用大于1的任何整数。

图8示意性地示出了可以基于以上示例汇编代码来体现本技术的各种示例的微线程执行的示例的细节。在例示的实施方案中,执行如关于图7所描述的那样进行,其中值得注意的例外是,当执行分离指令时,微线程uthread 0跳转到替代继续地址(loop_cont_x2)。始于替代继续地址的替代继续块将寄存器x10中的循环索引的值递增2。然后针对x3检查x10中的值以设置条件标记。当x10中的值小于x3时,b.lt(如果小于则分支)指令使得流程跳转到loop_head,否则流程继续跳转到同步指令。在这些例示的实施方案中,不需要微线程uthread 0将循环索引递减两次。相反,在替代继续块中,它被递减值2一次。

图9示意性地示出了可以基于以上示例汇编代码来体现本技术的各种示例的微线程执行的示例的细节。具体地,执行分离指令(最初为uthread0)的线程从loop_body继续执行而不改变其纪元标识符。所产生的微线程(最初为uthread 1)从具有新分配的纪元标识符的替代继续路径(loop_cont_x2)开始执行,以反映在原始串行程序中,替代继续路径将按程序顺序在分离路径之后执行的事实。在例示的示例中,调度因子已被设置为n=2。因此,微线程必须通过将分离和重新附接指令的特定发生视为无操作和无条件分支指令中的一者来将它们串行省略。具体地,如果我们从i=0开始并且按程序顺序上升在微线程内索引分离-重新附接指令,则在(i%n)≠0的情况下,应当串行省略第i次分离。只有在(i%n)≠n-1的情况下,第i次重新附接指令才应被串行省略。因此,uthread 0利用索引i=0生成uthread 1,其在替代继续块中立即递增到i=2,然后返回到loop_head,其中执行分离指令,致使用索引i=2生成微线程uthread 2。一旦初始分离指令已由微线程执行(例如使用微线程uthread 0),则在重新附接指令的第一次发生被串行省略之前用索引i=0执行循环主体,并且流程跳转到继续块(loop_cont),其中循环索引再次递增(i=1)。流程然后移动到循环头部,其中分离指令被串行省略并且循环主体在遇到第二重新附接指令且uthread0完成之前被执行。由于调度因子n被编译器硬接线到该版本中,所以在替代继续块(loop_cont_x2)之后的分离指令决不会被串行省略。该过程继续进行,直到与替代继续块中小于指令(b.lt)的分支相关联的条件标记指示当流程分支到同步指令时,寄存器x10中的值大于或等于x3为止,此时暂停发出同步指令的微线程的执行(在这种情况下为uthread n/2),直到具有较先纪元标识符的微线程全部完成,即,它们已成功地执行重新附接指令为止

图10示意性地显示了由本发明的一些示例进行的步骤序列。在步骤S1中,收集运行时数据,其指示与多线程处理电路上限定体系结构状态的对应执行上下文中的多个微线程的处理操作相关的性能度量。在步骤S2中,响应于在限定第一体系结构状态的第一执行上下文中执行的第一微线程指令中的分离指令,生成分离控制信号,该分离指令指定地址。在步骤S3中,响应于分离控制信号并且当运行时数据满足并行化标准时,生成在限定基于第一体系结构状态的第二体系结构状态的第二执行上下文中执行的第二微线程指令,第二微线程指令包括第一微线程指令的始于地址处的指令子集。对于本领域技术人员来说显而易见的是,并行化标准可以是对生成附加微线程是有益的指示,或者另选地,并行化标准可以是缺乏对不值得生成附加微线程的指示。

在简要的总体概述中,公开了一种数据处理装置和一种用于处理数据的方法。该数据处理装置包括:用于执行多个微线程的处理操作的多线程处理电路,每个微线程在限定体系结构状态的对应执行上下文中操作。线程控制电路收集指示与处理操作相关的性能度量的运行时数据。解码器电路响应于在限定第一体系结构状态的第一执行上下文中执行的第一微线程指令中的分离指令,以向线程控制电路提供分离控制信号,该分离指令指定地址。当运行时数据满足并行化标准时,线程控制电路响应于分离控制信号来生成在限定基于第一体系结构状态的第二体系结构状态的第二执行上下文中执行的第二微线程指令,第二微线程指令包括第一微线程指令的始于地址处的指令子集。

在本申请中,字词“被配置为…”用于意指装置的元件具有能够执行所限定的操作的配置。在该上下文中,“配置”意指硬件或软件的互连的布置或方式。例如,该装置可具有提供所限定的操作的专用硬件,或者可对处理器或其他处理设备进行编程以执行该功能。“被配置为”并不意味着装置元件需要以任何方式改变以便提供所限定的操作。

虽然本文已结合附图详细描述了示例性实施方案,但应当理解,本发明并不限于那些精确的实施方案,并且在不脱离所附权利要求书所限定的本发明的范围的前提下,本领域的技术人员可在其中实现各种变化、添加和修改。例如,在不脱离本发明的范围的情况下,从属权利要求的特征可与独立权利要求的特征一起进行各种组合。

技术分类

06120115929097