在多线程处理器中调度任务的制作方法

文档序号:17548110发布日期:2019-04-30 17:59阅读:149来源:国知局
在多线程处理器中调度任务的制作方法

本公开涉及由多线程处理器中的不同并发线程执行的任务的调度。



背景技术:

多线程处理器是能够彼此同时执行多个程序线程的处理器。处理器可以包括多个不同线程公共的一些硬件(例如,公共指令存储器、数据存储器和/或执行单元);但是为了支持多线程,处理器还包括一些特定于每个线程的专用硬件。

专用硬件至少包括针对可以一次执行的多个线程中的每个线程的相应上下文寄存器文件。当谈到多线程处理器时,“上下文”(context)指的是彼此同时执行的相应一个线程的程序状态(例如,程序计数器值、状态和当前操作数值)。上下文寄存器文件指的是用于表示相应线程的这个程序状态的相应寄存器集合。寄存器文件中的寄存器(register)与通用存储器的不同之处在于:寄存器地址被固定为指令字中的位,而存储器地址可以通过执行指令来被计算出。给定上下文的寄存器通常包括用于相应线程的相应程序计数器,以及用于暂时保存在由相应线程执行的计算期间作用于相应线程并由相应线程输出的数据的相应操作数寄存器组。每个上下文还可以具有用于存储相应线程的状态(例如,它是暂停还是正在运行)的相应状态寄存器。因此,每个当前运行的线程都具有它自己独立的程序计数器,以及可选的操作数寄存器和(一个或多个)状态寄存器。

一种可能的多线程形式是并行性。也就是说,除了多个上下文之外,还提供多个执行流水线:即,用于并行执行的每个指令流的单独的执行流水线。但是,这需要在硬件方面进行大量重复。

因此,另一种形式的多线程处理器采用并发性而不是并行性,其中线程共享公共执行流水线(或流水线的至少公共部分),并且不同的线程通过这个相同的共享执行流水线而交错。由于增加了用于隐藏流水线等待时间的机会,与没有并发性或并行性相比,多线程处理器的性能仍然可以得到改善。此外,这种方法不需要专用于每个线程的的额外硬件作为具有多个执行流水线的完全并行处理器,因此不会产生如此多的额外芯片。

多线程处理器还需要用于协调不同并发线程的执行的一些装置。例如,它需要确定将哪些计算任务分配给哪些线程。作为另一示例,并发线程中的一个或多个第一线程可以包含依赖于并发线程中的一个或多个其他线程的计算结果的计算。在这种情况下,需要执行屏障同步以将所讨论的线程带到公共执行点,使得一个或多个第一线程在一个或多个其他线程执行它们所依赖的计算之前不尝试执行这些依赖计算。相反,屏障同步要求(一个或多个)其他线程在(一个或多个)第一线程可以继续之前到达指定的点。



技术实现要素:

可以在专用硬件中实现协调并发线程的执行的一个或多个这样的功能。然而,这增加了处理器的硅足迹并且不像程序化软件方法那样灵活。另一方面,完全编程的软件方法在代码密度方面效率不高。期望找到一种在这两种方法之间取得了平衡的更精细方法来协调线程。

根据本文公开的一个方面,提供了一种处理器,包括:

执行单元,所述执行单元用于在不同时隙的重复序列的每一个中执行相应线程,所述序列由多个时隙组成,其中执行逻辑可操作以交错所述相应线程的执行;和

多个上下文寄存器组,每个上下文寄存器组包括用于表示相应线程的相应状态的相应寄存器组,其中所述上下文寄存器组包括针对所述执行单元可操作以在所述序列中交错的所述多个时隙中的每个时隙的相应工作者上下文寄存器组和至少一个额外的上下文寄存器组,使得上下文寄存器组的数量至少大于所述执行单元可操作以交错的时隙的数量,所述工作者上下文寄存器组被布置为表示执行计算任务的相应工作者线程的相应状态,并且所述额外的上下文寄存器组被布置为表示调度由所述工作者线程执行的任务的执行的监督者线程的状态;

其中,所述处理器被配置为在每个时隙中开始运行所述监督者线程,并且然后使得所述监督者线程能够将它正在其中运行的每个时隙各个地放弃给所述工作者线程的相应一个。

在实施例中,所述处理器可以被配置为使得所述监督者线程能够通过在其正在运行的时隙中执行一个或多个放弃指令来执行所述放弃。

在实施例中,所述一个或多个放弃指令是单个放弃指令。

在实施例中,执行单元可以被配置为根据定义由所述处理器识别的机器代码指令的类型的指令集来进行操作,每个机器代码指令由相应操作码定义;其中所述一个或多个放弃指令中的至少一个是具有操作码的指令集的专用指令,所述操作码在被执行时触发所述放弃。

在实施例中,在所述至少一个放弃指令的操作码中隐含:被放弃的时隙是执行所述至少一个放弃指令的时隙。

在实施例中,至少包括所述至少一个放弃指令的指令集的所述一个或多个指令可以被保留以供所述监督者线程使用,并且不可由所述工作者线程执行。

在实施例中,所述一个或多个放弃指令可以将所述被放弃的时隙正被放弃给的所述工作者线程的地址指定为操作数。

在实施例中,所述处理器可以被配置为:使得其中一个时隙已被放弃给的所述工作者线程能够通过在其正在运行的时隙中执行退出指令来将其正在运行的时隙返回到所述监督者线程。

在实施例中,所述执行单元可以被配置为根据定义由所述处理器识别的机器代码指令的类型的指令集来进行操作,每个机器代码指令由相应操作码定义;其中,所述退出指令可以是具有操作码的指令集的专用指令,该操作码在被执行时执行将所述被放弃的时隙返回到所述监督者线程的所述返回。

在实施例中,在所述退出指令的操作码中隐含:被返回的时隙是执行所述退出指令的时隙。

在实施例中,在所述退出指令的操作码中隐含:被返回的时隙正被返回到的线程是所述监督者线程。

在实施例中,至少包括所述退出指令的所述指令集的一个或多个指令可以被保留以供所述工作者线程使用并且不可由所述监督者线程执行。

在实施例中,所述监督者线程可以执行屏障同步以同步所述工作者线程。

在实施例中,所述监督者线程可以代表所述工作者线程中的一个或多个执行与外部资源的通信。

在实施例中,所述放弃指令还可以将一个或多个模式从所述监督者上下文寄存器组的一个或多个状态寄存器复制到由所述放弃指令启动的所述工作者的相应的一个或多个状态寄存器,从而控制所述工作者采用所述一个或多个模式。

在实施例中,所述处理器还可以被配置为执行指令,该指令在所述时隙的相应一个时隙中一起启动一组多于一个的工作者线程,所有都执行相同的代码。

在实施例中,所述处理器被配置为执行的指令集还包括多运行指令,所述多运行指令在所述时隙的相应时隙中一起启动多个工作者线程,所述多个工作者线程为三个或更多;其中一个工作者线程包括从所述多运行指令的操作数所指定的第一地址中提取的代码,并且其中所述多个工作者线程中的其他工作者线程包括从以相对于第一地址的步长值的步调分开的相应地址中提取的代码,其中所述步长值由所述多运行指令的另一个操作数指定。也就是说,所述多个工作者线程中的每个包括从与所述第一地址偏移步长值的相应整数倍的地址提取的代码,其中整数倍形成自然数的序列(1,2,3,..),即从1开始并以1为增量间隔开的正整数序列(每个时隙递增1)。

在实施例中,所述工作者线程数量等于所述时隙数量。即,多运行指令在每个时隙中启动一个线程,每个时隙来自由所述多运行指令的第一地址和步长值操作数所指定的一组步长地址中的不同的相应一个。

根据本文公开的另一方面,提供了一种操作处理器的方法,该方法包括:

使用执行单元在不同时隙的重复序列的每一个中执行相应线程,所述序列由多个时隙组成,其中执行逻辑可操作以交错所述相应线程的执行;

其中所述处理器包括多个上下文寄存器组,每个上下文寄存器组包括用于表示相应线程的相应状态的相应寄存器组,其中所述上下文寄存器组包括针对所述执行单元可操作以在所述序列中交错的所述多个时隙中的每个时隙的相应工作者上下文寄存器组和至少一个额外的上下文寄存器组,使得上下文寄存器组的数量至少大于所述执行单元可操作以交错的时隙的数量,所述工作者上下文寄存器组被用来表示执行计算任务的相应工作者线程的相应状态,并且所述额外的上下文寄存器组被用来表示调度由所述工作者线程执行的任务的执行的监督者线程的状态;和

该方法还包括在每个时隙中开始运行所述监督者线程,并且然后使得所述监督者线程能够将它正在其中运行的每个时隙各个地放弃给所述工作者线程的相应一个。

根据本文公开的另一方面,提供了一种计算机程序产品,包括体现在计算机可读存储器上并且被配置为在本文所公开的任何实施例的处理器上执行的代码,其中所述代码包括监督者线程和工作者线程。

附图说明

为了帮助理解本公开并示出可以如何实现实施例,通过示例的方式对以下附图进行参考,其中:

图1是多线程处理器的示意框图,

图2是多个线程上下文的示意框图,

图3示意性地图示出了交错时隙的方案,

图4示意性地图示出了在多个交错时隙中运行的监督者线程和多个工作者线程,

图5是包括组成处理器阵列的处理器的示意框图,和

图6是机器智能算法中使用的图形的示意图示。

具体实施方式

图1图示出了根据本公开的实施例的处理器4的示例。例如,处理器4可以是在同一芯片上的类似处理器瓦片的阵列之一,或者可以在其自己的芯片上被实现。处理器4包括呈桶形线程处理单元形式的多线程处理单元10,以及本地存储器11(即,在多瓦片阵列的情况下在相同的瓦片上,或者在单处理器芯片的情况下在相同的芯片上)。桶形线程处理单元是一种多线程处理单元,其中流水线的执行时间被划分为重复的交错时隙序列,其每一个可以由给定线程拥有。这将在稍后更详细地讨论。存储器11包括指令存储器12和数据存储器22(其可以在不同的可寻址存储器单元或同一可寻址存储器单元的不同区域中实现)。指令存储器12存储将由处理单元10执行的机器代码,而数据存储器22存储由执行的代码在其上进行操作的数据和由执行的代码输出的数据(例如,作为这种操作的结果)。

存储器12存储程序的各种不同线程,每个线程包括用于执行一个或多个特定任务的相应指令序列。注意,本文所指的指令意味着机器代码指令,即处理器的指令集的基本指令之一的实例,由单个操作码和零个或多个操作数组成。

本文所描述的程序包括多个工作者线程和监督者子程序,监督者子程序可以被构造为一个或多个监督者线程。这些将在稍后更详细地讨论。在实施例中,一些或所有工作者线程中的每一个采取相应“小代码”(codelet)的形式。小代码是一种特殊类型的线程,有时也被称为“原子”线程。它具有从线程开始(从启动时起)它执行所需的所有输入信息,即它在启动后不从程序的任何其他部分或从存储器中获取任何输入。此外,程序的其他任何部分都不会使用该线程的任何输出(结果),直到它已经终止(完成)。除非它遇到差错,否则它保证完成。注:一些文献也将小代码定义为无状态,即如果运行两次,它不能从第一次运行中继承任何信息,但这里不采用附加的定义。还要注意,并非所有工作者线程都需要是小代码(原子),并且在实施例中,一些或所有工作者可以改为能够彼此通信。

在处理单元10内,来自指令存储器12的多个不同的线程可以通过单个执行流水线13而被交错(尽管通常只有存储在指令存储器中的总计线程的子集可以在整个程序中的任何给定点处被交错)。多线程处理单元10包括:多个上下文寄存器文件26,每个上下文寄存器文件26被布置为表示要被并发执行的不同的相应一个线程的状态(上下文);对于并发执行的线程是公共的共享执行流水线13;调度器24,用于以交错的方式调度并行线程以用于通过共享流水线执行,优选地以轮循的方式执行。处理单元10连接到对于多个线程是公共的共享指令存储器12,以及对于多个线程同样是公共的共享数据存储器22。

执行流水线13包括提取级14、解码级16和执行级18,执行级18包括执行单元,该执行单元可以执行算术和逻辑运算、地址计算、加载和存储操作以及由指令集架构所定义的其他操作。每个上下文寄存器文件26包括用于表示相应线程的程序状态的相应寄存器组。

在图2中示意性地图示出了构成每个上下文寄存器文件26的寄存器的示例。每个上下文寄存器文件26包括相应的一个或多个控制寄存器28,其包括至少用于相应线程的程序计数器(pc)(用于跟踪线程当前正在执行的指令地址),并且在实施例中还有记录相应线程的当前状态(诸如它当前是正在运行还是暂停,例如因为它遇到了差错)的一组一个或多个状态寄存器(sr)。每个上下文寄存器文件26还包括相应的一组操作数寄存器(op)32,用于暂时保存由相应线程执行的指令的操作数,即,在被执行时由相应线程的指令的操作码所定义的操作上操作的或由其产生的值。应当理解,每个上下文寄存器文件26可以可选地包括相应的一个或多个其他类型的寄存器(未示出)。还要注意,虽然术语“寄存器文件”有时被用来指代公共地址空间中的一组寄存器,但这不一定必须是本公开中的情况并且每个硬件上下文26(每个寄存器组26表示每个上下文)可以更一般地包括一个或多个这样的寄存器文件。

如稍后将更详细讨论的,所公开的布置具有用于可以并发执行的m个线程中的每一个线程的一个工作者上下文寄存器文件cx0...cx(m-1)(在所图示的示例中m=3但是这不是限制),以及一个附加的监督者上下文寄存器文件cxs。工作者上下文寄存器文件被保留以用于存储工作者线程的上下文,并且监督者上下文寄存器文件被保留以用于存储监督者线程的上下文。注意,在实施例中,监督者上下文是特殊的,因为它具有与每个工作者不同数量的寄存器。每个工作者上下文优选地具有彼此相同数量的状态寄存器和操作数寄存器。在实施例中,监督者上下文可以具有比每个工作者更少的操作数寄存器。工作者上下文可能具有而监督者没有的操作数寄存器的示例,包括:浮点寄存器、累加寄存器和/或专用权重寄存器(用于保存神经网络的权重)。在实施例中,监督者还可以具有不同数量的状态寄存器。此外,在实施例中,处理器4的指令集架构可以被配置为使得工作者线程和(一个或多个)监督者线程执行一些不同类型的指令但是还共享一些指令类型。

连接提取级14,以便在调度器24的控制下从指令存储器12中提取要执行的指令。调度器24被配置为控制提取级14以在重复的时隙序列中依次从一组并发执行的线程的每一个线程中提取指令,从而将流水线13的资源划分为多个时间上交错的时隙,这将在下面更详细地讨论。例如,调度方案可以是轮循或加权轮循。针对以这种方式操作的处理器的另一个术语是桶形线程处理器。

在一些实施例中,调度器24可以访问指示线程是否被暂停的每个线程的状态寄存器sr之一,以便调度器24实际上控制提取级14以仅提取目前活动的那些线程的指令。在实施例中,优选地,每个时隙(和对应的上下文寄存器文件)总是由一个线程或另一个线程拥有,即每个时隙总是被某个线程占用,并且每个时隙总是被包括在调度器24的序列中;虽然占用任何给定时隙的线程可能恰好在此时暂停,在这种情况下,当序列到达该时隙时,用于相应线程的指令提取被传递。可替代地,非排除地举例而言,在替代的、较不优选的实现中,一些时隙可以暂时空出并从调度序列中被排除。在对执行单元可操作以进行交错的时隙数量进行参考的情况下,或类似地,这指的是执行单元能够并发执行的最大时隙数量,即执行单元的硬件支持的并发时隙的数量。

提取级14可以访问每个上下文的程序计数器(pc)。对于每个相应的线程,提取级14从程序存储器12中的下一个地址提取那个线程的下一条指令,如程序计数器所指示的。程序计数器递增每个执行周期,除非被分支指令进行了分支。然后,提取级14将所提取的指令传递到解码级16以进行解码,然后解码级16将已解码指令的指示连同指令中指定的任何操作数寄存器32的已解码地址一起传递给执行单元18,以便执行指令。执行单元18可以访问操作数寄存器32和控制寄存器28,它可以在执行指令时基于已解码寄存器地址使用之,诸如在算术指令的情况下(例如通过加、乘、减或除两个操作数寄存器中的值,并将结果输出到相应线程的另一个操作数寄存器中)。或者,如果指令定义了存储器访问(加载或存储),则执行单元18的加载/存储逻辑根据指令将来自数据存储器的值加载到相应线程的操作数寄存器中,或者将来自相应线程的操作数寄存器的值存储到数据存储器22中。或者,如果指令定义了分支或状态改变,则执行单元相应地改变程序计数器pc或其中一个状态寄存器sr中的值。注意,当一个线程的指令正被执行单元18执行时,来自交错序列中的下一个时隙中的线程的指令可以正被解码级16解码;和/或当一个指令正被解码级16解码时,来自该线程之后的下一个时隙中的线程的指令可以正被提取级14提取(尽管通常本公开的范围不限于每个时隙一个指令,例如在备选场景中,每个时隙可以从给定线程发出两个或更多个的批量指令)。因此,根据已知的桶形线程处理技术,交错有利地隐藏了流水线13中的等待时间。

图3中图示出了由调度器24实现的交错方案的示例。这里,根据轮循方案对并发线程进行交错,由此,在该方案的每一轮次内,该轮次被划分成时隙序列s0,s1,s2……,每个用于执行相应的线程。通常,每个时隙是一个处理器周期长,并且不同的时隙是均匀大小的,但是在所有可能的实施例中不一定如此,例如加权轮循方案也是可能的,由此,一些线程在每个执行轮次中得到比其他线程更多的循环。通常,桶形线程可以采用均匀轮循(evenround-robin)或加权轮循调度,其中在后一种情况下,加权可以是固定的或自适应的。

无论每一执行轮次的序列如何,该模式然后都进行重复,每一轮次包括每个时隙的相应实例。因此,注意,本文所指的时隙意味着序列中的重复分配位置,而不是时隙在序列的给定重复中的特定实例。换句话说,调度器24将流水线13的执行周期分派到多个时间交错(时分复用)的执行信道中,每个执行信道包括重复的时隙序列中的相应时隙的重现。在所图示的实施例中,存在四个时隙,但这仅用于说明目的,并且其他数量也是可能的。例如。在一个优选实施例中,实际上存在六个时隙。

无论轮循方案被划分为多少个时隙,则根据本公开,处理单元10包括比存在时隙时多一个上下文寄存器文件26,即它支持比它实现桶形线程的交错时隙的数量多一个上下文。

这在图2中以示例的方式图示出:如果存在如图3中所示的四个时隙s0……s3,则存在五个上下文寄存器文件,在此被标记为cx0、cx1、cx2、cx3和cxs。也就是说,即使在桶形线程方案中只有四个执行时隙s0……s3,并且因此只能并发执行四个线程,本文也公开了添加第五个上下文寄存器文件cxs,包括第五程序计数器(pc)、第五组操作数寄存器32、并且在实施例中还包括第五组一个或多个状态寄存器(sr)。尽管注意如上所提及,但是在实施例中,监督者上下文可以与其他cx0……3不同,并且监督者线程可以支持用于操作执行流水线13的不同指令集。

前四个上下文cx0……cx3中的每一个被用来表示当前被指派给四个执行时隙s0……s3之一的多个“工作者线程”中的相应一个的状态,用于执行程序员所希望的任何特定于应用的计算任务(再次注意,这可以只是存储在指令存储器12中的程序的工作者线程总数的子集)。然而,第五个上下文cxs被保留以用于特殊的功能,以表示“监督者线程”(sv)的状态,其角色是协调工作者线程的执行,至少指派在整个程序中的哪个点的时隙s0,s1,s2……中的哪一个执行哪个工作者线程w。可选地,监督者线程可以具有其他“监视者”或协调职责。例如,监督者线程可以负责执行屏障同步以确保特定的执行顺序。例如在一个或多个第二线程依赖于由在同一处理器模块4上运行的一个或多个第一线程输出的数据的情况下,监督者可以执行屏障同步以确保在第一线程完成之前没有第二线程开始。和/或,监督者可以执行屏障同步以确保处理器模块4上的一个或多个线程不会开始,直到诸如另一瓦片或处理器芯片之类的某个外部数据源已经完成了使该数据可用所需的处理。监督者线程还可以被用来执行与多个工作者线程有关的其他功能性。例如,监督者线程可以负责在处理器4外部传送数据(以接收作用于一个或多个线程的外部数据,和/或发送由一个或多个工作者线程输出的数据)。通常,监督者线程可以被用来提供程序员所期望的任何类型的监视或协调功能。例如,作为另一个示例,监督者可以监视在瓦片本地存储器12与较宽系统(阵列6外部)中的一个或多个资源(诸如存储盘或网卡)之间的传送。

当然,注意:四个时隙仅是示例,并且通常在其他实施例中可以存在其他数量,使得如果每一轮次最多m个时隙0……m-1,则处理器4包括m+1个上下文cx……cx(m-1)和cxs,即针对每个工作者线程一个可以在任何给定时间被交错的上下文,以及针对监督者的额外的上下文。例如。在一个示例性实现中,存在六个时隙和七个上下文。

参考图4,根据本文的教导,监督者线程sv在交错执行时隙的方案中本身不具有其自己的时隙。工作者线程也是这样,因为向工作者分配时隙也不是灵活定义的。相反,每个时隙都有其自己的专用上下文寄存器文件(cx0……cxm-1),用于存储工作者上下文,其在时隙被分配给工作者时被使用,但在时隙被分配给监督者时不被使用。当给定时隙被分配给监督者时,该时隙改为使用监督者的上下文寄存器文件cvs。注意,监督者始终可以访问自己的上下文,并且没有工作者能够占用监督者上下文寄存器文件cxs。

监督者线程sv具有在任何和所有时隙s0……s3(或更一般地,s0……sm-1)中运行的能力。调度器24被配置成,当程序作为一个整体开始时,通过将监督者线程分配给所有时隙而开始,即,因此监督者sv开始在所有s0……s3中运行。但是,向监督者线程提供了一种机制,用于在某个后续点(直接或执行一个或多个监督者任务之后)将其正在运行的每个时隙暂时放弃给相应的一个工作者线程,例如在图4中所示的示例中最初的工作者w0……w3。这是通过监督者线程执行放弃指令来实现,在本文中通过示例的方式称为“run”。在实施例中,该指令采用两个操作数:指令存储器12中的工作者线程的地址和数据存储器22中针对该工作者线程的一些数据的地址:

runtask_addr,data_addr

工作者线程是可以彼此并发运行的代码的一部分,每个代表一个或多个要执行的相应计算任务。数据地址可以指定工作者线程所作用于的一些数据。可替代地,放弃指令可以只采用指定工作者线程的地址的单个操作数,并且数据地址可以被包含在工作者线程的代码中;或者在另一个示例中,单个操作数可以指向指定工作者线程的地址和数据的数据结构。如上所提及,在实施例中,至少一些工作者可以采用小代码的形式,即并发可执行代码的原子单元。可替代地或另外地,一些工作者不需要是小代码,而是可以改为能够相互通信。

放弃指令(“run”)作用于调度器24,以便将执行该指令本身的当前时隙放弃给由操作数指定的工作者线程。注意,在放弃指令中隐含它是正在被放弃的执行该指令的时隙(在机器代码指令的上下文中隐含意味着它不需要操作数来指定它——从操作码本身隐含地理解它)。因此,交出的时隙是监督者在其中执行放弃指令的时隙。或者换句话说,监督者正在它所交出的相同空间中执行。监督者说“在这个位置运行这段代码”,然后从那点起,重现的时隙由相关的工作者线程(暂时)拥有。

监督者线程sv在一个或多个其他时隙中的每一个中执行类似的操作,以将其部分或全部时隙交出给工作者线程w0……w3中的不同相应的工作线程(在指令存储器12中从较大的集合w0……wj中选择)。一旦它完成了最后一个时隙的操作,监督者就会被暂停(然后当工作者w将其中一个时隙交还时,稍后将在它停止的地方恢复)。

因此,监督者线程sv能够将不同的工作者线程分配给交错的执行时隙s0……s3中的不同时隙,每个工作者线程执行一个或多个任务。当监督者线程确定是时候运行工作者线程时,它使用放弃指令(“run”)将该工作者分配给在其中执行run指令的时隙。

在一些实施例中,指令集还包括运行指令的变体runall(“全部运行”)。该指令被用来一起启动一组多个一个的工作者,所有这些都执行相同的代码。在实施例中,这在处理单元的每个时隙s0……s3(或更一般地,s0……s(m-1))中启动工作者。

作为runall指令的替代或补充,在一些实施例中,指令集可以包括“多运行”指令multirun。该指令还启动多个工作者线程,每个线程位于相应的一个时隙中。在优选实施例中,它在所有时隙s0……s(m-1)的每一个中启动相应的工作者线程w(即,启动的工作者线程的总计数量等于硬件工作者上下文的数量m)。但是,multirun与runall指令的不同之处在于,多个启动的线程并不是都由从相同任务地址取得的相同代码组成。相反,multirun至少取得两个操作数:第一显式任务地址;和步长值:

multiruntask_addr,stride

多个启动线程中的第一个线程取自由multirun指令的地址操作数所指定的地址task_addr。多个启动线程中的每个都取自一个地址,该地址等于第一个线程的地址加上步长值的相应递增整数倍,倍数是从1开始的正整数序列,每个时隙递增1。换句话说,启动的工作者线程以相对于第一地址的步长值的步调分开。即所以第二个线程取自地址=task_addr+步长,第三个线程取自地址=task_addr+2*步长,第四个线程取自地址=task_addr+3*步长(等等,取决于启动线程的数量,其在实施例中等于时隙s的数量)。multirun指令的执行触发m个多个工作者中的每一个在相应的一个时隙s0...s(m-1)中启动,每个都由程序计数器开始,该程序计数器由如上所指定的那样所确定的相应地址值来定义。

此外,在一些实施例中,run、runall和/或multirun指令在被执行时还将一些状态从一个或多个监督者状态寄存器cxs(sr)自动地复制到由run或runall启动的(一个或多个)工作者线程的对应的一个或多个状态寄存器。例如,复制的状态可以包括一个或多个模式,诸如浮点舍入模式(例如,舍入到最近或舍入到零)和/或溢出模式(例如,饱和或使用表示无穷大的单独值)。然后,复制的状态或模式控制所说的工作者以根据复制的状态或模式进行操作。在实施例中,工作者稍后可以在其自己的状态寄存器中覆盖它(但是不能改变监督者的状态)。在进一步的替代或另外的实施例中,工作者可以选择从监督者的一个或多个状态寄存器中读取一些状态(并且稍后可以再次改变它们自己的状态)。例如,再次,这可以是采用来自监督者状态寄存器的模式,诸如浮点模式或舍入模式。然而,在实施例中,监督者不能读取工作者的任何上下文寄存器cx0……。

一旦启动,当前分配的工作者线程w0……w3中的每一个继续执行在由相应的放弃指令所指定的代码中所定义的一个或多个计算任务。在此结束时,相应的工作者线程然后将它正在运行的时隙归还给监督者线程。这通过执行退出指令(“exit”)来实现。在一些实施例中,这不采取任何操作数:

exit

可替代地,在其他实施例中,exit指令采取单个操作数exit_state(例如二进制值),以用于程序员所期望的任何目的,以在结束时指示相应小代码的状态(例如,以指示是否满足某个终止条件或是否发生了差错):

exitexit_state

无论哪种方式,exit指令作用于调度器24,使得执行它的时隙归还给监督者线程。然后,监督者线程可以执行一个或多个后续监督者任务(例如,屏障同步和/或数据的交换),和/或继续执行另一个放弃指令以将新的工作者线程(w4等)分配给所说的时隙。因此,再次注意,指令存储器12中的工作者线程的总数可以大于桶形线程处理单元10在任何一个时刻可以交错的数量。监督者线程sv的作用是调度来自指令存储器12的哪个工作者线程w0……wj,在整个程序中的哪一级,被指派给调度器24的轮循调度的哪个交错时隙s0······sm。

在实施例中,还存在另一种方式,其中工作者线程可以将其时隙返还给监督者线程。也就是说,执行单元18包括异常机制,该异常机制被配置为当工作者线程遇到异常时,它可以自动地将其时隙返还给监督者。在这种情况下,可以将单独的退出状态设置为默认值,或者可以未受影响。

此外,在实施例中,处理单元10可以被配置为使得指令集的一个或多个指令被保留以供监督者线程而不是工作者线程使用,和/或指令集的一个或多个指令被保留以供工作者线程而不是监督者线程使用。例如,这可以在执行级18、解码级16或提取级14中被强制执行,假设放弃(run)和退出(exit)指令作用于相关级以通知它哪种类型的线程当前正在占用所说的时隙。在这种情况下,监督者专用指令至少包括放弃指令,但是还可以包括其他指令,诸如如果处理单元10包含用于执行屏障同步的专用逻辑,则还可以包括一个或多个屏障同步指令。此外,工作者专用指令至少包括退出指令,但是还可以包括其他指令,诸如浮点运算(其易于出错)。

上述处理器4可以用于包括处理单元10和存储器11的单个实例的单个独立处理器。可替代地,如图5中所图示,在一些实施例中,处理器4可以是集成在同一芯片上或跨越多个芯片的在阵列6中的多个处理器中的一个。在这种情况下,处理器4经由合适的互连34连接在一起,所述合适的互连34使得它们能够彼此传送数据,包括由阵列上的不同工作者线程中的一个、一些或所有线程执行的一个或多个计算的结果。例如,处理器4可以是在单个芯片上实现的更宽的、多瓦片处理器中的多个瓦片之一,每个瓦片包括其自己的桶形线程处理单元10和相关联存储器11的相应实例,每个都被如上面关于图1至图4所述的那样配置。为了完整起见,还要注意,本文所指的“阵列”不一定意味着瓦片或处理器4的任何特定数量的尺寸或物理布局。在一些这样的实施例中,监督者可以负责在瓦片之间进行交换。

在一些实施例中,exit指令被给予另一特殊功能,即,使得exit指令的操作数中指定的退出状态被(通过专用硬件逻辑)与通过相同的流水线13运行的多个其他工作者线程的退出状态自动聚合,每个这样的工作者具有被指定为其自己的exit指令实例的操作数的相应退出状态。这可以是将指定的退出状态与由相同处理器模块4(即,通过给定处理单元10的相同流水线13)运行的所有工作者线程或者至少是指定阶段中的所有的退出状态聚合。在一些实施例中,可以执行另外的指令以与在阵列6中的一个或多个其他处理器(其可以是在同一芯片上的其他瓦片或甚至是在其他芯片上)上运行的工作者线程的退出状态聚合。无论哪种方式,处理器4包括至少一个寄存器38,其专门被布置为存储处理器4的本地聚合的退出状态。在实施例中,这是监督者的上下文寄存器文件cxs中的监督者的状态寄存器之一。当每个exit指令由相应的线程执行时,专用聚合逻辑使exit指令的操作数中指定的退出状态对存储在退出状态寄存器38中的聚合的退出状态有贡献。在任何时刻,例如一旦感兴趣的所有工作者借助相应的退出指令而终止,则监督者线程可以从退出状态寄存器38访问退出状态。这可以包括访问其自己的状态寄存器sr。

在执行单元18中的专用硬件电路中实现聚合逻辑。因此,在用于终止工作者线程的指令中包括额外的隐式设施。专用电路或硬件意味着具有硬连线功能的电路,而不是使用通用代码以软件进行编程。通过执行特殊exit指令的操作码来触发本地聚合的退出状态(在寄存器38中)的更新,这是具有聚合退出状态的固有功能性的在处理器4的指令集中的基本机器代码指令之一。此外,本地聚合的退出状态被存储在寄存器38中,意味着专用存储片(在实施例中是单个存储位),其值可以由在流水线上运行的代码访问。优选地,退出状态寄存器38形成监督者的状态寄存器之一。

作为示例,各个线程的退出状态和聚合的退出状态可以各自采取单个位的形式,即0或1,并且聚合逻辑可以被配置为采取各个工作者退出状态的逻辑and(和)。这意味着任何输入为0导致聚合为0,但如果所有输入都为1,则聚合为1。即,如果1被用来表示真或成功的结果,则这意味着:如果任何工作者线程的任何本地退出状态为假或不成功,那么整个聚合的退出状态也将为假或表示不成功的结果。例如,这可以被用来确定工作者是否全部满足终止条件。因此,监督者子程序可以查询单个寄存器(在实施例中是单个位)以询问“出了什么问题吗?是或否”,而不是必须检查每个单独的瓦片上的各个工作者线程的各个状态。实际上,在实施例中,监督者不能在任何任意点处查询工作者并且不能访问工作者的状态,使得退出状态寄存器38成为确定工作者线程的结果的唯一装置。监督者不知道哪个上下文寄存器文件对应于哪个工作者线程,并且在工作者exit之后,工作者状态消失。监督者确定工作者线程的输出的唯一其他方式是工作者将消息留在通用数据存储器22中。

与上述逻辑等效的是用or门(或门)替换and并在软件中反转退出状态0和1的解释,即0→真,1→假。等效地,如果and门被or门替换但是退出状态的解释没有被反转,也没有反转复位值,那么$lc中的聚合的状态将记录是否有任何(而不是全部)工作者状态以状态1退出。在其他实施例中,退出状态不需要是单个位。例如,每个单独的工作者的退出状态可以是单个位,但是聚合的退出状态可以包括表示三态的两个位:所有工作者以状态1退出,所有工作者以状态0退出,或工作者的退出状态是混合的。作为用于实现这一点的逻辑的示例,编码三元值的两位之一可以是各个退出状态的布尔and(与),并且三元值的另一位可以是各个退出状态的布尔or(或)。然后可以将指示工作者的退出状态是混合的第三编码情况形成为这两位的xor(异或)。

退出状态可以被用来表示程序员希望的任何内容,但一个特别设想的示例是使用退出状态1来指示相应的工作者线程以“成功”或“真”状态退出,而退出状态0指示相应的工作者线程以“不成功”或“假”状态退出(反之亦然,如果聚合电路执行or而不是and并且寄存器$lc38最初被复位为0)。例如,考虑一个应用,其中每个工作者线程执行具有相关联条件的计算,诸如指示机器智能算法的图形中的相应节点的一个或多个参数中的(一个或多个)差错根据预定的度量是否落在可接受的水平内的条件。在这种情况下,一个逻辑电平(例如1)的单独的退出状态可以被用来指示条件被满足(例如,根据某个度量,节点的一个或多个参数中的一个或多个差错在可接受的水平内);而相反逻辑电平(例如0)的单独的退出状态可以被用来指示条件未被满足(例如,根据所说的度量,一个或多个差错不在可接受的水平内)。该条件可以例如是放置在单个参数或每个参数上的差错阈值,或者可以是与工作者线程执行的相应计算相关联的多个参数的更复杂的功能。

作为另一个更复杂的示例,工作者的各个退出状态和聚合的退出状态可以各自包括两个或更多个位,例如,其可以被用来表示工作者线程的结果的置信度。例如。每个单独的工作者线程的退出状态可以表示对相应工作者线程的结果的置信度的概率测量,并且聚合逻辑可以被用于在硬件中执行各个置信度的概率性聚合的更复杂电路所替换。

无论程序员对退出状态给出什么含义,监督者线程sv然后可以从退出状态寄存器38访问聚合值以确定自上次复位以来(例如在最后的同步点处)退出的所有工作者线程的聚合的退出状态,例如以便确定所有工作者是否以成功或真状态退出。取决于该聚合值,监督者线程然后可以根据程序员的设计做出决定。程序员可以选择对他或她希望的本地聚合的退出状态进行任何使用,例如,确定是否引发异常,或者取决于聚合的退出状态执行分支决策。例如,监督者线程可以咨询本地聚合的退出状态,以便确定由多个工作者线程组成的程序的特定部分是否已按预期或期望完成。如果不是(例如,工作者线程中的至少一个以不成功或假状态退出),则它可以向主处理器报告,或者可以执行程序的包括相同工作者线程的该部分的另一次迭代;但如果是(例如,所有工作者线程都以成功或真状态退出),它可以改为分支到程序的包括一个或多个新工作者的另一部分。

优选地,直到所说的所有工作者线程都退出之前,监督者子程序不应访问退出状态寄存器38中的值,使得其中存储的值表示所有所期望线程的正确的、最新的聚合状态。等待这一过程可以通过由监督者线程执行的屏障同步来强制执行,以等待所有当前运行的本地工作者线程(即,通过相同的流水线13运行的在同一处理器模块4上的那些线程)退出。也就是说,监督者线程复位退出状态寄存器38,启动多个工作者线程,然后启动屏障同步,以便在允许监督者继续从退出状态寄存器38获得聚合的退出状态之前等待所有未完成的工作者线程退出。

图6图示出了本文所公开的处理器架构的示例应用,即机器智能的应用。

如机器智能领域的技术人员所熟悉的,机器智能从学习阶段开始,其中机器智能算法学习知识模型。该模型包括互连节点(即顶点)102和边缘(即链路)104的图形。图形中的每个节点102具有一个或多个输入边缘和一个或多个输出边缘。一些节点102的一些输入边缘是一些其他节点的输出边缘,从而将节点连接在一起以形成图形。此外,一个或多个节点102的一个或多个输入边缘作为整体形成对图形的输入,并且一个或多个节点102的一个或多个输出边缘作为整体形成图形的输出。有时,给定节点甚至可以具有以下所有这些:去往图形的输入,来自图形的输出和去往其他节点的连接。每个边缘104传送值或更常见的张量(n维矩阵),这些值分别形成在其输入和输出边缘上提供给节点102和从节点102提供的输入和输出。

每个节点102表示在其一个或多个输入边缘上接收的其一个或多个输入的功能,该功能的结果是在一个或多个输出边缘上提供的(一个或多个)输出。由一个或多个相应参数(有时称为权重,但它们不需要一定是乘法权重)对每个功能进行参数化。通常,由不同节点102表示的功能可以是不同形式的功能和/或可以通过不同参数来参数化。

此外,每个节点的功能的一个或多个参数中的每一个的特征在于相应的差错值。此外,相应的条件可以与每个节点102的(一个或多个)参数中的(一个或多个)差错相关联。对于表示由单个参数参数化的功能的节点102,条件可以是简单阈值,即如果差错在指定的阈值内,则满足条件,但如果差错超出阈值则不满足条件。对于由多于一个相应参数参数化的节点102,针对该节点102已达到可接受差错水平的条件可能更复杂。例如,仅当该节点102的每个参数都落入相应阈值内时才满足条件。作为另一示例,可以定义组合度量来组合针对相同节点102的不同参数中的差错,并且在组合度量的值落在指定阈值内的条件下可以满足条件,但如果组合度量值超出阈值则不满足条件(反之亦然,具体取决于度量的定义)。无论条件如何,这都给出了节点的(一个或多个)参数中的差错是否低于某一可接受程度或水平的测量。通常,可以使用任何合适的度量。对于所有节点,条件或度量可以是相同的,或者对于不同的相应节点可以是不同的。

在学习阶段,算法接收经验数据,即表示对图形的不同可能输入组合的多个数据点。随着越来越多的经验数据被接收,该算法基于经验数据逐渐调整图形中各节点102的参数,以试图最小化参数中的差错。目标是找到参数的值,使得图形的输出尽可能接近针对给定输入的期望输出。由于图形作为整体倾向于这种状态,因此该图形被称作会收敛。在适当的收敛程度之后,该图形可以被用来执行预测或推断,即预测针对某个给定输入的结果或推断针对某个给定输出的原因。

学习阶段可以采取多种不同的形式。例如,在监督的方法中,输入经验数据采取训练数据的形式,即与已知输出相对应的输入。对于每个数据点,算法可以调整参数,使得输出更接近地匹配针对给定输入的已知输出。在随后的预测阶段中,该图形然后可以被用来将输入查询映射到近似预测输出(或者如果进行推断则反之亦然)。其他方法也是可能的。例如,在无监督的方法中,不存在每个输入数据的参考结果的概念,而是改为将机器智能算法留下来在输出数据中标识其自己的结构。或者在强化方法中,算法针对输入经验数据中的每个数据点试验至少一个可能的输出,并且被告知该输出是正还是负(并且可能被告知正或负的程度),例如赢或输、或奖励或惩罚、或类似的。在许多试验中,算法可以逐渐调整图形的参数,以便能够预测将将导致正结果的输入。用于学习图形的各种方法和算法对于机器学习领域的技术人员来说将是已知的。

根据本文所公开的技术的示例性应用,每个工作者线程被编程为执行与机器智能图形中的相应的各个节点102相关联的计算。在这种情况下,节点102之间的至少一些边缘104对应于线程之间的数据的交换,并且一些可以涉及瓦片之间的交换。此外,程序员使用工作者线程的各个退出状态来表示相应节点102是否已满足其对于该节点的(一个或多个)参数的收敛的相应条件,即使一个或多个参数中的差错落在差错空间的可接受水平或区域内。例如,这是实施例的一个示例使用,其中各个退出状态的每一个是单独的位,并且聚合的退出状态是各个退出状态的and(或者等效地,如果将0认为是正,则为or);或者聚合的退出状态是一个三元值,表示各个退出状态是否都是真的、都是假的或是混合的。因此,通过检查退出状态寄存器38中的单个寄存器值,程序可以确定图形作为整体还是图形的至少一个子区域已经收敛到可接受的程度。

作为其另一变体,可以使用实施例,其中聚合采取各个置信度值的统计聚合的形式。在这种情况下,每个单独的退出状态表示由相应线程表示的节点的参数已达到可接受的差错程度的置信度(例如,作为百分比)。聚合的退出状态然后可以被用来确定关于图形或图形的子区域是否已经收敛到可接受程度的总体置信度。

在多瓦片布置6的情况下,每个瓦片运行图形的子图形。每个子图形包括监督者子程序,该子程序包括一个或多个监督者线程,以及一组工作者线程,其中一些或所有工作者可以采取小代码的形式。

在这样的应用中,或者实际上任何基于图形的应用中,每个工作者线程被用来表示图形中的相应节点,每个工作者所包括的“小代码”可以被定义为在一个顶点的输入/输出和持久状态上操作的软件过程,其中小代码:

●在一个工作者线程寄存器上下文中被启动,以由执行“运行”指令的监督者线程在一个桶形时隙中运行;

●运行完成而不与其他小代码或监督者通信(除了在小代码退出时返回给监督者);

●可以经由通过“运行”指令提供的存储器指针访问顶点的持久状态,并访问存储器中的非永久工作区域,该区域专用于该桶形时隙;和

●作为其最后一条指令执行“exit”,然后将其正在使用的桶形时隙返回给监督者,并且将退出指令所指定的退出状态与监督者可见的瓦片的本地退出状态聚合。

更新图形(或子图形)意味着以与边缘定义的因果关系一致的任何顺序更新每个组成顶点一次。更新顶点意味着在顶点状态上运行小代码。小代码是针对顶点的更新过程——一个小代码通常与许多顶点相关联。监督者每个顶点执行一个run指令,每个这样的指令指定一个顶点状态地址和一个小代码地址。

应当理解,仅通过示例的方式描述了上述实施例。

例如,本公开的适用性不限于关于图2和图3所概述的特定处理器架构,并且一般而言,通过添加至少比可能的时隙多一个上下文,本文所公开的概念可以应用于具有多个执行时隙的任何处理器架构。

还要注意,不排除可以包括超出时隙数量的其他上下文用于其他目的。例如。一些处理器包括调试上下文,其从不代表实际运行的线程,但是当它遇到差错时由线程使用,以便存储差错线程的程序状态,以便稍后由程序开发者进行分析以用于调试目的。

此外,监督者线程的作用不仅限于屏障同步和/或线程之间的数据交换,并且在其他实施例中,它可以可替代地或另外地负责涉及两个或更多个工作者线程的可见性的任何其他功能性。例如,在程序包括图形的多次迭代的实施例中,监督者线程可以负责确定要执行的图形的多少次迭代,这可以取决于先前迭代的结果。

鉴于本文的公开内容,所公开的技术的其他变体或应用对于本领域技术人员而言将变得显而易见。本公开的范围不由上面讨论的示例实施例来限制,而是仅由所附权利要求来限制。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1