内存分配的制作方法

文档序号:21929054发布日期:2020-08-21 14:52阅读:204来源:国知局
内存分配的制作方法



背景技术:

在处理系统中,在创建任务时,内存的一部分被分配给所述任务。接着,地址生成单元将任务内引用的寄存器映射到所分配的内存部分内的实际内存地址。可以向两个任务分配相同内存内的内存地址。当同时对内存进行多路访问请求时,可能会发生冲突。例如,两个任务可以分别向内存请求一个值,或者单个任务可以向内存请求两个值。这会导致一个访问必须停止,直到另一访问完成为止。

为了增加读取/写入吞吐量(通过减少停止的出现),内存可以布置成多个单独的组,并且在任一循环中,可以从每一个组读取数据。通过这种方式,处理系统可以同时访问相同内存内的不同组(例如,从内存的组0中的行0读取寄存器值,并从内存的组1中的行2读取寄存器值),但是每当试图同时访问相同组时,会发生冲突,且其中一个访问必须停止。这影响了处理系统的性能。

下文描述的实施例仅作为举例提供,并且不限制解决已知的内存分配方法的任一个或全部缺点的实施方案。



技术实现要素:

提供此发明内容是为了以简化形式介绍下文在具体实施方式中进一步描述的一系列概念。本发明内容部分并不旨在标识所要求保护的主题的关键特征或基本特征,也不旨在用于限制所要求保护的主题的范围。

描述了内存分配方法。第一示例方法将相同任务的实例群组所引用(例如,使用)的寄存器映射到单独的逻辑内存。本文中所描述的其它示例方法包含将任务所引用(例如,使用)的寄存器映射到单个逻辑内存内的不同组,并且在各种示例中,这个映射可以考虑到哪个组可能成为特定任务的主组以及一个或多个其它任务的分配。

第一方面提供一种处理系统中的内存分配方法,所述处理系统包括内存,所述内存包括b个内存组,其中b是整数,并且所述方法包括:将组计数值分配给任务;以及将所述任务所引用的寄存器映射到所述内存中的内存组,其中所述映射是基于b和所分配的组计数值。

在创建任务时,可以将组计数值分配给任务。

将组计数值分配给任务可包括将组计数器的当前值分配给任务,并且方法可另外包括:调整组计数值以供分配给下一任务。组计数器的值可以通过递增组计数器来调整。组计数器可以一介于0和b-1之间的固定或可变数量递增。

所述方法可另外包括:标识与所述任务相关联的主组,并且其中将组计数值分配给所述任务包括:基于所述任务的所述主组和存储的主组掩码,将组计数值分配给所述任务;以及基于分配,更新所述主组掩码。可以基于与所述任务相关联的元数据来标识主组。主组掩码可包括b个位,一个位对应于b个内存组中的一个,并且基于分配更新所述主组掩码包括:响应于将任务的主组分配给所述内存组中的一个,将所述主组掩码中对应于所述内存组中的所述一个的位从第一值更新为第二值。基于分配更新所述主组掩码可另外包括:响应于确定所述主组掩码中的所有b个位都设置为第二值,将所述主组掩码中的所有位重置为第一值。

将所述任务所引用的寄存器映射到所述内存中的内存组可包括:根据下式将所述任务所引用的寄存器映射到所述内存中的内存组:(组编号)=((寄存器编号)+(所分配的组计数值))modb,其中组编号是内存组的标识符,且寄存器编号是寄存器的标识符。

将所述任务所引用的寄存器映射到所述内存中的内存组可包括:基于所述任务的基指针、根据所述寄存器编号确定的寄存器偏移和根据所分配的组计数值确定的组偏移,计算寄存器的内存地址。

将所述任务所引用的寄存器映射到所述内存中的内存组可包括:基于所分配的组计数值,更新所述任务的基指针;以及基于所述任务的更新后的基指针和根据所述寄存器编号确定的寄存器偏移,计算寄存器的内存地址。

将组计数值分配给所述任务可包括将所述组计数器的当前值分配给所述任务,并且所述方法另外包括:标识与所述任务相关联的主组;以及调整所述组计数值以供分配给下一任务,并且其中将所述任务所引用的寄存器映射到所述内存中的内存组包括:基于b、所分配的组计数值和所述任务的主组,将所述任务所引用的寄存器映射到所述内存中的内存组。调整组计数值可包括递增组计数值。

基于b、所分配的组计数值和所述任务的主组将所述任务所引用的寄存器映射到所述内存中的内存组可包括:根据下式基于b、所分配的组计数值和所述任务的主组将所述任务所引用的寄存器映射到所述内存中的内存组:(组编号)=((寄存器编号)+(组差))modb,和(组差)=(所分配的组计数值)-(主组编号),其中组编号是内存组的标识符,主组编号是所述任务的主组的标识符,且寄存器编号是寄存器的标识符。

基于b、所分配的组计数值和所述任务的主组将所述任务所引用的寄存器映射到所述内存中的内存组可包括:基于所述任务的基指针、根据所述寄存器编号确定的寄存器偏移以及根据所分配的组计数值和所述任务的所述主组确定的组差偏移,计算寄存器的内存地址。

基于b、所分配的组计数值和所述任务的所述主组将所述任务所引用的寄存器映射到所述内存中的内存组可包括:基于所分配的组计数值和所述任务的所述主组,更新所述任务的基指针;以及基于所述任务的更新后的基指针和根据所述寄存器编号确定的寄存器偏移,计算寄存器的内存地址。

可以基于与所述任务相关联的元数据来标识主组。

第二方面提供一种处理系统,包括:内存,其包括b个内存组,其中b一种整数;组计数器;任务创建模块,其配置成将组计数值分配给任务;以及地址生成单元,其配置成将所述任务所引用的寄存器映射到所述内存中的内存组,其中所述映射是基于b和所分配的组计数值。

处理系统可包括单个逻辑内存,所述单个逻辑内存包括b个内存组。

第三方面提供一种配置成执行上文所描述的方法中的任一个的处理系统。

本文中所描述的处理系统可以体现在集成电路上的硬件中。可提供一种在集成电路制造系统处制造如本文中所描述的处理系统的方法。可提供一种集成电路定义数据集,所述集成电路定义数据集在集成电路制造系统中处理时将所述系统配置成制造如本文中所描述的处理系统。可提供一种非暂时性计算机可读存储介质,所述非暂时性计算机可读存储介质上存储有集成电路的计算机可读描述,所述计算机可读描述在处理时使布局处理系统生成在集成电路制造系统中用于制造如本文中所描述的处理系统的电路布局描述。

可提供一种集成电路制造系统,其包括:非暂时性计算机可读存储介质,其上存储有描述如本文中所描述的处理系统的计算机可读集成电路描述;布局处理系统,其配置成处理所述集成电路描述以便生成体现如本文中所描述的处理系统的集成电路的电路布局描述;以及集成电路生成系统,其配置成根据所述电路布局描述制造如本文中所描述的处理系统。

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

所属领域的技术人员将清楚,上述特征可在适当时组合,并且可与本文所描述的示例的任一方面组合。

附图说明

现在将参考附图更详细地描述示例,附图中:

图1是内存分配的第一示例方法的流程图;

图2是处理系统的示意图;

图3是内存分配的第二示例方法的流程图;

图4是说明图3的方法的示意图;

图5是内存分配的第三示例方法的流程图;

图6是说明图5的方法的示意图;

图7是内存分配的第四示例方法的流程图;

图8是说明图7的方法的示意图;

图9示出其中可以实施本文所描述的方法的计算机系统;以及

图10示出用于生成体现如本文中所描述的处理系统的集成电路的集成电路制造系统。

附图说明各个示例。所属领域的技术人员应了解,图中所示元件边界(例如,方框、方框群组,或其它形状)表示边界的一个示例。在一些示例中,可将一个元件设计为多个元件,也可以将多个元件设计为一个元件。适当时,贯穿各图使用共同附图标号来指示类似特征。

具体实施方式

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

现将仅通过举例来描述实施例。

如上文所描述,处理系统(例如,包括cpu或gpu和内存的系统)可在内存内包括多个组。所执行的指令(例如,读取或写入指令)通常并不指代任何具体的组,而是仅指代寄存器编号,例如,读取r0,其中r0是指寄存器0。在已知的处理系统中,地址生成单元基于所定义的公式(或关系式)将寄存器编号映射到内存内的组,所述公式例如:

(组编号)=(寄存器编号)mod(组的数目)(方程式1)

并且每个组内的地址解码逻辑基于寄存器编号(它可被视为偏移,其中例如偏移=(寄存器编号)除以(组的数目))和基指针将寄存器编号映射到指定组内的实际内存位置(或内存地址)(如上述公式所给定)。

如上文所描述,如果同时进行访问内存的相同组(例如,因为通过使用上述公式,指示的是相同组)的多个尝试,那么会发生冲突,并且多路访问尝试中除一个以外其余所有都停止。除了在单个内存内提供多个组来减少冲突数目之外,还可以提供多个内存,每个内存具有多个组,或者,内存内的组可以通过提供对应数目个端口而划分成两个或更多个逻辑上独立的内存(例如,八个逻辑内存),每个端口提供对组的单独且不重叠的子集的访问(例如,一个端口用于组0-3,另一端口用于组4-7)。这增加了可在没有冲突的情况下进行的同时访问的数目。

出于以下描述的目的,逻辑内存是指具有专用访问端口的内存区域,而逻辑内存内的组与该逻辑内存内的其它组共享访问端口。如上文所描述,在任一循环中,可以通过访问端口从逻辑内存中的每一个组读取数据,并且访问端口具有足以支持这一操作的宽度。

本文中描述了用于内存分配的各种方法和设备。第一方法涉及寄存器到内存的映射,其中如上文所描述,内存可以是具有专用端口的单独物理或逻辑内存。通过将寄存器映射(或分配)到内存使得访问(例如,从内存读取或写入到内存)在那些内存之间更均匀地分散开(或者使得访问有可能更均匀地分散开),发生冲突的概率降低,并且因此还减小了冲突对性能的影响。本文中所描述的额外方法涉及寄存器到内存内(或多个在物理或逻辑上单独的内存内)的组的映射。将寄存器映射(或分配)到组的这些方法可与将寄存器映射(或分配)到内存的方法组合使用,或者可以独立于本文中所描述的第一方法使用。通过将寄存器映射(或分配)到组使得访问在内存内的各个组之间更均匀地分散开(或者使得访问有可能更均匀地分散开),发生冲突的概率降低,并且因此还减小了冲突对性能的影响。系统可以设计成平衡性能(使用多个组和/或内存及本文所描述的方法)与提供额外组和/或内存(例如,在硬件的大小方面)的任何成本。

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

术语‘程序实例’在本文中用于指代路径经过代码的各个实例。因此,程序实例是指单个数据项以及将对所述数据项执行的程序的引用(例如,指针)。因此,任务可视作包括多个程序实例(例如多达32个程序实例),但在实践中,每任务仅需要公用程序(或引用)的单个实例。因此,存在术语层次,其中任务包括多个程序实例。

程序通常对存储在寄存器中的值执行操作,并且每个程序实例需要自己的每个寄存器值的副本。每个程序可以使用(或引用)多个寄存器,并且多个任务可以在处理系统上并行运行,因此本文所描述的方法可用于提供一种灵活分配相对大量的寄存器的方式。

可以参考图1描述内存分配的第一方法。此方法涉及将寄存器映射(或分配)到内存,而不是内存内的各个组,其中,如上文所描述,内存可以是具有专用端口的单独物理或逻辑内存。

在创建任务(框102)时,任务可包括多个实例,例如,相同指令可以应用于多个单独的数据项,并且指令和不同数据项的每个组合包括单独实例。例如,可以在16个、32个或64个数据点(例如,16、32或64个像素、样本、原语、顶点等)上执行单个指令,因此任务具有16、32或64个实例。接着,将任务的这些实例打包(或分组)成群组,在每一群组可以容纳四个实例的示例中,群组可以称为四元组(quads)(框104)。四元组的使用可特别适合于像素处理活动,因为处理是在2×2片段上操作的;然而在其它示例中,每群组可存在不同数目个实例,并且在各种示例中,内存的一个组中的一行寄存器的数目可以对应于每个群组中的实例的数目。在各种示例中,每任务可存在8个群组(或四元组);但是群组的数目可以多得多(并且因此,实例的数目可以多得多),例如,每任务32个群组和/或每任务128个实例。依据特定任务的实例的数目,最终群组可以被完全填充,也可以只被部分填充,如果不同任务包括不同数目个实例,那么不同任务可以填充不同数目个群组。另外,一些其它群组也可以被部分地填充,例如,其中存在某些控制实例被打包成群组的方式的准则。

在将任务的所有实例都打包成群组(在框104中)后,将群组中的每个程序实例所引用(例如,使用或需要)的寄存器映射到逻辑内存(框106),例如,将群组中的每个实例的程序所引用的寄存器映射到单独内存或映射到具有专用端口的内存内的组的单独群组。在各种示例中,(在框106中)将相同任务的每个实例群组所引用的寄存器映射到不同逻辑内存;但是在许多实例中,相同任务中的实例群组比逻辑内存多得多,使得来自相同任务的多个实例群组的寄存器被映射到相同逻辑内存。在各种示例中,基于所使用的执行管线,可存在限制,使得由特定执行管线处理的任务的实例只能将它们的寄存器映射到逻辑内存的预定义子集,且针对不同执行管线,可存在不同预定义子集。群组的寄存器到逻辑内存的映射(在框106中)是基于预定义分配方案和计数器的值,该计数器可以称为群组计数器。

预定义分配方案(如在框106中所使用的)可以使用内存的预定义序列(例如,memory0、memory1、memory2……)将群组所引用的寄存器映射(或分配)到内存,并且分配可以开始于所述序列中基于计数值而确定的位置。在此方案中,如果计数值是零,那么从预定义序列的起点开始,将群组所引用的寄存器映射到内存(例如,group0的寄存器映射到memory0,group1的寄存器映射到memory1,等等),如果计数值非零,那么从预定义序列中的偏移位置开始,将群组的寄存器映射到内存,其中偏移等于计数值(或以其它方式从计数值推导出)。例如,如果计数值是一,那么映射从预定义序列中的第二个内存开始(例如,group0的寄存器映射到memory1,group1的寄存器映射到memory2,等等)。如果计数值非零,那么内存的预定义序列可以被视为环绕的,使得如果存在n个内存,表示为memory0到memory(n-1),那么在将群组的寄存器映射到memory(n-1)之后,下一群组的寄存器映射到memory0。

如图1所示,对于(在框102中)创建的每个任务,调整计数器(框108),并且此调整操作(在框108中)可以在寄存器映射到内存(在框106中)之后进行,如图1所示,或者在图1的方法中的任何其它阶段中进行(例如,在框102之后或在框104之后进行)。调整(在框108中)获取前一任务的计数值,并例如通过递增该计数值来对它进行更新。在一个示例中,针对(在框102中)创建的每个任务,使计数器递增一(在框108中),在另一示例中,计数器以(在框104中)针对特定任务形成的群组的数目g递增(在框108中),其中g是整数,且g≥1。使用后一种技术,在内存用数值标记的情况下,如果任务中最后一个群组的寄存器被映射到内存a(其中a是整数),那么由下一任务的实例形成的第一个群组的寄存器可以映射到内存(a+1)。在其它示例中,计数器可以按照其它量调整(例如,递增)(在框108中),例如,以介于0和n之间的随机数量调整,其中n是逻辑内存的数目。在各种示例中,计数器的值可以基于内存的数目而封顶,例如,以n-1封顶,其中n是内存的数目,然后可以绕回到值0。

通过改变将群组所使用(即,引用)的寄存器映射到内存的方式使得所有任务的映射不同(即使基础预定义分配方案保持相同也如此,这是为了降低复杂性),内存访问的分布更均匀地在不同逻辑内存上分散开,这减小了冲突概率,并且因此还减小了冲突对性能的影响。具体地说,如果不使用这种方法,那么每个任务的第一个群组的寄存器将始终映射到第一个内存,在所有任务都将包括至少一个实例群组(并且此群组可能始终被实例完全填充)的条件下,第一群组的寄存器所映射到的这个内存很可能具有所有内存中的最多访问次数,因此更容易发生冲突。如上文所描述,通过基于计数值进行偏移,内存的压力会更加均匀地分散开,使得对内存的访问能够更加一致,冲突更少,并且因此停止也会更少。

图1内的不同操作可由处理系统的不同部分执行,并且在图2中示出了示例处理系统200。处理系统200包括处理器202(例如,cpu或gpu)和多个逻辑内存204。在各种示例中,处理系统200中逻辑内存204的数目可以等于每任务群组的最大数目,从而使得每个任务内群组和内存之间具有一对一关系(并且因此,那些群组的寄存器和内存之间具有一对一关系)。由任务创建模块206创建任务(在框102中),并且由调度器208创建实例,然后将其打包(或分组)成群组(在框104中)。接着,由执行模块(或管线)210执行实例。群组计数器214的更新(在框108中)可由任务创建模块206或调度器208执行,并且基于预定义分配方案和群组计数器214的值进行的群组所引用的寄存器到逻辑内存的映射(在框106中)可由地址生成单元212实施。

可以参考图3描述内存分配的第二方法。此方法涉及将寄存器映射(或分配)到单个逻辑内存内的组,而不是分配给不同逻辑内存,并且此第二方法(如图3中所示)可与上文所描述的第一方法(如图1中所示)组合使用或独立于所述第一方法使用。如上文所提到,单独的逻辑内存具有单独的访问端口,而逻辑内存内的各个组共享同一个访问端口。

在创建任务(框102)时,将组计数值分配给任务(框304),所分配的这个组计数值可以是计数器的当前值,所述计数器可以称为‘组计数器’且不同于图1中提到的计数器(其为图2中的群组计数器214)。接着,使用所分配的组计数值(来自框304)将任务所引用的寄存器映射到单个逻辑内存内的组。所述映射是基于逻辑内存中的组的数目和所分配的组计数值(框308)。在各种示例中,映射(在框308中)可以使用为上文的方程式(1)的修改版的公式,给出如下:

(组编号)=((寄存器编号)+(所分配的组计数值))mod(组的数目)(方程式2)

在这个方程式中,在进行模运算之前对寄存器编号和所分配的组计数值求和,结果是寄存器映射到的组编号;但是,相同结果可以用不同方式实现。在其它示例中,所分配的组计数值可供地址生成单元用于确定额外偏移(组偏移),所述额外偏移是在基于任务的基指针和寄存器编号(指定作为寄存器偏移)确定寄存器的实际内存地址时应用的:

(内存地址)=(任务的基指针)+(寄存器偏移)+(组偏移)(方程式3)

在创建任务时,基于先前创建的任务的内存要求,确定任务的基指针。在其它实例中,所分配的组计数值可供任务创建模块用于更新任务的基指针,然后,更新后的基指针供地址生成单元在基于任务的基指针和寄存器编号确定寄存器的实际内存地址时使用:

(内存地址)=(任务的更新后的基指针)+(寄存器偏移)(方程式4)

不管使用的是等式(2)至(4)中的哪一个;都可以实现相同的寄存器到组的映射。

映射方案(如在框308中所使用的)以一种使得不同任务的register0未必总是处于相同组(bank0)中的方式将寄存器映射到组,如果使用的是方程式(1),那么不同任务的register0未必总是处于相同组(bank0)中。这样可以使内存访问的分布更加一致地在组之间分散开,从而减小冲突概率,并且因此还减小了冲突对性能的影响(即,停止对性能的影响)。

如图3所示,对于(在框102中)创建的每个任务,调整组计数器(来自前一任务)(框306),并且这可以在将组计数值分配给最新创建的任务(在框304中)之后进行,如图3所示,或者在图3的方法中的任何其它阶段中进行。在一个示例中,针对(在框102中)创建的每个任务,使组计数器递增一(在框306中),在另一示例中,计数器以其它数量递增(在框306中),例如,以介于0和b-1之间的固定或可变数量递增,其中b是组的数目。在各种示例中,组计数器的值可以基于组的数目封顶,例如,以b-1封顶,其中b是组的数目,然后可以绕回到值0;但是在执行模运算(在方程式2中)时,组计数值实际上以b-1封顶。

图4是示出在组计数器针对每个任务递增一的示例中针对两个不同的任务(task1和task2)进行的寄存器和组之间的映射的示例的示意图。在此示例中,通过使用等式(2)至(4)中的任一个,这两个任务的register0(r0)被分配给不同组,即用于task1的bank0和用于task2的bank1。

通过改变寄存器映射到组的方式使得所有任务的映射不同,内存访问的分布往往会更均匀地在逻辑内存内的不同组上分散开,这减小了冲突的概率,并且因此还减小了冲突对性能的影响。具体地说,如果不使用这种方法,那么每个任务的第一个寄存器(register0)将始终映射到第一个组,这可能会导致这第一个组具有所有组中的最多访问次数,因此更容易发生冲突。如上文所描述,通过基于计数值进行偏移,组的压力会更加均匀地分散开,使得对组的访问能够更加一致,冲突更少,并且停止也会更少。

如上文所提到,图3内的不同操作可由图2中示出的处理系统200的不同部分执行。如上文所描述,由任务创建模块206创建任务(在框102中),并且任务创建模块206另外将组计数值分配给任务(在框304中)并更新组计数器216(在框306中)。寄存器到组205的映射由地址生成单元212执行(在框308中);然而,如上文所描述,作为映射的部分,地址生成单元212可以使用所分配的组计数值自身(其中组计数值由任务创建模块206传送到地址生成单元212),或者地址生成单元212可以从任务创建模块206接收任务的更新后的基指针,其中更新后的基指针已经基于所分配的组计数值计算出。如图2所示,每个组205可包括地址解码逻辑207,地址解码逻辑207布置成基于地址生成单元212所确定的特定寄存器的地址而标识组内该寄存器所映射到的行。因为每个组205具有它自己地址解码逻辑207,所以可以同时从每个组的不同行读取数据。

可以参考图5描述内存分配的第三方法。与第二方法类似,此方法涉及将寄存器映射(或分配)到单个逻辑内存内的组,而不是将寄存器映射到不同内存,并且这可与上文所描述的第一方法(如图1中所示)组合使用或独立于所述第一方法使用。不同于第二方法,第三方法涉及确定特定任务的‘主组’,其中由于不同任务引用不同程序,所以它们具有不同的主组,但是使用相同程序的任务将具有相同的主组。术语‘主组’在本文中用于指代当执行任务时在统计学上最可能接收到最多访问次数的组。然而,并不确保标识出具有最多访问次数的组,因为在各种示例中,确定主组可能并没有考虑到一个或多个运行时间因素,例如环路的执行次数,但是依据复杂性,在确定任务的主组时,可以包含一些运行时间因素(例如,一些环路的执行)。对任何程序(以及因此使用所述程序的任何任务)的主组的确定可以在编译时间由编译器(例如,当编译所述程序时)做出,例如,使用上文的方程式(1),并且主组信息可以传送到处理系统(例如,以与所述程序相关联的元数据形式传送)。因此,任何程序的主组是固定的,且相对于程序定义(不管可以使用下文描述的映射方案来应用的偏移如何)。

如图5所示,在创建任务(框102)时或在一个单独的时间,接收任务的元数据(例如,供任务使用的程序的元数据),并且此元数据用于标识与任务相关联的主组(框503)。如在第二方法中,将组计数值分配给任务(框304),并且所分配的这个组计数值可以是组计数器216(如上文所提到,其不同于图1中提到的群组计数器214)的当前值。接着,基于逻辑内存中组的数目、所分配的组计数值和主组,使用所分配的组计数值(来自框304)将供任务使用的寄存器映射到组(框508)。在各种示例中,映射(在框508中)可以使用为上文的方程式(2)的修改版的公式,给出如下:

(组编号)=((寄存器编号)+(组差))mod(组的数目)(方程式5)

其中

(组差)=(所分配的组计数值)-(主组)(方程式6)

在其它示例中,组差可供地址生成单元用于确定额外偏移(组差偏移),所述额外偏移是在基于任务的基指针和寄存器编号(指定作为寄存器偏移)确定寄存器的实际内存地址时应用的:

(内存地址)=(任务的基指针)+(寄存器偏移)+(组差偏移)(方程式7)

或者,组差可供任务创建模块用于更新任务的基指针,然后,更新后的基指针供地址生成单元在基于任务的基指针和寄存器编号确定寄存器的实际内存地址时使用:

(内存地址)=(任务的更新后的基指针)+(寄存器偏移)(方程式8)

映射方案(如在框508中所使用的)将寄存器映射到组,映射方式为使得尽管不同任务的主组可能会冲突,但是预期为被最频繁访问的组在应用所有偏移之后不会发生冲突。这样可以使内存访问的分布更加一致地在组之间分散开,从而减小冲突概率,并且因此还减小了冲突对性能的影响(即,停止对性能的影响)。

如图5所示,对于(在框102中)创建的每个任务,递增组计数器(框306),并且这可以在将组计数值分配给最新创建的任务(在框304中)之后进行,如图5所示,或者在图5的方法中的任何其它阶段中进行。在一个示例中,针对(在框102中)创建的每个任务,使组计数器递增一(在框306中),在另一示例中,计数器以其它数量递增(在框306中),例如,以介于0和b-1之间的固定或可变数量递增,其中b是组的数目。在各种示例中,组计数器的值可以基于组的数目封顶,例如,以b-1封顶,其中b是组的数目,然后可以绕回到值0;但是在执行模运算(在公式5中)时,组计数值实际上以b-1封顶。

图6是示出在组计数器递增一的示例中针对不同任务(任务1到4)进行的寄存器和组之间的映射的示例的示意图。在此示例中,通过使用等式(5)至(8)中的任一个,主组以一种循环方式分配(即,主组针对每个任务前进一个位置,如由组0至3上方的竖直箭头所指示)。针对task1(t1),所分配的组计数值(bc)是一,并且主组(db)是零,因此r0旋转组差(即,使用方程式(5)和(6),它旋转一,到达bank1),这意味着在应用所有偏移之后,预期为被最频繁访问的组是bank1。针对task2(t2),所分配的组计数值(bc)是二,并且主组(db)是一,因此r0旋转组差(即,旋转一,到达bank1),这意味着在应用所有偏移之后,预期为被最频繁访问的组是bank2。针对task3(t3),所分配的组计数值(bc)是三,并且主组(db)是三,因此(因为组差是零)r0不旋转(即,它在bank0中),这意味着在应用所有偏移之后,预期为被最频繁访问的组是bank3。针对使用八个寄存器的task4(t4),所分配的组计数值(bc)是零(例如,其中因为存在四个内存组,所以先前组计数值三已经使用模4算术递增一),并且主组(db)是三(例如,因为最频繁引用的寄存器已经确定为r7,它在bank3中),因此r0和r4旋转1(即,到达bank1),因为-3mod4=1,这意味着在应用所有偏移之后,预期为被最频繁访问的组是bank0。

通过改变寄存器映射到组的方式使得所有任务的映射不同且在应用所有偏移之后预期为被最频繁访问的组是间隔开的,内存访问的分布更均匀地在逻辑内存内的不同组上分散开,这减小了冲突概率,并且因此还减小了冲突对性能的影响。

如上文所提到,图5内的不同操作可由图2中示出的处理系统200的不同部分执行。如上文所描述,由任务创建模块206创建任务(在框102中),并且任务创建模块206另外基于编译器所提供的元数据而标识主组(在框503中),将组计数值分配给任务(在框304中)并更新组计数器216(在框306中)。寄存器到组205的映射由地址生成单元212执行(在框508中);然而,如上文所描述,作为映射的部分,地址生成单元212可以使用组差自身(其中组差由任务创建模块206传送到地址生成单元212),或者地址生成单元212可以从任务创建模块206接收任务的更新后的基指针,其中更新后的基指针已经基于组差计算出。

在图5的方法的变化形式中,主组掩码可以由任务创建模块206维持,并且组计数器只能在最新创建的任务的主组与在应用所有偏移之后先前任务的预期为被最频繁访问的组发生冲突的情况下递增(在框306中),如使用所述主组掩码所确定的。这可以参考图7和8加以描述。

如图7中所示,在创建任务(框102)时或者在一个单独的时间,接收任务的元数据,并且此元数据用于标识任务的主组(框503)。如在图5的方法中,将组计数值分配给任务(框704);然而,所分配的这个组计数值是基于主组掩码而不是计数器的当前值确定的(在图5的方法中,它是基于计数器的当前值确定的)。主组掩码可包括每组一个位,并且所有位可以在一开始设置为默认值(例如,零),以指示尚未有任务的主组被分配给所述组,然后在任务的主组已经被分配给所述组之后,就可以设置为另一值(例如,一)。因为任务通常比组多,所以一旦主组掩码中的所有位都被设置为第二值(例如,一),整个掩码就可以重置(例如,重置为零),接着方法可以继续进行。为了确定组计数值(在框704中),将任务的主组与主组掩码进行比较。如果任务的主组在应用所有偏移之后与预期为被先前任务最频繁访问的组冲突,所述被最频繁访问的组可以是先前任务的主组或偏移主组(例如,如基于对应于最新创建的任务的主组的组是否已经使它的位集合指示主组掩码中的先前分配所确定的),那么将组计数值设置为使任务的主组偏移以免发生冲突的值,并更新主组掩码(框706)以反映偏移主组分配。然而,如果主组在应用所有偏移之后不与预期为被先前任务最频繁访问的组冲突(例如,如基于对应于最新创建的任务的主组的组是否已经使它的位集合指示主组掩码中的先前分配所确定的),那么将组计数值设置为零,并更新主组掩码(框706)以反映新(非偏移)的主组分配。这在图8的示例中示出,其中任务1(db=0)和任务2(db=3)之间不存在冲突,如由主组掩码1000指示,因此那些任务的组计数值设置为零(bc=0),且主组掩码更新为1001。但是,任务3的主组组零(db=0)216和先前分配的主组之间存在冲突,如由主组掩码1001指示,因此组计数值设置为非零值(例如,一),以便偏移在施加所有偏移之后预期为被任务最频繁访问的组(例如,从bank0偏移到bank1),同时避免发生冲突。接着,更新主组掩码以反映新分配,例如,从1001更新为1101。

在分配组计数值(在框704中)之后,基于逻辑内存中组的数目和所分配的组计数值将寄存器映射到组(框308)。在各种示例中,映射(在框308中)可以使用与(上文所描述的)第二方法相同的方程式,即:

(组编号)=((寄存器编号)+(所分配的组计数值))mod(组的数目)(方程式2)

(内存地址)=(任务的基指针)+(寄存器偏移)+(组偏移)(方程式3)

(内存地址)=(任务的更新后的基指针)+(寄存器偏移)(方程式4)

如上文所提到,图7内的不同操作可由图2中示出的处理系统200的不同部分执行。如上文所描述,由任务创建模块206创建任务(在框102中),并且任务创建模块206另外维持主组掩码(如在框704中所使用和更新的),将组计数值分配给任务(在框304中)并更新组计数器216(在框306中)。寄存器到组205的映射由地址生成单元212执行(在框308中);然而,如上文所描述,作为映射的部分,地址生成单元212可以使用所分配的组计数值自身(其中组计数值由任务创建模块206传送到地址生成单元212),或者地址生成单元212可以从任务创建模块206接收任务的更新后的基指针,其中更新后的基指针已经基于所分配的组计数值计算出。

如上文所详述,图1的方法可以独立于或组合图3、5或7的方法使用。尽管所有方法都是参考图2的处理系统200描述的,但是应了解,取决于所使用的方法,群组计数器214和组计数器216中的任一个或两个可以省略,即,群组计数器214供图1的方法使用,且组计数器供图3、5和7的方法使用。还应了解,图3、5和7的方法只需要一个包括多个组205的内存204(但系统200内可存在多个内存204),且图1的方法需要多个逻辑上单独的内存204,这些内存可以包括也可以不包括多个组205。

图9示出其中可实施本文所描述的图形处理系统的计算机系统。计算机系统包括cpu902、gpu904、内存906和其它装置914,例如显示器916、扬声器918和相机920。cpu902和/或gpu904可以用作如图2所示和上文所描述的处理系统202,且内存906可包括多个逻辑内存204和/或多个内存组205。计算机系统的部件可通过通信总线922彼此通信。

图2和9的系统示出为包括数个功能块。这仅是示意性的,并非旨在限定此类实体的不同逻辑元件之间的严格划分。可按任何合适的方式提供每个功能块。应理解,本文中描述为由处理系统形成的中间值不需要由处理系统在任何时间点物理地生成,并且可以只表示方便描述由处理系统在其输入与输出之间执行的处理的逻辑值。

本文中所描述的处理系统可体现在集成电路上的硬件中。本文中所描述的处理系统可配置成执行本文所描述的任一种方法。通常,上文所描述的任何功能、方法、技术或部件可用软件、固件、硬件(例如,固定逻辑电路系统)或其任何组合来实施。本文可使用术语“模块”、“功能”、“部件”、“元件”、“单元”、“块”和“逻辑”来笼统地表示软件、固件、硬件或其任何组合。在软件实施方案的情况下,模块、功能、部件、元件、单元、块或逻辑表示在处理器上执行时执行指定任务的程序代码。本文中描述的算法和方法可由执行代码的一个或多个处理器执行,所述代码使处理器执行算法/方法。计算机可读存储介质的示例包含随机存取存储器(ram)、只读存储器(rom)、光盘、快闪存储器、硬盘存储器以及可使用磁性、光学和其它技术来存储指令或其它数据并且可由机器访问的其它存储器装置。

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

处理器、计算机或计算机系统可以是任何种类的装置、机器或专用电路,或其集合或一部分,并且具有使其可以执行指令的处理能力。处理器可以是任何种类的通用或专用处理器,例如cpu、gpu、片上系统、状态机、媒体处理器、专用集成电路(asic)、可编程逻辑阵列、现场可编程门阵列(fpga)、物理处理单元(ppu)、无线电处理单元(rpu)、数字信号处理器(dsp)、通用处理器(例如通用gpu)、微处理器、设计成加速cpu外部的任务的任何处理单元,等。计算机或计算机系统可包括一个或多个处理器。所属领域的技术人员将认识到,此类处理能力并入于许多不同装置中,因此术语‘计算机’包含机顶盒、媒体播放器、数字无线电装置、pc、服务器、移动电话、个人数字助理和许多其它装置。

本发明还旨在涵盖限定本文中描述的硬件配置的软件,例如硬件描述语言(hdl)软件,其用于设计集成电路或用于配置可编程芯片以执行期望的功能。即,可提供一种计算机可读存储介质,其上编码有呈集成电路定义数据集形式的计算机可读程序代码,所述集成电路定义数据集在集成电路制造系统中处理(即,运行)时将所述系统配置成制造被配置成执行本文所描述的任何方法的处理器,或制造包括本文所描述的任何设备的处理系统。集成电路定义数据集可以是例如集成电路描述。

因此,可提供一种在集成电路制造系统处制造如本文所描述的处理器的方法。此外,可提供一种集成电路定义数据集,其在集成电路制造系统中处理时使制造处理器的方法得以执行。

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

现将相对于图10描述在集成电路制造系统处处理集成电路定义数据集以将系统配置成制造处理器的示例。

图10示出配置成制造如本文中任一示例中所描述的处理器的集成电路(ic)制造系统1002的示例。具体地说,ic制造系统1002包括布局处理系统1004和集成电路生成系统1006。ic制造系统1002配置成接收ic定义数据集(例如,定义如本文的任一示例中所描述的处理器),处理ic定义数据集,并且根据ic定义数据集生成ic(例如,其体现如本文的任一示例中所描述的处理器)。ic定义数据集的处理将ic制造系统1002配置成制造体现如本文的任一示例中所描述的处理器的集成电路。

布局处理系统1004配置成接收和处理ic定义数据集以确定电路布局。根据ic定义数据集确定电路布局的方法在所属领域中已知,并且例如可能涉及合成rtl代码以确定要生成的电路的门级表示,例如在逻辑部件(例如,nand、nor、and、or、mux和flip-flop部件)方面。通过确定逻辑部件的位置信息,可根据电路的门级表示来确定电路布局。这可自动地或在用户参与下完成,以优化电路布局。当布局处理系统1004已经确定电路布局时,它可将电路布局定义输出到ic生成系统1006。电路布局定义可以是例如电路布局描述。

如所属领域中已知,ic生成系统1006根据电路布局定义生成ic。例如,ic生成系统1006可实施生成ic的半导体装置制造工艺,其可涉及光刻和化学处理步骤的多步骤序列,在此期间,在由半导体材料制成的晶片上逐渐形成电子电路。电路布局定义可呈掩模的形式,其可在光刻工艺中用于根据电路定义来生成ic。或者,提供给ic生成系统1006的电路布局定义可呈计算机可读代码的形式,ic生成系统1006可使用该计算机可读代码来形成用于生成ic的合适掩模。

由ic制造系统1002执行的不同过程可全部在一个位置处实施,例如由一方实施。或者,ic制造系统1002可以是分布式系统,使得一些过程可在不同位置执行,并且可由不同方来执行。例如,可在不同位置和/或由不同方执行以下阶段中的一些:(i)合成表示ic定义数据集的rtl代码,以形成要生成的电路的门级表示,(ii)基于门级表示来生成电路布局,(iii)根据电路布局来形成掩模,以及(iv)使用掩模来制造集成电路。

在其它示例中,在集成电路制造系统处对集成电路定义数据集进行处理可将系统配置成制造处理器,而无需对ic定义数据集进行处理来确定电路布局。例如,集成电路定义数据集可定义可重新配置的处理器(例如,fpga)的配置,并且对该数据集进行的处理可将ic制造系统配置成生成具有所述定义的配置的可重新配置的处理器(例如,通过将配置数据加载到fpga)。

在一些实施例中,集成电路制造定义数据集在集成电路制造系统中处理时可使集成电路制造系统生成如本文所描述的装置。例如,通过集成电路制造定义数据集以上文相对于图10所描述的方式对集成电路制造系统进行配置可制造出如本文所描述的装置。

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

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

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

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

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

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

与已知的实施方案相比,本申请中阐述的概念在装置、设备、模块和/或系统中(以及在本文实施的方法中)的实施可引起性能改进。性能改进可包含计算性能提高、时延减小、处理量增大和/或功耗降低中的一种或多种。在此类装置、设备、模块和系统(例如在集成电路中)的制造期间,可在性能改进与物理实施方案之间进行权衡,由此改进制造方法。例如,可在性能改进与布局面积之间进行权衡,由此匹配已知实施方案的性能,但使用的硅更少。例如,这可通过以串行方式重复使用功能块或在装置、设备、模块和/或系统的元件之间共享功能块来完成。相反,可权衡在本申请中阐述的引起装置、设备、模块和系统的物理实施方案的改进(例如硅面积减小)的概念以改进性能。例如,这可通过在预定义面积预算内制造一个模块的多个实例来完成。

所属领域的技术人员将清楚,本文给出的任何范围或装置值可在不失去所追求的效果的情况下进行扩展或更改。

应理解,上文所描述的益处和优势可涉及一个实施例,也可涉及若干实施例。实施例不局限于解决任一或所有所陈述问题的那些实施例或具有任一或所有所陈述益处和优势的那些实施例。

对‘一个’项目的任何提及是指一个或多个那些项目。本文中使用术语‘包括’来表示包含所标识的方法块或要素,但此类块或要素并不包括独占式列表,并且设备可含有额外块或要素,且方法可含有额外操作或要素。此外,所述块、要素和操作自身并非暗指是封闭式的。

本文所描述的方法的步骤可按任何适合的次序执行,或在适当时同时执行。图中方框之间的箭头示出方法步骤的一个示例顺序,但并非旨在排除其它顺序或多个步骤的并行执行。另外,在不脱离本文描述的主题的精神和范围的情况下,可从任何方法中删除个别框。在不失去所追求效果的情况下,上文所描述的任一示例的各方面可与所描述的任一其它示例的各方面组合以形成其它示例。在图中元件示出为由箭头连接的情况下,应了解,这些箭头仅示出元件之间的一个示例通信流(包含数据和控制消息)。元件之间的流可在任一方向上或在两个方向上。

申请人由此独立地公开本文描述的每个单独特征以及两个或更多个此类特征的任何组合,其程度使得此类特征或组合能够鉴于所属领域的技术人员的公共常识基于本说明书整体来执行,而不管此类特征或特征的组合是否解决本文公开的任何问题。鉴于前文描述,对所属领域的技术人员来说显而易见的是,可在本发明的范围内进行各种修改。

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