对任务进行调度的制作方法

文档序号:16530448发布日期:2019-01-05 10:42阅读:190来源:国知局
对任务进行调度的制作方法

图形处理单元(gpu)包括高度并行的结构,其被设计为并行地对大量数据进行高效处理。gpu通常用于计算机图形(例如,在屏幕上呈现3d图像),但是它们也可以用于受益于它们提供的并行性的其他操作。

下面描述的实施方式仅作为示例被提供,且不是解决已知gpu或其他并行处理单元的任何或所有缺点的实现方式的限制。

概述

提供本概述来以简化形式引入在以下详细描述中将进一步描述的概念的选择。本概述不旨在标识出要求保护的主题的关键特征或必要特征,亦不旨在用于限定要求保护的主题的范围。

描述了一种在并行处理单元内对指令进行调度的方法。该方法包括在指令解码器中对处于激活状态的调度任务中的指令进行解码,以及通过指令控制器检查解码的指令的目标alu是否是主指令管线。如果目标alu是主指令管线,则与主指令管线相关联的列表被检查以确定调度任务是否已经被包括在该列表中。如果调度任务已经被包括在该列表中,则解码的指令被发送到主指令管线。

第一方面提供了一种在并行处理单元内对指令进行调度的方法,包括:在指令解码器中对处于激活状态的调度任务中的指令进行解码;通过指令控制器检查解码的指令的目标alu是否是主指令管线;响应于确定解码的指令的目标alu是主指令管线,检查与主指令管线相关联的列表以确定调度任务是否已经被包括在该列表中;以及响应于确定调度任务已经被包括在该列表中,将解码的指令发送到主指令管线。

第二方面提供了一种指令控制器,包括:输入端,该输入端用于从调度器接收处于激活状态的调度任务中的指令;指令解码器,该指令解码器被布置成对所接收的指令进行解码;存储器元件,该存储器元件被布置成存储并行处理单元中与主指令管线相关联的调度任务的列表;以及硬件逻辑,该硬件逻辑被布置成检查解码的指令的目标alu是否是主指令管线,并且响应于确定解码的指令的目标alu是主指令管线,检查与主指令管线相关联的列表以确定调度任务是否已经被包括在该列表中,并且响应于确定调度任务已经被包括在该列表中,将解码的指令发送到主指令管线。

第三方面提供了一种集成电路制造系统,包括:计算机可读存储介质,该计算机可读存储介质具有在其上被存储的描述指令控制器的、集成电路的计算机可读描述;布局处理系统,该布局处理系统被配置为处理集成电路的描述,以生成体现指令控制器的、集成电路的电路布局描述;以及集成电路生成系统,该集成电路生成系统被配置为根据电路布局描述来制造指令控制器,其中,该指令控制器包括:输入端,该输入端用于从调度器接收处于激活状态的调度任务中的指令;指令解码器,该指令解码器被布置成对所接收的指令进行解码;以及存储器元件,该存储器元件被布置成存储并行处理单元中与主指令管线相关联的调度任务列表;以及硬件逻辑,该硬件逻辑被布置成检查解码的指令的目标alu是否是主指令管线,并且响应于确定解码的指令的目标alu是主指令管线,检查与主指令管线相关联的列表以确定调度任务是否已经被包括在该列表中,并且响应于确定调度任务已经被包括在该列表中,将解码的指令发送到主指令管线。

另外的方面提供了:一种并行处理系统,该并行处理系统被配置为执行如本文中所描述的方法;一种计算机可读代码,该计算机可读代码被配置为当代码在计算机上运行时执行如本文中所描述的方法的步骤;一种制造方法,该制造方法使用集成电路制造系统制造如本文中所描述的指令控制器;一种计算机可读代码,该计算机可读代码被配置为使如本文中所描述的方法当代码运行时被执行;一种集成电路定义数据集,其当在集成电路制造系统中被处理时,将集成电路制造系统配置为制造如本文中所描述的指令控制器;一种计算机可读存储介质,其上存储有集成电路的计算机可读描述,该集成电路的计算机可读描述当在集成电路制造系统中被处理时,使得集成电路制造系统制造如本文中所描述的指令控制器;以及一种集成电路制造系统,该集成电路制造系统被配置为制造如本文中所描述的指令控制器。

本文描述的指令控制器和/或调度任务调度器可以体现在集成电路上的硬件中。可以提供在集成电路制造系统中制造如本文所述的指令控制器和/或调度任务调度器的方法。可以提供集成电路定义数据集,其在集成电路制造系统中被处理时,将系统配置为制造如本文描述的指令控制器和/或调度任务调度器。可提供一种非暂时性计算机可读存储介质,其上存储有集成电路的计算机可读描述,当该集成电路的计算机可读描述被处理的时候,使得布局处理系统生成在集成电路制造系统中使用的电路布局描述,以制造本文描述的指令控制器和/或调度任务调度器。

可以提供一种集成电路制造系统,其包括:非暂时性计算机可读存储介质,在其上存储有描述如本文所述的指令控制器和/或调度任务调度器的计算机可读集成电路描述;布局处理系统,其被配置为处理集成电路描述,以便生成包括如本文所述的指令控制器和/或调度任务调度器的集成电路的电路布局描述;以及集成电路生成系统,其被配置为根据电路布局描述来制造如本文所述的指令控制器和/或调度任务调度器。

可以提供用于执行本文中所描述的任何方法的计算机程序代码。可提供其上储存有计算机可读指令的非暂时性计算机可读储存介质,该计算机可读指令在计算机系统处被执行时使计算机系统执行本文中所描述的任何方法。

所述方法可以包括:响应于确定调度任务还未被包括在列表中,确定列表是否满;并且响应于确定列表满,触发调度器以通过将调度任务从激活状态改变为等待状态来去激活调度任务;响应于确定调度任务还未被包括在列表中并且列表未满,将调度任务添加到列表中并且将解码的指令发送到主指令管线。所述方法可以包括:响应于确定解码的指令的目标alu不是主指令管线,检查与主指令管线相关联的列表以确定调度任务是否已经被包括在该列表中;以及响应于确定调度任务已经被包括在该列表中,将调度任务从该列表中移除并且将解码的指令发送到解码的指令的目标alu。所述方法可以包括:通过指令控制器监视与主指令管线相关联的列表是否满;以及响应于作为监视的结果而检测到列表已经从满改变为未满,触发调度器以通过将等待主指令管线的最早的调度任务从等待状态中移除来重新激活该最早的调度任务。所述方法可以包括:响应于检测到特定调度任务已经被去激活,检查该特定调度任务是否被包括在与主指令管线相关联的列表中,并且响应于确定该特定调度任务被包括在该列表中,从与主指令管线相关联的列表中移除该特定调度任务。所述方法可以包括:响应于检测到特定调度任务完成,检查该特定调度任务是否被包括在与主指令管线相关联的列表中,并且响应于确定特定调度任务被包括在该列表中,从与主指令管线相关联的列表中移除该特定调度任务。

所述指令控制器可以包括:硬件逻辑,该硬件逻辑被布置成响应于确定调度任务还未被包括在列表中,确定列表是否满;并且响应于确定列表满,触发调度器中的去激活硬件逻辑以通过将调度任务从激活状态改变为等待状态来去激活调度任务;并且响应于确定调度任务还未被包括在列表中并且列表未满,将调度任务添加到列表中并且将解码的指令发送到主指令管线。所述指令控制器可以包括:硬件逻辑,该硬件逻辑被布置成响应于确定解码的指令的目标alu不是主指令管线,检查与主指令管线相关联的列表以确定调度任务是否已经被包括在该列表中;并且响应于确定调度任务已经被包括在该列表中,将调度任务从该列表中移除并且将解码的指令发送到解码的指令的目标alu。所述指令控制器可以包括:硬件逻辑,该硬件逻辑被布置成监视与主指令管线相关联的列表是否满;并且响应于作为监视的结果而检测到列表已经从满改变为未满,触发调度器以通过将等待主指令管线的最早的调度任务从等待状态中移除来重新激活该最早的调度任务。所述指令控制器可以包括:硬件逻辑,该硬件逻辑被布置成响应于检测到特定调度任务已经被去激活,检查该特定调度任务是否被包括在与主指令管线相关联的列表中,并且响应于确定该特定调度任务已经被包括在该列表中,从与主指令管线相关联的列表中移除该特定调度任务。所述指令控制器可以包括:硬件逻辑,该硬件逻辑被布置成响应于检测到特定调度任务完成,检查该特定调度任务是否被包括在与主指令管线相关联的列表中并且响应于确定特定调度任务被包括在该列表中,从与主指令管线相关联的列表中移除该特定调度任务。

如对技术人员将明显的是,以上特征可酌情进行组合,并且可与本文中所描述的示例的任意方面组合。

附图说明

现在将参照附图对示例进行详细描述,在附图中:

图1是示例处理器的示意图;

图2是对处理器中的一组调度任务进行同步的方法的流程图;

图3是另一示例处理器的示意图;

图4是调度处理器中的调度任务的示例方法的流程图;

图5是图4中所示的对调度任务进行调度的示例方法的另一部分的流程图;

图6是另一示例处理器的示意图;

图7是调度处理器中的调度任务的另一示例方法的流程图;

图8是图7中所示的对调度任务进行调度的示例方法的另一部分的流程图;

图9是又一示例处理器的示意图;

图10是调度处理器中的调度任务的又一示例方法的流程图;

图11示出了其中实现了如本文所述的指令控制器和/或调度任务调度器的计算机系统;和

图12示出了用于生成包含本文所述的指令控制器和/或调度任务调度器的集成电路的集成电路制造系统。

附图图示了不同的示例。技术人员将认识到,图中所示出的元素边界(例如,框、框的组或其他形状)表示边界的一个示例。在一些示例中可以是,一个元素可以被设计为多个元素,或者多个元素可被设计为一个元素。在适当情况下,共同的参考数字在整个附图中用于指示类似的特征。

详细描述

以下的描述通过示例的方式来呈现,以使本领域技术人员能够做出和使用本发明。本发明不限于本文中所描述的实施例,并且对所公开的实施例的各种修改对于本领域技术人员将是明显的。

现在将仅通过示例来对实施例进行描述。

本文描述了用于在gpu或(例如用于高性能计算应用的)其他并行处理单元内进行调度的各种方法和装置。特别地,本文描述的方法涉及当所有任务依赖性都被满足并且它们具有运行所需的全部资源时的任务调度。

术语“任务”在本文中用于指代一组数据项以及将对这些数据项执行的工作。例如,除了根据程序要处理的一组数据之外(其中该组数据可以包括一个或更多个数据元素(或数据项,例如多个像素或顶点)),任务还可以包括程序或对程序的引用(例如alu指令的相同序列或对其的引用),或者与程序或对程序的引用相关联。

术语“程序实例”在本文中用于指代采取通过代码的一条路径的各个实例。因此,程序实例涉及单个数据项和对将在数据项上执行的程序的引用(例如指针)。因此任务可以被认为包括多个程序实例(例如多达32个程序实例),但实际上每个任务仅需要公共程序(或引用)的单个实例。共享一个共同目的的任务组共享本地存储器并可以执行相同程序(尽管它们可以执行该程序的不同部分),或不同数据段上的兼容程序可以通过组id来链接。具有相同组id的一组任务可以被称为“工作组”(因此组id可以被称为“工作组id”)。因此存在术语的层次结构,其中任务包括多个程序实例,并且组(工作组)包括多个任务。

本文描述的方法涉及两层调度任务,第一层任务调度在其所有依赖性被满足并且它们具有运行所需的所有资源时被执行,以便形成一组“调度任务”。被调度的任务可以产生多于一个的“调度任务”(例如,在使用多样本抗锯齿msaa的情况下,单个任务可以根据特定msaa速率调度2、4、8或更多个调度任务)。本文的方法还涉及在第二调度层中调度来自当前调度任务集合中的一个或更多个调度任务,以从调度任务中形成一组激活任务,其中激活任务将由并行处理器执行,并且可以是调度任务的适当子集。因此,方法可以被描述为用于对调度任务进行调度的方法,并且方法可以由调度任务调度器(其不同于最初对任务进行调度的任务调度器)来实现。调度任务调度器可以是较大调度器的一部分,该较大调度器包括调度任务调度器和被布置成在它们具有运行所需的全部资源之前调度用于执行的调度任务的任务调度器两者。任务最初由任务调度器调度(并且只由任务调度器调度一次,除非是多阶段任务),并且一旦任务被调度(并且变成调度任务),对应的调度任务可以被调度任务调度器多次调度。特别是,可以有许多调度任务,并且只有这些调度任务的适当子集可以在任何时间处于激活状态(即在处理块中运行和执行)。因此,调度任务可以在任务完成之前由调度任务调度器多次被调度(即激活)和被去调度(de-schedule)(例如,通过置于一个或更多个“等待状态”中,在一个或多个“等待状态”中它们是非激活的)。为了清楚和简洁起见,对(由调度任务调度器进行的)调度任务的调度的引用将被称为“激活”或“重新激活”调度任务(视情况而定),而(由调度任务调度器进行的)调度任务的去调度将被称为“去激活”调度任务。因此,对激活、去激活或重新激活的任何引用可以被认为是对用于执行的调度任务的调度的引用。

当调度任务的任务调度器接收到任务时,调度接收到的任务,并且将其添加到队列(其可以被称为调度任务队列),并且现在准备好由调度任务调度器选择(例如激活)并执行(且因此调度任务被激活)。当调度任务被激活时,来自调度任务的指令将被发送到指令解码器进行解码,并且然后解码的指令被传递给适当的alu用于执行。

调度任务调度器中的每个调度任务具有标识调度任务的当前状态的关联状态数据,其中调度任务可以是激活的(即,在gpu或其他并行处理单元内的处理块上执行)或非激活的(即,不在gpu或其他并行处理单元内的处理块上执行)。虽然可以只有一个可能的激活状态,但在各种示例中,可以存在多个非激活状态。在各种示例中,可以存在至少两个不同的非激活状态:“就绪”状态和一个或更多个“等待”状态。处于就绪状态的调度任务可由调度任务调度器选择用于执行,并且一旦被选择(即激活),调度任务将从就绪状态移动到激活状态。相比之下,处于等待状态的调度任务不能由调度任务调度器选择,且等待状态具有指定调度任务何时可以恢复到就绪状态的相关标准。在存在不同等待状态的示例中,这些可以具有不同的相关标准,并且在下面描述的不同方法中描述了各种示例。等待状态也可以被称为去激活状态,因为通常当调度任务被去激活时(即,由于某种原因,当其从激活状态移除时)并因此停止被处理块执行时,调度任务被置于等待状态。

每个调度任务的状态数据可以与调度任务一起存储在调度任务队列中(例如,其中存在存储在各种不同状态中的调度任务的单个队列,如由每个调度任务的状态数据所标识的)。在其他示例中,可以有多个调度任务队列,每个队列对应于特定状态并且仅包括处于该状态的调度任务(例如,仅包括处于激活状态的那些调度任务的激活队列,以及一个或更多个非激活队列,每个非激活队列都包含处于非激活状态的不同非激活状态中的调度任务)。

调度任务调度器中激活的调度任务的数量是调度任务调度器中调度任务总数的适当子集。在各种示例中,激活调度任务的数量由处理块内的指令解码器的等待时间乘以指令解码器的数量确定的,例如,使得如果指令解码器的等待时间是7个时钟周期并且存在两个指令解码器,则会有14个激活的调度任务。一旦达到激活的调度任务的最大数量,另一个调度任务将不会被激活,直到其中一个当前激活的调度任务被去激活(例如通过置于等待状态或就绪状态)。一旦激活的调度任务的数量低于最大允许数量,调度任务调度器就选择调度任务进行激活,并且在各种示例中,调度任务调度器选择调度任务调度器中的处于就绪状态的最早调度任务进行激活。选择最早的调度任务进行激活是调度任务选择方案(即激活方案)中的一个示例,在其他示例中,可以使用不同的方案。

本文描述的是用于调度(例如激活、去激活和/或重新激活)gpu或其他并行处理单元内的调度任务的各种方法和装置。虽然本文描述的方法被描述为以硬件来实现,但是本文描述的方法中的至少一种方法使得软件能够控制或至少影响激活过程,并且方法可以可选地至少部分地以软件实现(例如,通过用执行实现状态机功能的微代码的可编程定序器代替硬件状态机)。在本文描述的方法中,调度任务调度器基于预定义标准(例如基于年龄(age-based)的标准(如上所述))激活处于就绪状态的调度任务。然后该调度由调度任务调度器或由指令控制器修改,该指令控制器选择性地触发调度任务的去激活,即通过使调度任务调度器将调度任务放回就绪状态或放回等待状态。根据所描述的方法,可以存在调度任务处于其中的多个可能的等待状态,并且可以使用存储在调度任务的队列内的状态数据或者通过将调度任务移动到适当的队列(例如,其中调度任务调度器中的不同队列对应于不同的可能的等待状态),来记录任何调度任务的当前状态。另外,根据所描述的方法,可以基于目标alu(或alu管线(pipeline))的工作负载去激活调度任务,其中工作负载可以根据能够发送指令到目标alu管线的指令数量或调度任务的数量来定义。

本文还描述了用于在gpu或其他并行处理单元内将一组调度任务同步到已知状态的方法和装置。在各种应用(例如opencl)中,同步过程可以被称为工作组屏障,并且因此本文描述的方法和装置可以用于实现工作组屏障。但是,方法和装置不限于opencl,并且也适用于其他计算api(例如,hsa和dx计算)。

用于将一组调度任务同步到已知状态的方法可以由调度任务调度器和gpu或其他并行处理单元内的alu来实现。调度任务调度器使用本文称为休眠状态的等待状态和由alu执行的用于使具有相同组id的调度任务同步的新指令。所描述的方法避免了使用锁(lock)的需要(其中一个锁只允许一个调度任务一次通过由锁保护的代码段进行),(因为使用了单个指令)减少了软件开销,并且速度更快(因为方法主要是在硬件中实现)。

虽然在下面的描述中分开描述了不同的方法,但将理解的是,这些方法可以独立实现,或者本文描述的任何两个或更多个方法可以一起实现。

用于同步gpu或其他并行处理单元内的一组调度任务的方法和装置可以参照图1和图2来描述。

图1是示出可以是gpu或其他并行处理单元的处理器100的示意图。将认识到的是,图1仅示出了处理器的一些元件,并且在处理器内可以存在未在图1中示出的许多其他元件(例如,缓存器、接口等)。处理器100包括调度器102、指令解码器103和处理块104。

处理块104包括用于执行调度任务中的指令的硬件逻辑,该调度任务由调度器102调度用于执行并且已经被指令解码器103解码。因此,处理块104包括许多算术逻辑单元(alu),并且alu可以以任何方式分组。处理块104可包括不同类型的alu,例如,其中每种类型的alu针对特定类型的计算进行优化。在处理器100是gpu的示例中,处理块104可包括多个着色器核,其中每个着色器核包括一个或更多个alu。在各个示例中,处理块104可以是单指令多数据(simd)处理器(其在各个示例中可被称为统一着色器集群(usc))或单指令单数据(sisd)处理器。

调度器102包括第一(或任务)调度器106和第二(或调度任务)调度器108。如上所述,一般任务只被第一调度器106调度一次(除非该任务是多阶段任务);然而,一旦任务被调度(并且例如在msaa的情况下变成调度任务或多个调度任务),对应的调度任务可以被第二(调度任务)调度器108调度多次。具体而言,可以存在许多对应于任务的调度任务,并且这些调度任务的适当子集可以在任何时间都是激活的(即,在处理块104中运行并执行)。因此,在调度任务完成之前,第二调度器108可以将调度任务多次激活(即变为激活的)和去激活(例如,通过置于一个或更多个“等待状态”中,在该一个或更多个“等待状态”中它们是非激活的)。

如图1所示,处理块104包括被称为“原子alu管线”的alu管线112,其被用于同步调度任务组,如以下更详细描述的。原子alu管线112可专用于同步调度任务组的目的,或可另外执行其他原子操作,且在各种示例中,可存在多于一个原子alu管线112。每组调度任务具有本地存储器的分配区域,并且原子alu管线112使用该分配区域来存储其用来执行组内的调度任务的同步的数据。

如图1所示,调度器102接收任务110并且第一调度器106选择性地调度这些任务110用于由处理单元104执行。一旦任务被第一调度器106调度,其所有的依赖关系将被满足并且其具有分配给它的所需资源。然后,与该任务相对应的调度任务被第二调度器108选择性地激活和去激活。

图2是如图1所示的对处理器100(其可以是gpu或其他并行处理单元)中的一组调度任务进行同步的示例方法的流程图。第二调度器108激活调度任务并且发送来自激活的调度任务的指令以由指令解码器103解码,并且然后由处理块104内的alu执行。如图2所示,当第二调度器108发送特定类型的指令(在本文被称为同步指令)用于解码(块202)时,第二调度器108作为响应接收来自指令解码器103的指示以将特定调度任务置于休眠状态,并且因此调度任务被置于休眠状态(块204)。解码的同步指令被发送到原子alu管线112(通过指令解码器103),并且解码的同步指令包括同步指令涉及的调度任务的组标识符(id),或以其他方式标识调度任务所属于的组。在各种示例中,该指令还可以标识其中同步指令已经被接收的特定调度任务(例如借助于调度任务id)。

通过将调度任务置于休眠状态(在块204),调度任务由第二调度器108去激活。在处于休眠状态(其为等待状态的示例)时,调度任务不能被重新激活(例如,根据基于年龄的标准或其他标准)。在各种示例中,第二调度器108可以实现不同类型的等待状态,每个等待状态具有预定义的条件,所述预定义的条件确定何时可以将调度任务从等待状态中移除。为了同步一组调度任务的目的,调度任务被置于被称为休眠状态的等待状态中,并且不能退出该状态(并因此被重新激活),直到从原子alu管线接收到标识调度任务的组id的消息。

响应于从指令解码器103接收到标识特定一组调度任务(例如借助于组id)并且可选地标识组内的特定调度任务(例如借助于调度任务id)的指令,原子alu管线112对存储在分配给特定组的数据存储(即,本地存储器的区域)中的数据执行操作(块206)。

在执行了操作(在块206中)之后,原子alu管线112对分配给特定组的数据存储中存储的数据执行检查(块208),并且该检查可以包括将数据与预定义值进行比较(例如,将计数器的值与可以是1或n的目标值进行比较,其中n是整数)或与多个值进行比较(例如,检查存储器中的所有位是否已被设置,其中每个位对应于组中的一个调度任务)。

在各种示例中,(在块206中)执行的操作可以包括递增或递减计数器。例如,如果在组内有n个调度任务,则计数器可以最初被设置为0,并且然后每当接收到与该特定组相关的指令时,(在块206中)该操作就可以递增该计数器。在这样的示例中,执行的检查可以是将计数器值与目标值n进行比较。可选地,计数器可以最初被设置为n,并且每当接收到与该特定组相关的指令时,(在块206中)该操作可以递减该计数器。在这样的示例中,执行的检查可以是(在块208中)将计数器值与目标值零进行比较。

在其他示例中,(在块206中)执行的操作可以包括设置与调度任务id相对应的位。例如,如果在组内有n个调度任务,则每次接收到与该特定组相关的指令时,操作可以在该组的数据存储中设置一个位。在这样的示例中,(在块208中)执行的检查可以比较存储的数据以查看是否所有的位都已被设置。可选地,操作可以每当接收到涉及该特定组并且包括调度任务id(或者以其他方式标识特定的调度任务)的指令时,将调度任务id存储在该组的数据存储中。在这样的示例中,(在块208中)执行的检查可以比较存储的数据,以查看是否已经存储了所有需要的调度任务id(或者正确数量的调度任务id)。

如果由于所存储的数据与目标值不匹配而(在块208中)检查未通过(在块210中的“否”),则在此阶段原子alu管线112不采取进一步的动作。

然而,如果由于数据确实与目标值匹配而(在块208中)检查通过(在块210中的“是”),则原子alu管线112向第二调度器108发送标识其所涉及的特定组的消息(块212),即,该消息标识所通过的检查所涉及的组。另外,原子alu管线112可以例如通过清除存储的数据或通过将计数器重置为零或n,另外重置存储在分配给该组调度任务的数据存储中的数据(块213)。

响应于从原子alu管线112接收到标识组的消息,第二调度器108从休眠状态中移除所标识的组的所有调度任务(块214)。这意味着这些调度任务现在可以立即被重新调度或在随后的任一点被重新调度(例如使用任何合适的方法和标准)。在各种示例中,当退出休眠状态时,根据由第二调度器108实现的另一激活方法,调度任务将可以被激活。

尽管在上面描述的示例中,在第二调度器108和原子alu管线112之间发送的指令和其他消息(例如借助于组id)标识组,但是在其他示例中,可以存在用于每个组的单独的原子alu管线112,并且因此在第二调度器108和原子alu管线112之间发送的指令和其他消息固有地标识一组调度任务(借助于指令或其他消息的源或目的地),并且因此不需要包括一个组id或其他标识符。

通过使用图2中所示的方法并且如上所述,组中的所有调度任务同时从休眠状态退出(并且因此可用于被重新调度)。这意味着存储在分配给该组调度任务的数据存储中(如由原子alu管线112更新的)的数据不再被需要并且可以被重写(例如,以对于相同组的调度任务执行随后的同步操作)或被重新分配(例如到不同的调度任务组)。此外,由于原子alu管线112对数据执行更新(在块206中),并且响应于单个指令(同步指令)对更新的数据执行检查(在块208中),所以不需要锁。这是因为操作被固有地序列化(即,操作总是按顺序执行的),并且另一个指令不可能在(在块206中的)更新操作和(在块208中)对该数据的检查之间重写数据存储器中的数据。

尽管图2中所示的方法可以用于同步组中的所有调度任务(其中组包括具有相同组id的调度任务的集合),但是在其他示例中,该方法可以可选地(或附加地)用于同步在一个组内的调度任务的合适的子集。例如,可以通过将n的值(其可以是如上所述的初始计数器值或目标计数器值)设置为需要同步的调度任务的数量,来同步调度任务的合适的子集。使用这种技术,通过为每个子集提供其自己的数据存储,任意数量的子集可以与子集之间的发散同步点同步。

通过使用图2所示的方法并且如上所述,调度任务的同步主要在硬件中(通过原子alu管线112和第二调度器108)实现,并且因此(例如,与需要许多指令来实现工作项目的同步的已知方法相比)操作更快并降低软件代码的复杂度。此外,使用单条指令而不是多条指令减少了软件开销。

使用图2所示的方法并且如上所述,单个原子alu管线112可以执行关于多个组的同步。

可以参照图3-5描述用于调度(例如,激活、去激活和/或重新激活)gpu或其他并行处理单元内的调度任务且防止alu管线阻滞(stall)的方法和装置。

图3是示出可以是gpu或其他并行处理单元的处理器300的示意图。将认识到的是,图3仅示出了处理器的一些元件,并且在处理器内可能存在未在图3中示出的许多其他元件(例如,缓存、接口等)。处理器300包括调度器302、指令解码器303(其是指令控制器320的一部分)和处理块304。

调度器302包括对任务调度的第一调度器106和对调度任务进行调度(例如激活、去激活和/或重新激活)的第二调度器308。如上所述,任务通常由第一调度器106只调度一次;然而,一旦任务被调度,对应的调度任务可以被第二调度器108多次调度(例如被激活或重新激活)。具体而言,可以存在许多调度任务,并且这些调度任务的仅适当子集可以在任何时间都被激活(即,在处理块304中运行并执行)。因此,在调度任务的处理完成之前,调度任务可以被激活(即变为激活的)和(例如,通过被置于一个或更多个“等待状态”,在该一个或更多个等待状态中它们是非激活的)被去激活多次。

第二调度器308包括存储调度任务312的一个或更多个调度任务队列310。在各种示例中,第二调度器308包括单个调度任务队列310,并且该队列310还存储每个存储的调度任务312的状态数据314(使得调度任务312的状态数据314可被描述为与调度任务312关联),并且调度任务312的状态数据314标识调度任务312处于的当前状态,例如其是否处于激活状态、就绪状态或等待状态,以及在存在多个等待状态的情况下,其处于当前哪个特定等待状态。调度任务312的状态数据314还可以包括标志数据,其中可以为调度任务设置或者不设置该标志,并且下面描述该标志的操作。可选地,标志数据可以被存储在指令控制器320内。在其他示例中,第二调度器308包括多个队列,每个队列对应于不同的状态并且存储处于特定状态(例如,“就绪”队列、“激活”队列和一个或更多个“等待”队列)的调度任务。这些多个队列还可以包括标志数据,或标志数据(如果提供的话)可以存储在指令控制器320内。

处理块304包括用于执行在由调度器302调度用于执行的任务内的指令的硬件逻辑。因此,处理块304包括多个算术逻辑单元(alu)管线316,并且alu管线可以以任何方式分组。处理块304可包括不同类型的alu管线316,例如,其中每种类型的alu管线被优化用于特定类型的计算。每个alu管线316包括队列318,其存储要由alu管线执行的工作队列(即,将由alu管线316执行的一个或更多个指令)。在处理器300是gpu的示例中,处理块304可包括多个着色器核,其中每个着色器核包括一个或更多个alu管线316。在各个示例中,处理块304可以是单指令多数据(simd)处理器(其在各个示例中可被称为统一着色器集群(usc))或单指令单数据(sisd)处理器。

指令控制器320包括一个或更多个指令解码器303和多个alu工作充满度(fullness)计数器322。

如图3所示,调度器302接收任务110,并且第一调度器106选择性地调度这些任务110用于由处理单元304执行。第二调度器308将调度任务312存储在调度任务队列310中(或者在就绪队列中,在存在多个队列的情况下),并且然后通过第二调度器308进行调度(例如激活、去激活和/或重新激活)。当调度任务312被第二调度器308激活时,其状态从非激活状态(例如就绪状态)变为激活状态,并且其被发送到指令控制器320。当调度任务更改状态时,其状态数据被更新,或者调度任务可以在队列之间移动以指示状态改变。

指令控制器320从第二调度器308接收激活的调度任务,并使用指令解码器303对与激活的调度任务相关联的指令进行解码。指令控制器320然后将经解码的指令发送到目标alu管线316(即,发送到可执行指令的alu管线316)。指令控制器320使用多个alu工作充满度计数器322来跟踪每个alu管线316具有多少工作量,并且下面更详细地描述这些计数器322和指令控制器320的操作。

图4是调度在gpu或其他并行处理单元内的调度任务的示例方法的流程图,其减少(或消除)处理器300(其可以是gpu或其他并行处理单元)中的alu管线阻滞,如图3所示。第二调度器308激活调度任务,并发送来自激活的任务的、要被指令控制器320(由指令解码器303)解码并且然后由处理块304内的alu管线316执行的指令。如在图4中所示,响应于接收到用于解码的指令(块402),指令控制器310解码该指令(块404,在指令解码器303中),然后检查将执行解码的指令的alu管线(被称为目标alu管线)是否已满(块406),其中该检查使用用于目标管线的alu工作充满度计数器322。

如果(通过指令控制器320)确定指令所涉及的调度任务没有标志设置(在块405中为“否”)并且目标alu管线未满(在块406中的“否”),则解码的指令被发送到目标alu管线316(块408),并且用于目标管线的alu工作充满度计数器322被更新(块410),例如用于目标管线的alu工作充满度计数器322被更新(例如递增)。随后描述其中调度任务具有标志设置的操作(在块405中为“是”)。

然而,如果(通过指令控制器320)确定指令所涉及的调度任务没有标志设置(在块405中为“否”)并且目标alu管线是满的(在块406中为“是”),那么指令控制器320触发对调度任务的去激活(块412),并且解码的指令被丢弃(即,它不被发送到目标alu管线)。由第二调度器308(响应于来自指令控制器320的消息)执行去激活,并且去激活包括(例如,如在与调度任务312相关联的状态数据314中所记录的,或通过在不同队列310之间移动调度任务)将调度任务从激活状态切换到等待状态。调度任务被切换到等待状态,该等待状态可被称为特定目标alu管线的“管线满状态”或“等待管线x”状态,其中x对应于特定目标alu管线(例如,在图3所示的例子中的alu管线a-f中的一个)。因此,在实现该方法时,可以有多个等待状态,该多个等待状态可以由多个等待队列(每个等待状态一个队列)或队列310内的状态数据314标识,其中多个等待状态对于处理块304中的多个(例如,每个)alu管线至少包括“等待管线x”状态。在其他示例中,对于任何调度任务正在等待在边带数据中被识别的特定管线,可以有单个“管线满”(或“等待管线”)状态。当指令控制器320去激活调度任务(例如,在块412中)时,该边带数据针对调度任务从指令控制器320被发送到调度器308。

第二调度器308监视与队列310中处于管线满状态中的任何调度任务312相关联的alu工作充满度计数器322(块414-416)。例如,如果队列310包括等待管线a的处于“管线满”状态的一个调度任务和等待管线f的处于“管线满”状态的三个调度任务,则第二调度器308监视用于alu管线a和f的alu工作充满计数器322(在块414-416中)。在各种示例中,指令控制器320将alu工作充满度计数器322的值传送给第二调度器308(例如,指令控制器320可以广播这些值)以使得第二调度器308能够执行监视。

如果第二调度器308(同时在块414-416中监视计数器)标识用于特定alu管线(例如,alu管线x)的alu工作充满度计数器322不再满(在块416中为“是”),则第二调度器308更新正在等待特定管线的调度任务(例如等待alu管线x的调度任务)的状态(块420)。当存在多于一个的正在等待特定管线(例如,alu管线x)的调度任务时,则更新仅一个调度任务的状态(在块420中),并且等待特定管线的处于“管线满”状态的最早的调度任务(例如,等待alu管线x的处于“管线满”状态的最早的调度任务)首先被选择(块418),并且然后更新所选择的调度任务的状态(在块420中)。除了更新用于特定alu管线的调度任务的状态(在块420中),与所选调度任务相关联的标志被设置(在块420中),并且用于特定alu管线的工作充满度计数器322被更新(块410),例如用于特定alu管线的计数器322增加。

通过递增计数器(在块410中)、并设置该标志(在块420中),特定alu管线资源被预分配给所选择的调度任务,并且这使得来自所选择的调度任务的下一个经解码的指令相对于来自以相同alu管线为目标的其他调度任务的经解码的指令具有优先权。返回参考图4的开始,如果(在块402中)接收到指令,并且涉及具有该标志设置的调度任务的指令被解码(在块404中)(在块405中为“是”),则(在块406中的)充满度检查被省略。这是因为用于目标管线的alu工作充满度计数器322已经被更新(在图4的方法的先前执行的块410中),并且解码的指令被发送到目标alu管线(在块408中),而不管目标alu管线的工作充满度计数器的当前值如何。相反,如果指令被解码(在块404中),其以相同的alu管线为目标但涉及不具有其标志设置的调度任务(在块405中为“否”),则充满度检查(在块406中)被执行,并且仅在工作充满度计数器指示目标alu管线未满(在块406中为“否”)时,解码的指令将被发送到目标alu管线。如图4所示,在更新alu工作满度计数器(在块410中)之前,执行对标志的检查(块409),以避免计数器针对相同指令增加两次(即,使得如果标志被设置则计数器不被更新,块411)。

例如,如果alu管线a被确定为不再满(在块416中),并且调度任务0当前处于“管线满”状态并且等待管线a,则调度任务0被选择(在块418中)、被重新调度,并且为调度任务0设置标志(在块420中)。用于管线a的alu工作充满度计数器322被更新(在块410中),而这可以意味着alu管线a再次显示为满。如果针对不同的调度任务(调度任务1)接收到以alu管线a为目标的指令(在块402中),调度任务没有设置其标志,在针对以alu管线a为目标的调度任务0的下一指令之前,(在块410中的)alu工作充满度计数器322的增加将阻止来自调度任务1的指令被发送到alu管线a。因此,防止来自调度任务1的指令导致alu管线a再次充满并防止阻止来自调度任务0的指令的进展。

所选择的调度任务的状态改变(在块420中)可以将调度任务从等待状态(例如,等待管线x状态)切换到就绪状态,使得调度任务然后可以被第二调度器308选择用于执行,或者可选地,调度任务可以从等待状态直接切换到激活状态。

在各种示例中,(在块410中)alu工作充满度计数器322的更新包括递增计数器,并且(在块406中的)充满度检查可以包括确定目标管线的alu工作充满度计数器是否等于(或超过)指示充满度的值。对于所有alu管线,这个指示充满度的值可以是相同的(并且表示为f),或者对于不同的alu管线可以是不同的(并且表示为f(x),其中x指特定的alu管线,使得在图3所示的示例中,存在值f(a)、f(b)、f(c)......f(f))。管线的alu工作充满度计数器不仅仅增加,而且可以递减,如图5所示。当从alu管线队列318移除指令(块502)时,指令控制器320例如通过递减计数器来更新用于特定管线的alu工作充满度计数器(块504)。

当确定alu管线是否不再满(在块416中)时,可以使用相同的值(例如f或f(x)),或者可选地,可以使用不同的值。例如,如果在解码的指令被发送到alu管线时的对alu工作充满度计数器322的更新(在块410中)包括递增计数器,则可以使用不同值f-δ或f(x)-δ来提供迟滞(即,使得,其工作充满度计数器下降,而alu管线不立即显示为非满)。

可选地,在解码的指令被发送到alu管线时的对alu工作充满度计数器322的更新(在块410中)可以包括递减计数器。在这样的示例中,当从alu管线队列中移除指令(在块502中)时,计数器增加。在这样的示例中,(在块406中的)充满度检查可以包括确定目标管线的alu工作充满度计数器是否等于(或小于)指示充满度的值。如上所述,指示充满度的这个值对于所有alu管线可以是相同的(并且表示为f),或者对于不同的alu管线可以是不同的(并且表示为f(x))。当确定alu管线是否不再满时(在块416中),可以使用相同的值(例如f或f(x)),或者可选地,可以使用不同的值f+δ或f(x)+δ来提供迟滞(即,使得,其工作充满度计数器增加,而alu管线不立即显示为非满)。

尽管上面参照alu管线描述了图4的方法,但是该方法还可以应用于非管线化(即,指令在单个时钟周期中执行的情况)的alu。

在各种示例中,指令控制器320可以为每个alu管线316存储多个计数器,其中用于alu管线316的多个计数器包括alu工作充满度计数器(如上所述)和alu去激活的调度任务计数器。在alu去激活调度任务计数器被使用的情况下,alu去激活调度任务计数器提供关于多少个调度任务由于特定的alu管线已满而已经被去激活的计数。如图4所示,每当因为特定的管线被认为是满的(在块406中为“是”)而调度任务被去激活(在块412中)时,特定管线的alu去激活的调度任务计数器被更新(块413),例如递增,并且,每当因为特定管线不再被认为满(在块416中为“是”)而从等待状态移除调度任务(在块420中)时,特定管线的alu去激活的调度任务计数器在相反方向被更新(块422),例如递减。在使用alu去激活的调度任务计数器的情况下,可以修改(在块406中的)用于充满度的测试,使得在与指示充满度的值(f或f(x))相比较之前,将工作充满度计数器的值与去激活的调度任务计数器组合。这有助于更早地(即,在alu工作充满度计数器的较低值时)去激活调度任务,并当alu管线具有容量时(如由其alu工作充满度计数器所指示的)优先处理先前已被去激活的那些调度任务。使用第二计数器,即去激活的调度任务计数器,可以导致硬件运行速度更快并占用更小的区域。

如上面参照图3-5所描述的,使用用于在gpu或其他并行处理单元内对调度任务进行调度的方法和装置可以防止alu管线阻滞。当第二调度器308以比alu管线可执行的速率更快的速率将要执行的调度任务发送到相同alu管线时,alu管线发生阻滞。这导致待由alu管线执行的调度任务的积压,并且会导致调度器302阻滞(这导致gpu或其他并行处理单元的性能下降)。通过使用上述的alu工作充满度计数器并在指令被发送到alu管线时以及在从alu管线中的指令队列中移除指令时,更新计数器,调度任务不能以比它们能够以被alu管线队列318接受的速率更快的速率发送到alu管线。

尽管上面使用两个标志(其可以被称为“管线满标志”)和管线充满度计数器描述了方法,但是在各种示例中,可以独立于管线充满度计数器使用管线满标志。然而,通过使用标志和管线充满度计数器(如图4所示和上面所述),装置的功耗被降低。这是因为如果标志被孤立使用(即,没有管线充满度计数器),一旦管线的标志指示管线不再满,则来自等待特定管线的所有调度任务的指令将被发送到指令控制器320。然而,如果管线没有能力接受所有这些指令,那么所有不能被接纳的调度任务将再次被去激活。然后立即去激活的调度任务的不必要的重新激活会导致不必要的功耗。

可以参照图6-8描述通过优先化调度任务的子集(即,合适的子集)来优化gpu或其他并行处理单元内的调度任务的激活的方法和装置。

图6是示出可以是gpu或其他并行处理单元的处理器600的示意图。将认识到的是,图6仅示出了处理器的一些元件,并且在处理器内可以存在未在图6中示出的许多其他元件(例如,缓存、接口等)。处理器600包括调度器602、指令解码器303(其是指令控制器620的一部分)和处理块604。

调度器602包括对任务调度的第一调度器106和对调度任务进行调度(例如激活、去激活和/或重新激活)的第二调度器608。如上所述,第一调度器106一般只调度一次任务;然而,一旦任务被调度,第二调度器608就可以多次激活对应的调度任务。具体而言,这些调度任务中的仅一个适当的子集可以在任何时间是激活的(即,在处理块604中运行并执行)。因此,调度任务可被激活或去激活(例如,通过将其置于一个或更多个“等待状态”,在该一个或更多个“等待状态”中它们是非激活的)并在任务完成之前重新激活很多次。

第二调度器608包括存储调度任务312的一个或更多个队列310,调度任务312对应于因为其具有所需的资源(例如,寄存器、存储器等)并且它们的依赖性已被满足而已经被第一调度器调度的任务。在各种示例中,第二调度器608包括单个队列310,并且该队列310还存储用于每个存储的调度任务312的状态数据314(使得调度任务312的状态数据314可被描述为与调度任务312关联),并且调度任务312的状态数据314标识调度任务312所处于的当前状态,例如其是于激活状态、还是就绪状态还是等待状态以及在存在多个等待状态的情况下,其当前处于哪个特定等待状态。在其他示例中,第二调度器608包括多个队列,每个队列对应于不同的状态并存储处于特定状态的调度任务(例如,“就绪”队列、“激活”队列以及一个或更多个“等待”队列)。

处理块604包括用于执行被调度器602调度用于执行的调度任务内的指令的硬件逻辑。因此,处理块604包括多个alu管线316,并且alu管线可以以任何方式分组。处理块604可包括不同类型的alu管线316,例如,其中每种类型的alu管线针对特定类型的计算进行优化。在处理器600是gpu的示例中,处理块604可包括多个着色器核,其中每个着色器核包括一个或更多个alu管线316。在各个示例中,处理块604可以是单指令多数据(simd)处理器(其在各个示例中可被称为统一着色器集群(usc))或单指令单数据(sisd)处理器。

在处理块604内的alu管线316中,可以将一个alu管线表示为主指令管线(pip)。这例如可以是最常用的alu管线(例如总体读取和写入最多数据的管线),且因此是最有效运行的alu管线。指令控制器620包括一个或更多个指令解码器303和pip运行列表622。pip运行列表622列出在pip上当前激活的那些调度任务(即,具有当前在pip上执行的指令的那些调度任务),并且pip运行列表622的大小是固定的,即,存在可以被包括在pip运行列表622中的调度任务的最大数量,并且因此存在可以具有在pip上同时执行的指令的调度任务的最大数量。在各种示例中,相同的alu管线可以始终表示为pip,并且在其他示例中,不同的alu管线可以在不同的时间表示为pip。而且,虽然图6示出的是单个pip运行列表622,并且因此alu管线316中仅有一个alu管线被表示为pip,但是在其他示例中,指令控制器620可以包括多个pip运行列表,每个pip运行列表对应于不同的pip(例如,pipa、pipb、......)以及每个pip运行列表的操作如下所述。

如图6所示,调度器602接收任务110,并且第一调度器106选择性地调度这些任务110用于由处理单元604执行以形成调度任务。调度任务312由第二调度器608存储在队列310中,并且然后由第二调度器608调度(例如激活、去激活和/或重新激活)。当调度任务312被第二调度器608激活时,其状态从非激活状态(例如就绪状态)改变为激活状态,并被发送到指令控制器620。

指令控制器620从第二调度器608接收激活的调度任务,并使用指令解码器303解码与激活的调度任务相关联的指令。指令控制器620然后将与激活的调度任务相关联的解码的指令发送到目标alu管线316(即,到可执行该指令的alu管线316)。指令控制器620使用pip运行列表622来控制指令是否可以在pip上执行,并且下面更详细地描述pip运行列表622和指令控制器620的操作。

图7是在gpu或其他并行处理单元内对调度任务进行调度(例如激活、去激活和/或重新激活)的示例方法的流程图,其通过对调度任务的适当子集(即,pip运行列表622中的那些调度任务)进行优先化来优化调度任务的调度(例如激活)。如图6所示,第二调度器608激活调度任务并且发送来自激活的调度任务的指令以由指令控制器620解码,并且然后由处理块604内的alu管线316执行。如图7中所示,响应于接收到用于解码的指令(块402),指令控制器620解码该指令(块404,在指令解码器303中),并且然后检查将执行解码的指令的alu管线(被称为目标alu管线)是否是pip(块706)。

如果(通过指令控制器620)确定目标alu管线不是pip(在块706中为“否”),则解码的指令被发送到目标alu管线316(块408)。然而,如果(通过指令控制器620)确定目标alu管线是pip(在块706中为“是”),则指令调度器620检查pip运行列表622以确定指令所涉及的调度任务是否已经包括在pip运行列表622中(块710)。

如果(通过指令控制器620)确定指令涉及的调度任务已经在pip运行列表622中(在块710中为“是”),则解码的指令被发送到目标alu管线316(块408),即解码的指令被发送到pip。然而,如果(通过指令控制器620)确定指令涉及的调度任务尚未在pip运行列表622中(在块710中为“否”),则执行检查以查看指令涉及的调度任务是否可以被添加到pip运行列表622(块712)。如上所述,存在可以被包括在pip运行列表622中的调度任务的最大数量,并且如果列表未满(在块712中为“否”),即pip运行列表622中的调度任务的最大数目尚未到达,则将解码的指令所涉及的调度任务添加到pip运行列表622(块714),并且然后将解码的指令发送到目标alu管线316(块408),即解码的指令被发送到pip。

然而,如果pip运行列表622已满(在块712中为“是”),即已达到pip运行列表622中的最大调度任务数量,则解码的指令涉及的调度任务不能被添加到pip运行列表622,并且代替地,指令控制器620触发对调度任务的去激活(块716),并且解码的指令被丢弃。响应于来自指令控制器620的触发,由第二调度器608执行去激活,并且去激活包括将调度任务从激活状态切换回等待状态(例如记录在与调度任务312相关联的状态数据314中或通过在队列之间移动调度任务)。调度任务切换到可以被称为“pip等待状态”的等待状态。该等待状态可以被认为与以上参照图3-5描述的“管线满”或“等待管线x”状态相似,其中在这个示例中,x标识pip。然而,导致调度任务被置于该状态的机制存在差异,因为在图4所示的方法中,被监视和限制的是发送到alu管线的指令的数量,而在图7所示的这种方法中,被监视和限制的是可以将指令发送到特定alu的调度任务的数量。

第二调度器608监视pip运行列表622的充满度(块718-720)。在各种示例中,指令控制器620将pip运行列表622中的当前的调度任务数量传送给调度器602(例如,指令控制器620可以广播该数量)以使得第二调度器608能够执行监视。

如果第二调度器608(同时在块718-720中监视pip运行列表中的条目的数量)标识pip运行列表不再满(例如,因为条目数量低于最大数量,在块720中为“是”),则第二调度器608更新等待pip的调度任务的状态(块724),例如,处于pip等待状态的调度任务。在存在多于一个的处于pip等待状态的调度任务的情况下,则仅更新一个调度任务的状态(在块724中),并且首先选择处于pip等待状态的管线中最早的调度任务(块722),并且然后更新所选择的调度任务的状态(在块724中)。

(在块724中的)所选择的调度任务的状态的改变可将调度任务从等待状态(即,pip等待状态)切换到就绪状态,使得调度任务随后可被第二调度器选择用于执行608(例如,使用上述基于年龄的调度方法),或者可选地,调度任务可以从pip等待状态切换到与上面描述的“就绪”状态不同的“等待激活”状态,在被第二调度器608第一次激活之前,调度任务最初被置于该状态。

为了使pip运行列表622从充满变为非充满,必须从pip运行列表622中移除调度任务,并且在调度任务可以被移除时存在许多不同的情况。图8是示出当从pip运行列表622中移除调度任务时的两种不同情况的流程,并且图8的方法可以由指令控制器620和/或第二调度器608来实现。如图8中所示,当由于除了进入pip等待状态之外的原因而使得调度任务被去激活(块802)时,确定调度任务(已被去激活)是否在pip运行列表622中(块806),并且如果调度任务被包括在pip运行列表中(在块806中为“是”),则将其从pip运行列表622中移除(块808)。类似地,如果调度任务完成(块804),则确定(已完成的)调度任务是否在pip运行列表622中(块806),并且如果调度任务包括在pip运行列表中(在块806中为“是”),将其从pip运行列表622中移除(块808)。

在图7中示出了可以从pip运行列表622中移除调度任务的另一情况。如果确定解码的指令不以pip为目标(在块706中为“否”),则可以执行检查以确定该指令所涉及的调度任务是否在pip运行列表622中(块726)。如果调度任务在pip运行列表622中(在块726中为“是”),则将调度任务从pip运行列表622中移除(块728)。不管调度任务是否在pip运行列表中,解码的指令都被发送到目标alu管线(块408),如上所述。

在以上描述中,确定pip列表是否满(在块712中)并且确定pip列表是否未满(在块720中)使用相同的标准,即,pip运行列表622中包括的调度任务的数量是否等于最大值。然而,在各种示例中,当确定pip列表是否未满时(在块720中),可以使用不同的较低数量。这个不同的测试(在块720中,与块712相比较)可以用于提供滞后(即,使得,列表中的调度任务的数量下降,而pip运行列表622不立即显示为非满)。例如,这样的迟滞可以允许调度任务短暂地执行一些其他工作,而在pip运行列表中的位置并不立即被另一个调度任务占用(即,提供调度任务可以能够执行不确定持续时间的指令的时间窗口,并且如果它足够快地完成,则允许它回到pip运行列表中)。

使用如上参照图6-8所述的用于优化gpu或其他并行处理单元内的调度任务的调度的方法和装置,调度任务的适当子集(即,pip运行列表622中的那些调度任务)被优先化。这避免了大量的调度任务执行缓慢的同步进度,从而使它们同时完成,并且反而导致某些调度任务的执行速度比其他任务快。所描述的方法利用来自有限的一组调度任务的指令使得pip尽可能满,提高了效率。使用所描述的方法,可以更有规律地分布高等待时间的存储器请求(例如,在任何点进展的调度任务的数量朝着保持alu繁忙所需的最小数量来减小,并且进展的调度任务的数量越接近最小数量,高等待时间请求变得越均匀分布)。此外,通过减少被重新激活(即,从等待或就绪状态进入活动阶段)而仅仅实际上立即被去激活的调度任务的数量,来减少功耗。

可以参照图9-10描述用于gpu或其他并行处理单元内的调度任务的软件控制调度(例如激活、去激活和/或重新激活)的方法和装置。

图9是示出可以是gpu或其他并行处理单元的处理器900的示意图。将认识到的是,图9仅示出了处理器的一些元件,并且在处理器内可以存在未在图9中示出的许多其他元件(例如,缓存、接口等)。处理器900包括调度器902、指令解码器303(其是指令控制器920的一部分)和处理块904。

调度器902包括对任务调度以形成调度任务的第一调度器106和对调度任务进行调度(例如激活、去激活和/或重新激活)的第二调度器908。如上所述,第一调度器106一般只调度一次任务;然而,一旦任务被调度以形成调度任务,则第二调度器908可以多次调度(例如,激活、去激活和/或重新激活)对应的调度任务。具体地说,可以有许多调度任务,并且只有这些调度任务的适当子集可以在任何时间是激活的(即,在处理块904中运行和执行)。因此,调度任务可以在任务完成之前被多次激活和去激活(例如,通过将其置于一个或多个“等待状态”,在该一个或更多个“等待状态”中它们是非激活的)。第二调度器908包括存储调度任务312(其具有所需资源及其满足的依赖关系)的一个或更多个队列310。在各种示例中,第二调度器908包括单个队列310,并且该队列310还存储用于每个存储的调度任务312的状态数据314(使得调度任务312的状态数据314可被描述为与调度任务312关联),并且调度任务312的状态数据314标识调度任务312处于的当前状态,例如其是处于激活状态、还是就绪状态或还是等待状态以及在存在多个等待状态的情况下,其当前处于哪个特定等待状态。在其他示例中,第二调度器908包括多个队列,每个队列对应于不同的状态并且存储处于特定状态(例如,“就绪”队列、“激活”队列和一个或更多个“等待”队列)的调度任务。

处理块904包括用于执行被调度器902激活用于执行的调度任务内的指令的硬件逻辑。因此,处理块904包括许多个alu管线316,并且alu管线可以以任何方式分组。处理块904可包括不同类型的alu管线316,例如,每种类型的alu管线针对特定类型的计算进行优化。在处理器900是gpu的示例中,处理块904可包括多个着色器核,其中每个着色器核包括一个或更多个alu管线316。在各个示例中,处理块904可以是单指令多数据(simd)处理器(其在各个示例中可被称为统一着色器集群(usc))或单指令单数据(sisd)处理器。

指令控制器920包括一个或更多个指令解码器303。

如图9中所示,调度器902接收任务110,并且第一调度器106选择性地调度这些任务110用于由处理单元904执行。调度任务312由第二调度器908存储在队列310中,并且然后由第二调度器908调度(例如激活、去激活和/或重新激活)。当调度任务312被第二调度器908激活时,其状态从非激活状态(例如,就绪状态)改变为激活状态,并且其被发送到指令控制器920。

指令控制器920从第二调度器908接收激活(即被激活)的调度任务,并使用指令解码器303解码与激活的调度任务相关联的指令。指令控制器920然后将解码的指令发送到目标alu管线316(即,发送到可执行指令的alu管线316)。每条指令都有一个相关联的变换标志(swapflag)(其可以通过软件设置),并且该标志控制与该指令相关的激活调度任务是否被去激活。下面更详细地描述变换标志和指令控制器920的操作。

图10是在实现软件控制调度的调度的gpu或其他并行处理单元内对调度任务进行调度的示例方法的流程图。如图9所示,第二调度器908激活调度任务并且发送来自激活的调度任务的指令以由指令控制器920解码,并且然后由处理块904内的alu管线316执行。如图10所示,响应于接收到用于解码的指令(块402),指令控制器920解码该指令(块404,在指令解码器303中),并且然后检查解码的指令中的变换标志是否被设置(块1006)。

如果(由指令控制器920)确定变换标志没有被设置(在块1006中为“否”),则解码的指令被发送到目标alu管线316(块408)。然而,如果(通过指令控制器920)确定解码的指令中的变换标志被设置(在块1006中为“是”),则指令控制器920触发调度任务的去激活(块1010)并且解码的指令被丢弃。由第二调度器908(例如,响应于从指令控制器920接收到的消息)执行去激活,并且包括将调度任务从激活状态切换回就绪状态(例如,如记录在与调度任务312关联的状态数据314中或通过将调度任务从激活队列移动到就绪队列中)。

一旦调度任务被去激活并且处于就绪状态,其可以由第二调度器908再次激活(例如,使用上述的基于年龄的调度方法)。在被去激活时,调度任务进入基于年龄的队列310的后面(即,去激活的调度任务成为队列310中的最新调度任务)。

如参照图9和图10所描述的对变换标志的使用使软件(其指定变换标志是否被设置用于指令)能够控制对调度任务的激活。例如,这可以实现对在图6-8中所示的以及以上描述的那样的用于通过将调度任务的子集(即,合适的子集)优先化来优化gpu或其他并行处理单元内的调度任务的调度的可选方法。例如,这可以通过(在一组pip指令之后)不是以pip为目标的第一指令上设置变换标志来设置变换标志的软件来实现。这具有如下效果:在以pip为目标的最后一条指令之后,调度任务被去激活并且进入队列310的后面。在各种示例中,通过使用变换标志,当在以其他方式以pip为目标的指令序列中的单个指令不以pip为目标时,可以防止从pip运行列表622中去除调度任务。例如,在针对以下alu管线为目标的(针对调度任务的)一系列指令pip,pip,pip,pip,非pip,pip......中,并且其中非pip指令(即,不以pip为目标的指令)是没有花很长时间在alu管线上执行的简单指令,不是pip,可以不为该指令设置变换标志。这具有如下效果:调度任务不被去激活,并且可以立即恢复为在pip上执行指令。

除了任何其他调度方法之外,使用变换标志还提供了另外的灵活性,并允许一些软件控制指令的调度。这还可以减少所需硬件的区域(例如,通过省略如上参考图6-8所述的硬件,而仍然提供相同的功能)。此外,通过减少被重新激活(即,从等待或就绪状态进入活动阶段)而仅仅实际上立即被去激活的调度任务的数量,上面参考图10描述的方法也可以降低装置的整体功耗。

虽然图2、4和5、7以及8和10中所示的方法是分开描述的,但是可以组合使用任何两种或更多种方法(例如上面参考图2、4、5、7和8描述的方法可以被一起实施并且没有上面参考图10描述的方法),并且如上所述,可以使用图10中的方法来实现参照图7和图8描述的方法。

图11示出了其中可以实现本文描述的指令控制器和/或第二调度器方法的计算机系统。计算机系统包括cpu1102、gpu1104、存储器1106和诸如显示器1116、扬声器1118和摄像机1120的其他设备1114。示出了在gpu1104内实现的调度器1110、指令控制器/解码器1111和处理块1112(对应于图1、3、6和9中的任一个中示出的调度器、指令控制器/解码器和处理块)。在其他示例中,调度器1110、指令控制器/解码器1111和处理块1112可以在cpu1102内实现。计算机系统的部件可以经由通信总线1122彼此通信。

图1、图3、图6和图9中的处理器被示为包括多个功能块。这仅仅是示意性的,且并不旨在限定这些实体的不同逻辑元件之间的严格划分。能够以任何合适的方式提供每个功能块。应当理解,在本文描述为由处理器内的任何元件形成的中间值不需要在任何点处由特定元件物理地生成,并且可以仅表示方便地描述由处理器在其输入端和输出端之间执行的处理的逻辑值。

可以在集成电路上的硬件中实施本文描述的指令控制器和/或调度任务调度器。本文中所描述的指令控制器和/或调度任务调度器可被配置为执行本文中所描述的方法中的任一个方法。通常,以上所描述的功能、方法、技术或部件中的任一个都能够以软件、固件、硬件(例如,固定逻辑电路)或其任何组合来实现。本文可以使用术语“模块”、“功能”、“部件”、“元件”、“单元”、“块”和“逻辑”,以通常表示软件、固件、硬件或其任何组合。在软件实现的情况下,模块、功能、部件、元件、单元、块或逻辑表示程序代码,该程序代码当在处理器上执行时执行指定任务。本文中所描述的算法和方法可由执行代码的一个或更多个处理器执行,该代码使处理器执行该算法/方法。计算机可读储存介质的示例包括随机存取存储器(ram)、只读存储器(rom)、光盘、闪存、硬盘存储器、以及可使用磁性、光学和其他技术来储存指令或其他数据的以及可由机器访问的其他存储器设备。

如本文中所使用的术语计算机程序代码和计算机可读指令是指用于处理器的任何种类的可执行代码,包括以机器语言、解释语言或脚本语言表达的代码。可执行代码包括二进制代码、机器代码、字节码、定义集成电路的代码(诸如,硬件描述语言或网表)、以及以诸如c、java或opencl的编程语言代码表达的代码。可执行代码可以是例如任何类型的软件、固件、脚本、模块或库,当其在虚拟机或其他软件环境下被适当地执行、处理、解释、编译、执行时,使支持可执行代码的计算机系统的处理器执行由代码指定的任务。

处理器、计算机或计算机系统可以是具有处理能力使得其可执行指令的任何种类的设备、机器或专用电路,或其集合或其部分。处理器可以是任何种类的通用或专用处理器,诸如cpu、gpu、片上系统、状态机、媒体处理器、专用集成电路(asic)、可编程逻辑阵列、现场可编程门阵列(fpga)等。计算机或计算机系统可以包括一个或更多个处理器。

还旨在包含对如本文中所描述的硬件的配置进行限定的软件,诸如hdl(硬件描述语言)软件,如用于设计集成电路或用于配置可编程芯片所使用的,以执行期望功能。也就是说,可提供计算机可读储存介质,其上编码有以集成电路定义数据集的形式的计算机可读程序代码,当集成电路定义数据集在集成电路制造系统中进行处理(即,运行)时,配置系统以制造被配置为执行本文中所描述的任何方法的指令控制器和/或调度任务调度器,或制造包括本文中所描述的任何装置的处理器。集成电路定义数据集可以例如是集成电路描述。

因此,可以提供一种在集成电路制造系统中制造如本文所述的指令控制器和/或调度任务调度器或包括如本文所述的指令控制器和/或调度任务调度器的处理器的方法。此外,可以提供集成电路定义数据集,当集成电路定义数据集在集成电路制造系统中被处理时,导致制造如本文所述的指令控制器和/或调度任务调度器或包括如本文所述的指令控制器和/或调度任务调度器的处理器的方法被执行。

集成电路定义数据集可以是计算机代码的形式,例如,作为用于配置可编程芯片的网表、代码,作为限定任何等级的集成电路的硬件描述语言,包括作为寄存器传送级(rtl)代码,作为诸如verilog或vhdl的高等级电路表示,以及作为诸如oasis(rtm)和gdsii的低等级电路表示。在逻辑上限定集成电路(诸如rtl)的较高等级的表示可在计算机系统处被处理,该计算机系统被配置成在软件环境的背景下生成集成电路的制造定义,包括电路元件和用于将这些元件组合在一起的规则的定义,以便生成由表示如此定义的集成电路的制造定义。如软件在计算机系统处执行以便限定机器的通常情况,可以需要一个或更多个中间用户步骤(例如,提供命令、变量等),以便被配置为生成集成电路的制造定义的计算机系统执行对集成电路进行定义的代码,从而生成该集成电路的制造定义。

现在将参考图12描述在集成电路制造系统中对集成电路定义数据集进行处理以便使系统配置为制造如本文所述的指令控制器和/或调度任务调度器或包括如本文所述的指令控制器和/或调度任务调度器的处理器的示例。

图12示出了经配置以制造如本文中所描述的指令控制器和/或调度任务调度器或包括如本文任一示例中所描述的指令控制器和/或调度任务调度器的处理器的集成电路(ic)制造系统1202的示例。具体地,ic制造系统1202包括布局处理系统1204和集成电路生成系统1206。ic制造系统1202被配置成接收ic定义数据集(例如,定义如在本文的任何示例中所述的指令控制器和/或调度任务调度器),处理ic定义数据集,并根据ic定义数据集来生成ic(例如,其包含如在本文的任何示例中所述的指令控制器和/或调度任务调度器)。ic定义数据集的处理配置ic制造系统1202以制造包含如在本文的任何示例中所述的指令控制器和/或调度任务调度器的集成电路。

布局处理系统1204被配置为接收ic定义数据集并对其进行处理以确定电路布局。根据ic定义数据集确定电路布局的方法在本领域中是已知的,且例如可涉及合成rtl代码以确定例如在逻辑部件(例如,nand、nor、and、or、mux和flip-flop部件)方面待生成的电路的门级表示。可通过确定逻辑部件的位置信息,根据电路的门级表示来确定电路布局。这可自动地或借助用户干预来完成,以便优化电路布局。当布局处理系统1204确定电路布局时,它可将电路布局定义输出到ic生成系统1206。电路布局定义可以是例如电路布局描述。

ic生成系统1206根据电路布局定义生成ic,如在本领域中已知的。例如,ic生成系统1006可实现半导体器件制造过程以生成ic,这可以涉及光刻和化学处理步骤的多步骤序列,在该多步骤序列期间,电子电路通常在由半导体材料制成的晶圆上被创建。电路布局定义可以是掩模的形式,该掩模可以在光刻过程中用于根据电路定义生成ic。可选地,被提供到ic生成系统1206的电路布局定义可以是计算机可读代码的形式,ic生成系统1006可使用该计算机可读代码来形成适当的掩模以在生成ic时使用。

由ic制造系统1202执行的不同过程可以都在一个位置上例如由一个部件实现。可选地,ic制造系统1202可以是分布式系统,使得过程中的一些可在不同的位置处被执行,并可由不同的主体执行。例如,以下步骤中的一些可以在不同位置和/或由不同方实施:(i)合成表示ic定义数据集的rtl代码,以便形成要生成的电路的门级表示;(ii)基于门级表示,生成电路布局;(iii)根据电路布局,形成掩膜;以及(iv)使用掩膜制造集成电路。

在其它示例中,在集成电路制造系统中对集成电路定义数据集的处理可将系统配置为制造如本文所述的指令控制器和/或调度任务调度器,而不对ic定义数据集进行处理,以便确定电路布局。例如,集成电路定义数据集可以定义可重配处理器(例如fpga)的配置,且该数据集的处理可将ic制造系统配置为生成具有所定义的配置的可重配处理器(如,通过将配置数据加载到fpga)。

在一些实施例中,集成电路制造定义数据集在集成电路制造系统中被处理时,可使集成电路制造系统生成如本文中所描述的设备。例如,集成电路制造系统以如上参照图12所描述的方式通过集成电路制造定义数据集的配置可使如本文中所描述的设备得以制造。

在一些示例中,集成电路定义数据集可包括软件,该软件在数据集中定义的硬件上运行或与在数据集处定义的硬件组合运行。在图12中所示的示例中,ic生成系统还可由集成电路定义数据集配置,以在制造集成电路时,根据在集成电路定义数据集中定义的程序代码将固件加载到该集成电路上,或以其他方式向集成电路提供程序代码用于与集成电路一起使用。

本领域中的技术人员将认识到,用于存储程序指令的存储设备可分布在网络中。例如,远程计算机可存储被描述为软件的过程的示例。本地或终端计算机可访问远程计算机并下载软件的一部分或全部以运行程序。可选地,本地计算机可按需下载软件的片段或在本地终端处执行一些软件指令并在远程计算机(或计算机网络)处执行一些软件指令。本领域中的技术人员也将认识到,通过利用本领域中的技术人员已知的常规技术,软件指令的全部或一部分可由专用电路(例如dsp、可编程逻辑阵列等)实现。

本文所述的方法可以由配置有软件的计算机执行,软件是以存储在有形存储介质上的机器可读形式,例如以包括用于配置计算机来执行所述方法的组成部分的计算机可读程序代码的计算机程序的形式,或以包括适合于当程序在计算机上运行时执行本文所述的任何方法的所有步骤的计算机程序代码装置的计算机程序的形式,且其中计算机程序可以包括在计算机可读存储介质上。有形(或非暂时性)存储介质的示例包括磁盘、拇指驱动器、存储卡等,且并不包括传播的信号。软件可适合于在并行处理器或串行处理器上执行,使得方法步骤可以按任何适当的顺序或同时被执行。

本文所述的硬件部件可由具有在其上编码的计算机可读程序代码的非暂时性计算机可读存储介质生成。

存储在实现所公开的方面时使用的机器可执行数据的存储器可以是非暂时性介质。非暂时性介质可以是易失性的或非易失性的。易失性非暂时性介质的示例包括基于半导体的存储器,例如sram或dram。可用于实现非易失性存储器的技术的示例包括光学和磁性存储器技术、闪存、相变存储器、电阻式ram。

对“逻辑”的特定提及指的是执行一种功能或多种功能的结构。逻辑的示例包括布置成执行那些功能的电路。例如,这样的电路可包括晶体管和/或在制造过程中可用的其它硬件元件。作为示例,这样的晶体管和/或其它元件可用于形成实现和/或包含存储器(例如寄存器、触发器或锁存器)、逻辑运算器(例如布尔运算)、数学运算器(例如加法器、乘法器或移位器)和互连的电路或结构。这样的元件可作为定制电路或标准单元库、宏或以其它抽象级被提供。可在特定的布置中将这样的元件互连。逻辑可包括固定功能的电路,且电路可被编程以执行一种功能或多种功能;这样的编程可从固件或软件更新或控制机构提供。被识别为执行一种功能的逻辑也可包括实现组成性功能或子过程的逻辑。在示例中,硬件逻辑具有实现固定函数运算或多个运算、状态机或过程的电路。

如对技术人员将明显的是,本文给出的任何范围或设备值可以被扩展或改变而不失去所寻求的效果。

将理解,上面描述的益处和优点可涉及一个实施例或可涉及多个实施例。实施例不限于解决任何或所有所陈述的问题的那些实施例或具有任何或全部所陈述的益处和优点的那些实施例。

对“一(a/an)”项目的任何提及指的是那些项目中的一个或更多个。术语“包括”在本文中用于意指包括所识别的方法块或元件,但这样的块或元件并不包括独有列表,且装置可包含额外的块或元件,并且方法可包含额外的操作或元件。此外,块、元件和操作本身并不是隐含地封闭的。

本文描述的方法的步骤可以按照任何适当的顺序被执行或在适当时同时被执行。在附图中的框之间的箭头示出方法步骤的一个示例顺序,但并不意欲排除其它顺序或多个步骤的并行执行。此外,单独的块可从任何方法删除而不偏离本文描述的主题的精神和范围。上面描述的任何示例的方面可以与所描述的其它示例中的任一个的方面组合以形成另外的示例,而不失去所寻求的效果。在附图的元件被示为由箭头连接的情况下,将认识到,这些箭头示出在元件之间的通信(包括数据和控制消息)的仅一个示例流。在元件之间的流可以在任一方向上或在两个方向上。

申请人特此独立地公开了本文中所描述的每个单独特征以及两个或更多个这样的特征的任何组合,公开的程度是使得这样的特征或组合能够基于本说明书依据本领域技术人员的公知常识作为整体来实现,而无论这样的特征或特征的组合是否解决了本文中所公开的任何问题。鉴于上述描述,对于本领域技术人员明显的是,可在本发明的范围内进行各种修改。

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