支持嵌套循环的恒定时间程序控制的芯片的制作方法

文档序号:29795881发布日期:2022-04-23 18:49阅读:57来源:国知局
支持嵌套循环的恒定时间程序控制的芯片的制作方法
支持嵌套循环的恒定时间程序控制的芯片
1.关于联邦资助研究或开发的声明
2.本公开是在政府支持下,根据美国空军、科研办公室授予的合同fa8750-18-c-0015号而完成的。政府对本公开具有一定权利。
技术领域
3.本公开的实施例涉及神经网络处理,并且更具体地,涉及嵌套循环的恒定时间程序控制。


技术实现要素:

4.根据本公开的实施例,提供了用于计算神经激活的芯片。在各种实施例中,芯片包括至少一个算术逻辑计算单元和操作地耦合到至少一个算术逻辑计算单元的控制器。控制器根据程序配置来配置,程序配置包括至少一个内循环和至少一个外循环。控制器被配置为使至少一个算术计算单元根据程序配置执行多个操作。控制器被配置为维护至少第一循环计数器及第二循环计数器,第一循环计数器被配置为对所述至少一个外循环的所执行迭代的数目进行计数,且第二循环计数器被配置为对至少一个内循环的所执行迭代的数目进行计数。控制器被配置为提供第一循环计数器是否对应于最后迭代的第一指示及第二循环计数器是否对应于最后迭代的第二指示。控制器被配置为根据第一指示和第二指示交替地递增、复位或维护第一循环计数器和第二循环计数器中的每一者。
5.根据本公开的实施例,提供了用于嵌套循环的恒定时间程序控制的方法和计算机程序产品。在各种实施例中,根据程序配置来配置控制器,程序配置包括至少一个内循环和至少一个外循环。使至少一个算术计算单元根据程序配置执行多个操作。控制器维护至少第一循环计数器及第二循环计数器,第一循环计数器被配置为对至少一个外循环的所执行迭代的数目进行计数,且第二循环计数器被配置为对至少一个内循环的所执行迭代的数目进行计数。控制器提供第一循环计数器是否对应于最后一次迭代的第一指示和第二循环计数器是否对应于最后一次迭代的第二指示。根据第一和第二指示交替地递增、复位或维护第二循环计数器。
附图说明
6.图1示出了根据本公开的实施例的神经核心。
7.图2示出了根据本公开的实施例的示例性推理处理单元(ipu)。
8.图3示出了根据本公开的实施例的多核推理处理单元(ipu)。
9.图4示出了根据本公开的实施例的神经核心和相关联的网络。
10.图5示出了根据本公开的实施例的示例性循环和嵌套循环。
11.图6示出了根据本公开的实施例的另一示例性循环。
12.图7示出了根据本公开的实施例的示例性嵌套循环。
13.图8示出了根据本公开的实施例的示例性循环测试条件。
14.图9示出了根据本公开的实施例的示例性cpu循环指令。
15.图10示出了根据本公开的实施例的示例性cpu循环指令。
16.图11示出根据本公开的实施例的示例性静态循环展开技术。
17.图12示出了根据本公开的实施例的示例性循环合并技术。
18.图13示出了根据本公开的实施例的示例性循环计数器。
19.图14示出了根据本公开的实施例的示例性并行循环计数器。
20.图15a-b示出了根据本公开实施例的另一示例性并行循环计数器。
21.图16示出了根据本公开的实施例的示例性循环跟踪。
22.图17示出了根据本公开的实施例的另一示例性多循环计数器。
23.图18a-b示出了根据本公开实施例的示例性并行循环嵌套计数器。
24.图19a-b示出了根据本公开的实施例的示例性程序计数器和循环计数器。
25.图20a-b示出了根据本公开实施例的示例性循环计数器定义。
26.图21a-b示出了根据本公开的实施例的没有程序计数器的示例性并行循环。
27.图22示出了根据本公开的实施例的并行loo与cpu循环的示例性比较。
28.图23示出了根据本公开的实施例的示例性循环重新配置。
29.图24示出了根据本公开的实施例的用于嵌套循环的恒定时间程序控制的方法。
30.图25示出了根据本公开的实施例的计算节点。
具体实施方式
31.人工神经元是其输出是其输入的线性组合的非线性函数的数学函数。如果一个神经元的输出是另一个神经元的输入,则两个神经元被连接。权重是对一个神经元的输出与另一个神经元的输入之间的连接的强度进行编码的标量值。
32.神经元通过将非线性激活函数应用于其输入的权重和来计算其输出,称为激活。权重和是通过将每个输入乘以相应的权重并累加乘积而计算的中间结果。部分和是输入子集的权重和。所有输入的权重和可以通过累加一个或多个部分和而分阶段计算。
33.神经网络是一个或多个神经元的集合。神经网络通常被分成称为层的神经元组。层是一个或多个神经元的集合,所述神经元全部从相同层接收输入并且全部向相同层发送输出,并且通常执行类似的功能。输入层是从神经网络外部的源接收输入的层。输出层是向神经网络外部的目标发送输出的层。所有其它层是中间处理层。多层神经网络是具有多于一层的神经网络。深度神经网络是具有多个层的多层神经网络。
34.张量是数值的多维阵列。张量块是张量中的元素的连续子阵列。
35.每个神经网络层与参数张量v、权重张量w、输入数据张量x、输出数据张量y和中间数据张量z相关。参数张量包含控制层中的神经元激活函数σ的所有参数。权重张量包含将输入连接到层的所有权重。输入数据张量包含该层作为输入消耗的所有数据。输出数据张量包含该层计算为输出的所有数据。中间数据张量包含层作为中间计算产生的任何数据,例如部分和。
36.层的数据张量(输入、输出和中间值)可以是3个维度的,其中前二个维度可以被解释为编码空间位置,第三个维度可以被解释为编码不同特征。例如,当数据张量表示彩色图像时,前二个维度编码图像内的垂直和水平坐标,并且第三个维度编码每个位置处的颜色。
输入数据张量x的每个元素可以通过单独的权重连接到每个神经元,因此权重张量w通常具有6个维度,将输入数据张量的3个维度(输入行a、输入列b、输入特征c)与输出数据张量的3个维度(输出行i、输出列j、输出特征k)连接。中间数据张量z具有与输出数据张量y相同的形状。参数张量v将3个输出数据张量y维度与对激活函数σ的参数编索引的附加维度o连接起来。在一些实施例中,激活函数σ不需要附加参数,在这种情况下,附加维度o是不必要的。然而,在一些实施例中,激活函数σ需要至少一个附加参数,其出现在维度中o。
37.层的输出数据张量y的元素可以如等式1中那样计算,其中神经元激活函数σ由激活函数参数v[i,j,k,:]的向量配置,并且权重和z[i,j,k]可以如等式2中那样计算。
[0038]
y[i,j,k]=σ(v[i,j,k,:];z[i,j,k])
[0039]
等式1
[0040][0041]
为了简化符号,等式2中的权重和可以被称为输出,其等效于使用线性激活函数y[i,j,k]=σ(z[i,j,k])=z[i,j,k],应当理解,当使用不同的激活函数时,相同的陈述适用而不失一般性。
[0042]
在各种实施例中,如上所述的输出数据张量的计算被分解成较小的问题。然后,可以在一个或多个神经核心上,或者在常规多核系统的一个或多个核心上并行地求解每个问题。
[0043]
从以上所述可以明显看出,神经网络是并行结构。给定的层中的神经元接收从一个或多个层或其他输入具有的元素xi的输入x。每个神经元基于输入和具有元素wi的权重w来计算其状态y∈y。在各种实施例中,通过偏置b来调整输入的权重和,且接着将结果传递到非线性f(
·
)。例如,单个神经元激活可以表示为y=f(b+∑xiwi
)

[0044]
因为给定层中的所有神经元都从相同层接收输入并且独立地计算它们的输出,所以神经元激活可以被并行地计算。由于总体神经网络的这个方面,在并行分布的核中执行计算加速了总体计算。此外,在每个核心向量内,可以并行计算操作。即使具有循环输入,例如当层投影回到其自身时,所有神经元仍然同时更新。实际上,循环连接被延迟以与该层的后续输入对准。
[0045]
现在参考图1,示出了根据本公开的实施方案的神经核心。神经核心100是计算输出张量的一个块的可平铺计算单元。神经核心100具有m个输入和n个输出。在各种实施例中,m=n。为了计算输出张量块,神经核心将m
×
1的输入张量块101乘以m
×
n的权重张量块102,并将乘积累加为到权重和中,该权重和被存储在1
×
n的中间张量块103中。o
×
n的参数张量块包含指定n个神经元激活函数中的每个函数的o个参数,该神经元激活函数被应用于中间张量块103以产生1
×
n的输出张量块105。
[0046]
多个神经核可以平铺在神经核阵列中。在一些实施方案中,阵列是2维的。
[0047]
神经网络模型是一组常数,其共同指定由神经网络执行的整个计算,包括神经元之间的连接图以及每个神经元的权重和激活函数参数。训练是修改神经网络模型以执行期
望的函数的过程。推断是将神经网络应用于输入以产生输出而不修改神经网络模型的过程。
[0048]
推理处理单元是执行神经网络推理的一类处理器。神经推理芯片是推理处理单元的特定物理实例。
[0049]
参考图2,根据本公开的实施例示出了示例性推理处理单元(ipu)。ipu 200包括用于神经网络模型的存储器201。如上所述,神经网络模型可包括要计算的神经网络的突触权重。ipu 200包括可以是暂态的激活存储器202。激活存储器202可以被划分成输入和输出区域,并且存储神经元激活以供处理。ipu 200包括神经计算单元203,其加载有来自模型存储器201的神经网络模型。在每个计算步骤之前从激活存储器202提供输入激活。来自神经计算单元203的输出被写回到激活存储器202,以在同一或另一神经计算单元上处理。
[0050]
在各种实施例中,微引擎204被包括在ipu 200中。在这样的实施例中,ipu中的所有操作都由微引擎指导。如下所述,在各种实施方案中可以提供中央和/或分布式微引擎。全局微引擎可被称为芯片微引擎,而局部微引擎可被称为核心微引擎或局部控制器。在各种实施例中,微引擎包括一个或多个微引擎、微控制器、状态机、cpu或其他控制器。
[0051]
参考图3,示出了根据本公开的实施例的多核推理处理单元(ipu)。ipu 300包括用于神经网络模型和指令的存储器301。在一些实施例中,存储器301被划分成权重部分311和指令部分312。如上所述,神经网络模型可包括要计算的神经网络的突触权重。ipu 300包括可以是瞬时的激活存储器302。激活存储器302可以被划分成输入和输出区域,并且存储神经元激活以供处理。
[0052]
ipu 300包括神经核心303的阵列306。每个核心303包括计算单元333,其加载有来自模型存储器301的神经网络模型,并且可操作以执行向量计算。每个核还包括本地激活存储器332。在每个计算步骤之前从本地激活存储器332提供输入激活。来自计算单元333的输出被写回到激活存储器332以便在同一或另一计算单元上处理。
[0053]
ipu 300包括一个或多个片上网络(noc)305。在一些实施例中,部分和noc 351与核303互连并在它们之间传输部分和。在一些实施例中,单独的参数分布noc 352将核303连接到存储器301,以用于将权重和指令分布到核303。应理解,noc 351和352的各种配置适用于根据本公开的使用。例如,可以使用广播网络、行广播网络、树形网络和交换网络。
[0054]
在各种实施方案中,全局微引擎304被包括在ipu 300中。在各种实施例中,本地核心控制器334被包括在每个核心303上。在这样的实施例中,全局微引擎(芯片微引擎)和局部核心控制器(核心微引擎)协作地指导操作。具体地,在361,通过全局微引擎304将计算指令从模型存储器301的指令部分312加载到每个核303上的核控制器334。在362,参数(例如,神经网络/突触权重)被全局微引擎304从模型存储器301的权重部分311加载到每个核303上的神经计算单元333。在363,通过本地核心控制器334,将神经网络激活数据从激活本地激活存储器332加载到每个核心303上的神经计算单元333。如上所述,激活被提供给由模型定义的特定神经网络的神经元,并且可以源自相同或另一神经计算单元,或者源自系统外部。在364,神经计算单元333执行该计算以生成如由本地核控制器334指导的输出神经元激活。具体地,该计算包括将输入突触权重应用于输入激活。应当理解,各种方法可用于执行这种计算,包括硅内枝晶(in silico dendrite)以及向量乘法单元。在365,计算结果按照本地核心控制器334的指示存储在本地激活存储器332中。如上所述,这些阶段可以是流水
线的,以便在每个核上提供神经计算单元的有效使用。还应当理解,根据给定神经网络的要求,输入和输出可以从局部激活存储器332传输到全局激活存储器302。
[0055]
因此,本公开提供了推理处理单元(ipu)中的操作的运行时控制。在一些实施方案中,微引擎是集中式的(单个微引擎)。在一些实施例中,ipu计算是分布式的(由核心阵列执行)。在一些实施方案中,操作的运行时间控制是分级的——中央微引擎和分布式微引擎都参与。
[0056]
微引擎或多个微引擎指导ipu中所有操作的执行。每个微引擎指令对应于几个子操作(例如,地址生成、加载、计算、存储等),核心微代码在核心微引擎(例如,334)上运行。在本地计算的情况下,核微码包括执行完整的单张量操作的指令。例如权重张量和数据张量之间的卷积。在分布式计算的情况下,核微代码包括对本地存储的数据张量(和部分和)的子集执行单个张量运算的指令。芯片微码在芯片微引擎(例如304)上运行。微代码包括执行神经网络中的所有张量运算的指令。
[0057]
现在参考图4,根据本公开的实施例示出了示例性神经核心和相关联的网络。可以如参考图1所述的方式实现的核401通过网络402

404与附加核相互连接。在该实施例中,网络402负责分发权重和/或指令,网络403负责分发部分,并且网络404负责分发激活。然而,将理解,本公开的各种实施例可以组合这些网络,或者进一步将它们分离成多个附加网络。
[0058]
输入激活(x)经由激活网络404从核外分发到激活存储器405的核401。层指令从核外经由权重/指令网络402到指令存储器406被分发到核401。层权重(w)和/或参数经由权重/指令网络402从核外分发到权重存储器407和/或参数存储器408到核401。
[0059]
权重矩阵(w)由向量矩阵乘法(vmm)单元409从权重存储器407中读取。激活向量(v)由向量矩阵乘法(vmm)单元409从激活存储器405中读取。然后,向量矩阵乘法(vmm)单元409计算向量矩阵乘法并将结果提供给向量-向量单元410。向量-向量单元410从部分和存储器411读取附加的部分,并通过部分和网络403从核外接收附加的部分和。向量-向量单元410从这些源部分和中计算向量-向量运算。例如,可以依次对各个部分和求和。将所得到的目标部分和写入部分和存储器411,经由部分和网络403发送到核心外,和/或反馈以供向量-向量单元410进一步处理。
[0060]
在针对给定层的输入的所有计算完成之后,来自向量-向量单元410的部分和结果被提供给激活单元412以用于输出激活的计算。激活向量(y)被写入激活存储器405。层激活(包括写入激活存储器的结果)经由激活网络404从激活存储器405跨核重新分布。在接收时,将它们写入到每个接收核的本地激活存储器。在完成对给定帧的处理时,从激活存储器405读取输出激活,并经由网络404将其发送到核外。
[0061]
因此,在操作中,核心控制微引擎(例如413)协调核心的数据移动和计算。微引擎发出读取激活存储器地址操作,以将输入激活块加载到向量矩阵乘法单元中。微引擎发出读取权重存储器地址操作,以将权重块加载到向量矩阵乘法单元中。微引擎向向量-矩阵乘法单元发出计算操作,使得向量-矩阵乘法单元计算部分和块。
[0062]
微引擎发出部分和读/写存储器地址操作、向量计算操作或部分和通信操作中的一个或多个,以便进行以下操作中的一个或多个:从部分和源读取部分和数据;使用部分和算术单元计算;或将部分和数据写入部分和目标。将部分和数据写入部分和目标可以包括
经由部分和网络接口与核心外部通信,或者将部分和数据发送到激活运算单元。
[0063]
微引擎发出激活函数计算操作,使得激活函数运算单元计算输出激活块。微引擎发出写激活存储器地址,输出激活块通过激活存储器接口被写入激活存储器。
[0064]
因此,为给定核定义了各种源、目标、地址类型、计算类型和控制组件。
[0065]
向量-向量单元410的源包括向量矩阵乘法(vmm)单元409、来自参数存储器408的常数、部分和存储器411、来自先前周期的部分和结果(tgt部分和);以及部分和网络403。
[0066]
向量-向量单元410的目标包括部分和存储器411、后续周期的部分和结果(src部分和)、激活单元412和部分和网络403。
[0067]
因此,给定指令可以从激活存储器405读取或写入、从权重存储器407读取或从部分和存储器411读取或写入。由核执行的计算操作包括vmm单元409的向量矩阵乘法、向量-向量单元410的向量(部分和)操作以及激活单元412的激活功能。
[0068]
控制操作包括更新程序计数器和循环和/或顺序计数器。
[0069]
因此,存储器操作被发出以从权重存储器中的地址读取权重,从参数存储器中的地址读取参数,从激活存储器中的地址读取激活,以及向部分和存储器中的地址读取/写入部分和。计算操作被发出以执行向量-矩阵乘法、向量-向量操作和激活函数。通信操作被发出以选择向量-向量操作数、在部分和网络上路由消息、以及选择部分和目标。通过指定微引擎中的程序计数器、循环计数器和顺序计数器的控制操作来控制跨层循环输出和跨层循环输入。
[0070]
可以理解,为了适应各种程序结构,提供能够对嵌套循环进行有效程序控制的微引擎是有利的。因此,以下讨论提供了合适的微引擎的各种示例性实施例。
[0071]
现在参考图5,提供了示例性循环502,其是可以多次重复(或“迭代”)执行指令集(也称为循环的“主体”)的程序控制结构。图5中还示出了示例性嵌套循环504,例如,当(内)循环被封套在另一(外)循环中时。在一些实施例中,嵌套循环可被表示为树506,其中每一循环(“循环j”和“循环k”)是节点,且其父(“循环i”)是其被封套在其中的最内循环。
[0072]
循环是所有现代计算机的核心控制结构,并且是几乎任何算法的主要部分。特别地,机器学习应用和深度卷积神经网络需要执行大量的算术运算。这些由包含许多嵌套循环(在一些实施例中,循环嵌套可以是10至16个循环深度)的复杂代码结构控制。循环本身的开销是最重要的。实际上,可能比它驱动的实际算术花费更多的计算周期,因此显著地减少算术处理利用,增加功率并降低性能。例如,在simd架构中,利用率是关键因素,由于丢失与并行simd操作/周期的数量相乘,因此程序控制上的每个丢失周期都转化为计算的显著丢失。因此,需要用于中央处理单元(cpu)和包括图形处理单元(gpu)、现场可编程门阵列(fpga)和其它专用处理器的其它处理单元的非常有效的循环控制方法和系统,这是由本文所揭示的主题的需要。在一些实施例中,所公开的系统可以用于各种处理器和控制器中,包括但不限于cpu、gpu、fpga、神经形态处理器、卷积处理单元、推理引擎、张量处理单元等。
[0073]
可以使用条件分支在软件中实现循环,图6中呈现了示例,其中循环索引或循环迭代器由“i”表示。在代码块602中示出了示例性循环,并且在代码块604中示出了示例性条件分支。当循环被嵌套时,如代码块702中所示,终止条件的评估可以变为串行化。在图7所示的示例中,每当“l2”结束时,如代码块704所示,递增“i”并评估“l1”的条件。因此,在对循环体的每次评估之前评估一个或两个循环条件。根据本公开的一个方面,利用率可以表示用
于处理主体指令的周期数与总周期数(包括循环初始化和分支)之间的比率。通常,使用越多的嵌套循环,需要评估的条件就越多,从而降低了利用率。在一些实施例中,可以在循环主体之前或之后测试在循环内实现的条件。图8中描述了这样的例子,其中循环重复直到满足其终止条件,并且必须在每次迭代之前或之后评估终止,如代码块802中所示。如果在执行主体之前检查终止条件,则可以执行循环0次或更多次。如果在主体被执行之后检查终止条件,则循环可以被执行1次或更多次,如代码块804中所示。
[0074]
图9描绘示例性cpu循环指令集,其被编译为汇编代码(例如,使用ibm的power处理器),包含外部“for”循环906、内部“for”循环904和乘法-加法运算902。更新循环计数器和检查循环条件花费一个或多个周期,并且多个嵌套循环的检查条件是从最内循环向外顺序进行的。因此,嵌套的循环越多,更新循环所花费的时间就越多,从而降低了利用率。图10描绘另一示例性cpu循环指令集,其中乘法-加法操作1002及循环控制1004以粗体突出显示。
[0075]
图11示出示例性静态循环展开技术,其中程序员分析循环以将迭代解释为指令序列,以便减少循环开销。这种方法与由编译器执行的动态展开形成对比。所示的例子从集合中删除100个项目,这可以使用“for”循环来完成,该循环调用函数“delete(ietm_number)”。在循环的开销与“delete(x)”循环的开销相比需要大量资源的情况下,展开可被用于程序的选择部分以便更快地优化,如图所示。然而,循环展开具有某些缺点,包括增加的程序代码大小(如果循环体包括函数调用,尤其是如果内联的话,则这进一步加剧和增加)。而且,展开可能导致指令高速缓存未命中的增加,这可能不利地影响性能;除非由优化编译器透明地执行,否则代码可能变得不太可读。除了非常小和简单的代码之外,包含分支的展开循环通常较慢。因此,当使用非常大的指令字结构时,展开可能需要额外的程序高速缓存和/或程序存储器。
[0076]
图12示出了示例性循环合并技术,其中如代码块1202所示的两个(或更多个)嵌套循环被如代码块1204所示的执行相同总数的迭代的一个循环所替代。这种方法的优点是它需要较少的来自循环的开销。在每次迭代中,进行测试并将其推进一个索引,而不是测试一个或两个条件并应用一个或两个索引更新。另一方面,该方法的缺点在于,基于组合循环索引计算索引可能变得更复杂,并且可能需要模运算。当合并的循环的数量增加时,这变得更加复杂。一些硬件解决方案,包括一些cpu(例如intel 8086微处理器),具有用于使用专用寄存器/计数器来实现循环计数器的操作代码,该专用寄存器/计数器将操作(或op)的数量减少到一。然而,这些仅适用于单个循环;因此,嵌套循环需要使用其它寄存器进行一般操作。实际上,即使对于单个循环,它仍可能花费一个或两个循环来迭代,因此开销不为零。图13示出了示例性8086微处理器指令集参考。
[0077]
根据本公开的一个方面,提供了一种可配置循环控制电路,其中该电路首先被配置然后运行。循环的配置可包含循环主体代码块的迭代数目、开始程序计数器地址及结束程序计数器地址。这种可配置循环控制电路可以支持大量嵌套循环,其中示例性实施例包括支持16个嵌套循环的电路。该电路可以并行地检查所有嵌套循环条件:其中循环状态检查电路自动触发(例如,在代码中没有循环op或分支),并且在单个时钟周期内对所有循环执行所有循环状态检查和计数器更新。这可以在循环体中的最后一个指令正在被执行时执行(因此导致零开销)。
[0078]
图14-15描述了根据本公开的采用单个循环计数器的硬件中的并行循环的示例性
实施例。如图所示,代码块1402和电路1404可以结合在具有程序计数器(pc)1406的系统中,并且单个循环计数器1408以硬件实现,其中第一步骤包括将循环计数器电路配置为:
[0079]
loopcounter(beginaddr,endaddr,count)
[0080]
对于每个周期,执行由pc 1406指向的指令,并且pc可以在周期之间被更新,其更新取决于循环计数器状态。在块1403所示的实施例中,“beginaddr”和“endaddr”分别是循环体中第一和最后一个指令的pc值,count是迭代次数。循环电路接收pc值1406,控制循环计数器1408,并控制pc。在每个周期,lc可以前进、复位或什么都不做。如果pc不等于endaddress,则lc什么也不做。如果pc等于endaddress,则它将lc的当前值与(在该示例中是计数-1的值)进行比较。如果它们相等,lc将复位并且pc将前进1。如果它们不相等,lc将前进1并且pc将被设置为beginaddr。图15示出了用于描述每个周期的单个循环计数器1508的行为的表达式1505。如本文进一步详细描述的,对于嵌套循环的情况,可修改这种原理行为。
[0081]
图16示出了根据公开的主题的循环跟踪的示例性实施例。所示示例的目的是执行cmda,然后cmdb五(5)次,然后cmdc,如图所示。循环计数器电路被配置为:
[0082]
lc0=《beginaddr0=1,endadde0=1,count0=5》
[0083]
如逐周期跟踪所示,首先执行cmda,然后pc前进到1。pc在另外4个周期内保持在1,在lc前进4次的同时执行cmdb 4次以上。在第五次迭代之后,lc被复位为0,并且pc前进到2,并且执行cmdc。
[0084]
图17示出了扩展到多个循环计数器的本公开的示例性实施例。当程序中存在两个或两个以上循环时,两个循环计数器之间的交互可被分类为如下文描绘和描述的三种情况1701、1702和1703:
[0085]
1.分离循环(1701):当两个循环没有嵌套时,它们的求值在不同的周期(例如不同的pc值)执行,因此彼此独立。每个循环计数器可以由相同的系统实现为单个循环。
[0086]
2.同时结束(co-ending)嵌套循环(1702):一个循环嵌套在另一个循环之内,并且嵌套循环主体的最后指令(t1=t)也是外循环主体的最后指令(t2=t)。在这种情况下,在pc=t执行op之后,可以执行以下中的一个或多个:a)增加j,或b)复位j并增加i,或c)复位i和j两者并从嵌套循环退出。指令t处的可能替代动作的数目随着同时结束嵌套循环的数目而增加。
[0087]
3.非同时结束嵌套循环(1703):一个循环嵌套在另一个循环内,并且外循环主体在内循环主体结束之后包含至少再一个指令。类似于不相交循环,在t1、t2中的每一个处,仅存在一个需要检查和更新的循环计数器。
[0088]
这里提供的电路解决了所有三种情况。此外,本公开适用于以这三种情况的任意组合配置的任意数量的循环,包括任意数量的同时结束嵌套循环。图18示出了本公开的用于硬件中的并行循环的示例性实施例,其中嵌套的同时结束循环计数器如代码块1802和1805中所示。这里,系统实现m个循环计数器,从0到m-1枚举,它处理图17中定义的所有三种情况,即不相交循环和嵌套循环(同时结束和非同时结束)。不失一般性,假设如果lcj和lci是同时结束的,则循环lcj嵌套在循环中lci,那么j>i。图19示出了根据本公开的包括程序计数器(pc)和循环计数器(lc)图的逻辑电路的示例性实施例,在框1805中,针对从i=0到m-1的所有循环计数器独立地并行计算ei、li和ti的值,因此,通过从具有较高索引的循环计
数器(可能是内循环)聚合ti,针对每个循环计数器并行计算ai和ri的值。最后,在方框1805中,使用更新规则来更新每个循环计数器以及pc。在每个周期计算这些表达式。结果,pc将具有其用于下一周期的新值,并且每个循环计数器将维持其状态、前进或复位。这种计算可应用于任何配置的循环计数器。
[0089]
在示例性实施例中,循环计数器可以无条件地永远运行,并且被表示为无限循环并且由二进制标志指示:
[0090]
infi:如果该循环总是继续迭代,则为真而且,一个或多个lc可以在某些时间段内是不活动的。这通过有效位指示为活动循环计数器
[0091]
validi:有效位。如果该循环计数器有效则为真。
[0092]
根据本公开的一方面,可以以各种方式实现循环计数器电路。例如,代替定义有效位,可以指定counter=0的值以指示循环计数器是无效的。虽然提供了从初始值零、复位值零以及增量值一开始的循环计数器的描述,但是本领域技术人员应当清楚,循环计数器配置可以扩展到附加字段。为了说明而非限制的目的,一些示例包括指定的初始值;应用指定的增量值;根据步长值的符号和终止准则向上或向下计数。如果需要,这些加法还可以包括附加的加法器电路和带符号的比较器。此外,可以提供错误检查,并且在一些实施例中包括附加电路,该附加电路被添加以断言配置的有效性(诸如初始值应当低于count)并且用于恢复到定义的操作模式(诸如用零替换无效初始值)和/或生成错误信号。
[0093]
图20描述了包括上述标志的循环计数器定义的示例性实施例。如图所示,循环计数器(lc)定义包括有效位和无限位。同样根据本公开,针对有限和无限循环的循环行为可以如下:
[0094]
设置lci=《beginaddri,endaddri,counti,onetimeinitialvaluei,validi,infi》
[0095]
针对有限循环计数器操作,它被执行counti次。特别是,
[0096]-counti=0的循环计数器被禁用
[0097]-counti=1的循环计数器被执行一次且永不前进
[0098]-counti>1的循环计数器执行counti次并前进counti次对于无限循环计数器操作,循环行为如下:
[0099]

如果lci被设置为无限循环,则总是li=0(这意味着它永远不会到达其最后一次迭代)。因此,它永远不能复位。
[0100]

当需要前进时,设置ai=1。
[0101]

然而,即使ai=1,无限循环计数器也不会递增其计数。它将总是保持为0。
[0102]
对于无限循环计数器使用,循环行为如下:
[0103]

无限循环可以是外部的最外循环。另外或备选地,其可与嵌套在其中的内部循环同时结束。
[0104]

根据定义,由于无限循环从不复位,无限循环外部的任何同时结束循环将从不前进也不复位。
[0105]

无限循环类似于“转到(goto)”。最简单的情况是当它不与任何其它循环同时结束时。然后,每当pc到达endaddri时,它将跳转到beginaddri。当它确实包含同时结束的内循环时,跳转将仅在所有内循环已经完成之后发生。
[0106]
图21示出了根据本公开的不具有程序计数器的并行循环的示例性实施例。方框
2102中描述的代码和2104中示出的电路的优点在于,所有嵌套循环计数器共享相同的循环体,从而提供了不需要程序计数器的简化的最小实现方式。例如,嵌套循环的主体是一个指令(或一个函数调用)。在循环体的每次执行时,更新循环计数器。这里的系统用于从0到m-1编号的m个循环计数器,lci表示第i个循环计数器。不失一般性,假设如果lcj和lci是同时结束的,并且循环lcj嵌套在循环lci中,那么j>i。lci在每个循环体执行时计算触发器,如块2106所示。
[0107]
图22根据本公开示出了并行循环和cpu循环的比较,示出了并行循环2202和cpu循环2204的示例性代码块。并行循环2202呈现了各种属性,包括:
[0108]

可以在专用硬件中预配置
[0109]

基于pc地址
[0110]

用于循环迭代更新的零循环开销
[0111]

可同时更新多个同时结束的嵌套循环(同时保持零开销)
[0112]

独立于嵌套循环的数目和循环长度而100%利用计算周期
[0113]

当前具体实施细节:
[0114]

被执行一次或多次
[0115]

在递增之前检查退出条件(因此在最后一次迭代之后没有计数器递增)
[0116]

限于可用lc电路的嵌套循环的数量(例如,16个循环计数器)相反,cpu循环2204包括以下属性:
[0117]

编程的,是存储器中操作码的一部分
[0118]

灵活的数据驱动循环条件
[0119]

用于循环迭代更新的1-5个周期的开销
[0120]

同时结束嵌套循环被顺序更新(所有更新循环开销的总,不是恒定的)
[0121]

随着嵌套循环的数目增加,利用率降低,尤其是对于短循环
[0122]

实施细节:
[0123]

被执行一次或多次
[0124]

计数器在检查退出条件之前递增(计数器在最后一次迭代之后再递增一次)
[0125]

无限数目的嵌套循环
[0126]
图23示出了根据本公开的循环重新配置的示例性实施例。如图所示,在一些实施例中,当前不在计数的循环计数器(即,程序计数器不在其循环体内)可被重新配置成在程序的不同部分实现其它循环。例如,码块2302具有三个环,其中a和c分别是第一和第二嵌套循环的主体。如代码块2304所示,通过重新配置第二循环计数器以在pc=1上循环n次迭代,并且然后重新配置第二循环计数器以在pc=4上循环k次迭代,仅使用两个循环计数器便可以实现代码。针对循环j的每次迭代,重新配置都花费时间。在一些实施例中,可以与执行诸如指令b和指令d的指令并行地进行重新配置,以减少时间。
[0127]
参考图24,示出了用于计算神经激活的方法。在2401处,根据程序配置来配置控制器,所述程序配置包括至少一个内循环和至少一个外循环。在2402,至少一个算术计算单元根据程序配置执行多个操作。在2403处,控制器维护至少第一循环计数器和第二循环计数器,第一循环计数器被配置为对所述至少一个外循环的所执行迭代的数目进行计数,且第二循环计数器被配置为对所述至少一个内循环的所执行迭代的数目进行计数。在2404处,
控制器提供第一循环计数器是否对应于最后迭代的第一指示及第二循环计数器是否对应于最后迭代的第二指示。在2405处,根据第一和第二指示交替地递增、复位或维护第二循环计数器。
[0128]
现在参考图25,示出了计算节点的示例的示意图。计算节点10仅是合适的计算节点的一个示例,并且不旨在对本文描述的实施例的使用范围或功能提出任何限制。无论如何,计算节点10能够被实现和/或执行上文阐述的任何功能。
[0129]
在计算节点10中,存在计算机系统/服务器12,其可与许多其它通用或专用计算系统环境或配置一起操作。适合与计算机系统/服务器12一起使用的公知的计算系统、环境和/或配置的示例包括但不限于个人计算机系统、服务器计算机系统、瘦客户端、胖客户端、手持式或膝上型设备、多处理器系统、基于微处理器的系统、机顶盒、可编程消费电子产品、网络pc、小型计算机系统、大型计算机系统、以及包括任何上述系统或设备的分布式云计算环境等。
[0130]
计算机系统/服务器12可以在计算机系统可执行指令的一般上下文中描述,诸如由计算机系统执行的程序模块。通常,程序模块可以包括执行特定任务或实现特定抽象数据类型的例程、程序、对象、组件、逻辑、数据结构等。计算机系统/服务器12可以在分布式云计算环境中实践,其中任务由通过通信网络链接的远程处理设备执行。在分布式云计算环境中,程序模块可以位于包括存储器存储设备的本地和远程计算机系统存储介质中。
[0131]
如图25所示,计算节点10中的计算机系统/服务器12以通用计算设备的形式示出。计算机系统/服务器12的组件可以包括但不限于一个或多个处理器或处理单元16、系统存储器28以及将包括系统存储器28的各种系统组件耦合到处理器16的总线18。
[0132]
总线18表示若干类型的总线结构中的任何一种的一个或多个,包括存储器总线或存储器控制器、外围总线、加速图形端口、以及使用各种总线体系结构中的任何一种的处理器或局部总线。作为示例而非限制,这些体系结构包括工业标准体系结构(isa)总线、微通道体系结构(mca)总线、增强型isa(eisa)总线、视频电子技术标准协会(vesa)局部总线、外围部件互连(pci)总线、外围部件互连快速(pcie)和高级微控制器总线体系结构(amba)。
[0133]
在各种实施例中,一个或多个推理处理单元(未示出)被耦合到总线18.在这样的实施例中,ipu可以经由总线18从存储器28接收数据或向其写入数据。同样,ipu可以经由总线18与其它组件交互,如这里所描述的。
[0134]
计算机系统/服务器12通常包括各种计算机系统可读介质。这样的介质可以是计算机系统/服务器12可访问的任何可用介质,并且它包括易失性和非易失性介质、可移动和不可移动介质。
[0135]
系统存储器28可以包括易失性存储器形式的计算机系统可读介质,例如随机存取存储器(ram)30和/或高速缓冲存储器32。计算机系统/服务器12还可以包括其他可移动/不可移动、易失性/非易失性计算机系统存储介质。仅作为示例,存储系统34可被提供用于从不可移动、非易失性磁介质(未示出,并且通常被称为“硬盘驱动器”)读取和向其写入。尽管未示出,但是可以提供用于从可移动、非易失性磁盘(例如,“软盘”)读取和向其写入的磁盘驱动器,以及用于从诸如cd-rom、dvd-rom或其它光学介质等可移动、非易失性光盘读取或向其写入的光盘驱动器。在这种情况下,每个都可以通过一个或多个数据介质接口连接到总线18。如下文将进一步描绘及描述,存储器28可包含具有被配置为执行本公开的实施例
的功能的一组(例如,至少一个)程序模块的至少一个程序产品。
[0136]
具有一组(至少一个)程序模块42的程序/实用程序40,以及操作系统、一个或多个应用程序、其它程序模块和程序数据,可作为示例而非限制存储在存储器28中。操作系统、一个或多个应用程序、其它程序模块和程序数据或其某种组合中的每一个可包括联网环境的实现。程序模块42通常执行这里描述的实施例的功能和/或方法。
[0137]
计算机系统/服务器12还可以与一个或多个外部设备14通信,诸如键盘、指示设备、显示器24等;一个或多个设备,其使得用户能够与计算机系统/服务器12交互;和/或任何使计算机系统/服务器12能够与一个或多个其它计算设备通信的设备(例如网卡、调制解调器等)。这种通信可以经由输入/输出(i/o)接口22发生,然而,计算机系统/服务器12可以经由网络适配器20与一个或多个网络通信,所述网络诸如局域网(lan)、通用广域网(wan)和/或公共网络(例如,因特网)。如图所示,网络适配器20通过总线18与计算机系统/服务器12的其它组件通信,应当理解,尽管未示出,其它硬件和/或软件组件可以与计算机系统/服务器12结合使用,示例包括但不限于:微码、设备驱动程序、冗余处理单元、外部磁盘驱动器阵列、raid系统、磁带驱动器和数据档案存储系统等。
[0138]
本公开可以被实现为系统、方法和/或计算机程序产品。计算机程序产品可以包括其上具有计算机可读程序指令的计算机可读存储介质(或多个介质),所述计算机可读程序指令用于使处理器执行本公开的方面。
[0139]
计算机可读存储介质可以是能够保留和存储由指令执行设备使用的指令的有形设备。计算机可读存储介质可以是例如但不限于电子存储设备、磁存储设备、光存储设备、电磁存储设备、半导体存储设备或前述的任何合适的组合。计算机可读存储介质的更具体示例的非穷举列表包括以下:便携式计算机磁盘、硬盘、随机存取存储器(ram)、只读存储器(rom)、可擦除可编程只读存储器(eprom或闪存)、静态随机存取存储器(sram)、便携式光盘只读存储器(cd-rom)、数字多功能盘(dvd)、记忆棒、软盘、诸如上面记录有指令的打孔卡或凹槽中的凸起结构的机械编码装置,以及上述的任何适当组合。如本文所使用的计算机可读存储介质不应被解释为暂时性信号本身,诸如无线电波或其他自由传播的电磁波、通过波导或其他传输介质传播的电磁波(例如,通过光纤线缆的光脉冲)、或通过导线传输的电信号。
[0140]
本文描述的计算机可读程序指令可以从计算机可读存储介质下载到相应的计算/处理设备,或者经由网络,例如因特网、局域网、广域网和/或无线网络,下载到外部计算机或外部存储设备。网络可以包括铜传输电缆、光传输光纤、无线传输、路由器、防火墙、交换机、网关计算机和/或边缘服务器。每个计算/处理设备中的网络适配卡或网络接口从网络接收计算机可读程序指令,并转发计算机可读程序指令以存储在相应计算/处理设备内的计算机可读存储介质中。
[0141]
用于执行本公开的操作的计算机可读程序指令可以是汇编指令、指令集架构(isa)指令、机器相关指令、微代码、固件指令、状态设置数据、或者以一种或多种编程语言的任意组合编写的源代码或目标代码,所述编程语言包括面向对象的编程语言(例如smalltalk、c++等)以及常规的过程式编程语言(例如“c”编程语言或类似的编程语言)。计算机可读程序指令可以完全在用户的计算机上执行,部分在用户的计算机上执行,作为独立的软件包执行,部分在用户的计算机上并且部分在远程计算机上执行,或者完全在远程
计算机或服务器上执行。在后一种情况下,远程计算机可以通过任何类型的网络连接到用户的计算机,包括局域网(lan)或广域网(wan),或者可以连接到外部计算机(例如,使用因特网服务提供商通过因特网)。在一些实施例中,包括例如可编程逻辑电路、现场可编程门阵列(fpga)或可编程逻辑阵列(pla)的电子电路可以通过利用计算机可读程序指令的状态信息来执行计算机可读程序指令以使电子电路个性化,以便执行本公开的方面。
[0142]
本文参考根据本公开的实施例的方法、装置(系统)和计算机程序产品的流程图图示和/或框图来描述本公开的方面。将理解,流程图和/或框图的每个框以及流程图和/或框图中的框的组合可以由计算机可读程序指令来实现。
[0143]
这些计算机可读程序指令可以被提供给通用计算机、专用计算机或其他可编程数据处理装置的处理器以产生机器,使得经由计算机或其他可编程数据处理装置的处理器执行的指令创建用于实现流程图和/或框图的一个或多个框中指定的功能/动作的装置。这些计算机可读程序指令还可以存储在计算机可读存储介质中,其可以引导计算机、可编程数据处理装置和/或其他设备以特定方式工作,使得其中存储有指令的计算机可读存储介质包括制品,该制品包括实现流程图和/或框图的一个或多个框中指定的功能/动作的各方面的指令。
[0144]
计算机可读程序指令还可以被加载到计算机、其他可编程数据处理装置或其他设备上,以使得在计算机、其他可编程装置或其他设备上执行一系列操作步骤,以产生计算机实现的过程,使得在计算机、其他可编程装置或其他设备上执行的指令实现流程图和/或框图的一个或多个框中指定的功能/动作。
[0145]
附图中的流程图和框图示出了根据本公开的各种实施例的系统、方法和计算机程序产品的可能实现的架构、功能和操作。在这点上,流程图或框图中的每个框可以表示指令的模块、段或部分,其包括用于实现指定的逻辑功能的一个或多个可执行指令。在一些替代实施方案中,框中所提及的功能可不按图中所提及的次序发生。例如,连续示出的两个框实际上可以基本上同时执行,或者这些框有时可以以相反的顺序执行,这取决于所涉及的功能。还将注意,框图和/或流程图图示的每个框以及框图和/或流程图图示中的框的组合可以由执行指定功能或动作或执行专用硬件和计算机指令的组合的专用的基于硬件的系统来实现。
[0146]
已经出于说明的目的呈现了对本公开的各种实施例的描述,但是其并非旨在是穷举的或限于所公开的实施例。在不背离所描述的实施例的范围和精神的情况下,许多修改和变化对于本领域的普通技术人员将是显而易见的。选择本文所使用的术语以最好地解释实施例的原理、实际应用或对市场上存在的技术改进,或使本领域的其他普通技术人员能够理解本文所公开的实施例。
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1